Obie.
Testy deterministyczne i niedeterministyczne mają różne przypadki użycia i różne wartości w zależności od pakietu. Ogólnie niedeterministyczny nie może zapewnić takiej samej precyzji jak test deterministyczny, który powoli przerodził się w „testowanie niedeterministyczne nie przynosi żadnej wartości”. To nieprawda. Mogą być mniej precyzyjne, ale mogą być również znacznie szersze, co ma swoje zalety.
Weźmy przykład: piszesz funkcję, która sortuje listę liczb całkowitych. Jakie przydatne byłyby niektóre deterministyczne testy jednostkowe?
- Pusta lista
- Lista zawierająca tylko jeden element
- Lista zawierająca wszystkie te same elementy
- Lista z wieloma unikalnymi elementami
- Lista z wieloma elementami, z których niektóre są duplikatami
- Lista z
NaN
, INT_MIN
iINT_MAX
- Lista, która jest już częściowo posortowana
- Lista zawierająca 10 000 000 elementów
A to tylko funkcja sortowania! Jasne, możesz argumentować, że niektóre z nich są niepotrzebne lub że niektóre z nich można wykluczyć za pomocą nieformalnego uzasadnienia. Ale jesteśmy inżynierami i widzieliśmy nieformalne rozumowanie wysadzone w naszą twarz. Wiemy, że nie jesteśmy wystarczająco inteligentni, aby całkowicie zrozumieć systemy, które zbudowaliśmy, lub w pełni utrzymać złożoność w naszych głowach. Dlatego w pierwszej kolejności piszemy testy. Dodanie niedeterministycznych testów mówi po prostu, że niekoniecznie jesteśmy wystarczająco bystrzy, aby z góry poznać wszystkie dobre testy. Rzucając pół losowe dane do swojej funkcji, znacznie łatwiej znajdziesz przypadek, który przegapiłeś.
Oczywiście nie wyklucza to również testów deterministycznych. Testy niedeterministyczne pomagają znaleźć błędy w ogromnych obszarach programu. Jednak po znalezieniu błędów potrzebujesz powtarzalnego sposobu, aby pokazać, że je naprawiłeś. Więc:
- Użyj niedeterministycznych testów, aby znaleźć błędy w kodzie.
- Użyj testów deterministycznych, aby zweryfikować poprawki w kodzie.
Zauważ, że oznacza to wiele solidnych porad na temat testów jednostkowych niekoniecznie dotyczy testów niedeterministycznych. Na przykład, że muszą być szybkie. Niskopoziomowe testy właściwości powinny być szybkie, ale niedeterministyczny test, taki jak „symuluj użytkownika losowo klikającego przyciski w witrynie i upewnij się, że nigdy nie pojawi się błąd 500”, powinien sprzyjać kompleksowości zamiast szybkości. Po prostu wykonaj taki test, który uruchamia się niezależnie od procesu kompilacji, aby nie spowalniał rozwoju. Na przykład uruchom go na swoim prywatnym polu testowym.