Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Pisanie automatycznych testów

W swoim eseju „Skromny programista” z 1972 roku, Edsger W. Dijkstra powiedział, że „testowanie programu może być bardzo efektywnym sposobem na wykazanie obecności błędów, ale jest beznadziejnie niewystarczające do wykazania ich braku”. To nie znaczy, że nie powinniśmy próbować testować jak najwięcej!

Poprawność w naszych programach to zakres, w jakim nasz kod robi to, co zamierzamy. Rust został zaprojektowany z dużą troską o poprawność programów, ale poprawność jest złożona i niełatwa do udowodnienia. System typów Rust bierze na siebie dużą część tego ciężaru, ale system typów nie jest w stanie wyłapać wszystkiego. W związku z tym Rust zawiera wsparcie dla pisania automatycznych testów oprogramowania.

Powiedzmy, że piszemy funkcję add_two, która dodaje 2 do dowolnej liczby przekazanej do niej. Sygnatura tej funkcji akceptuje liczbę całkowitą jako parametr i zwraca liczbę całkowitą jako wynik. Kiedy implementujemy i kompilujemy tę funkcję, Rust wykonuje wszystkie sprawdzanie typów i sprawdzanie pożyczeń, o których uczyłeś się do tej pory, aby zapewnić, że na przykład nie przekazujemy wartości String ani nieprawidłowej referencji do tej funkcji. Ale Rust nie jest w stanie sprawdzić, czy ta funkcja zrobi dokładnie to, co zamierzamy, czyli zwróci parametr plus 2, a nie na przykład parametr plus 10 lub parametr minus 50! Właśnie tutaj wchodzą testy.

Możemy pisać testy, które potwierdzają, na przykład, że gdy przekazujemy 3 do funkcji add_two, zwrócona wartość to 5. Możemy uruchamiać te testy za każdym razem, gdy wprowadzamy zmiany w naszym kodzie, aby upewnić się, że istniejące prawidłowe zachowanie nie uległo zmianie.

Testowanie to złożona umiejętność: Chociaż w jednym rozdziale nie możemy omówić każdego szczegółu dotyczącego tego, jak pisać dobre testy, w tym rozdziale omówimy mechanikę funkcji testowych Rust. Porozmawiamy o dostępnych adnotacjach i makrach podczas pisania testów, domyślnym zachowaniu i opcjach dostępnych do uruchamiania testów oraz o tym, jak organizować testy w testy jednostkowe i testy integracyjne.