Aserty są przydatne do informowania o wewnętrznym stanie programu . Na przykład, że twoje struktury danych mają prawidłowy stan, np. Że Time
struktura danych nie przechowuje wartości 25:61:61
. Warunki sprawdzane przez stwierdzenia to:
Warunki wstępne, które gwarantują, że dzwoniący dotrzyma umowy,
Warunki dodatkowe, które gwarantują, że odbiorca dotrzymuje kontraktu, oraz
Niezmienniki, które zapewniają, że struktura danych zawsze ma pewną właściwość po powrocie funkcji. Niezmiennik jest warunkiem, który jest warunkiem wstępnym i wtórnym.
Testy jednostkowe są przydatne, aby poinformować Cię o zewnętrznym zachowaniu modułu . Możesz Stack
mieć spójny stan po push()
wywołaniu metody, ale jeśli rozmiar stosu nie wzrośnie o trzy po wywołaniu trzykrotnie, to jest to błąd. (Na przykład trywialny przypadek, w którym niepoprawna push()
implementacja sprawdza tylko twierdzenia i kończy działanie).
Ściśle mówiąc, główna różnica między asertami a testami jednostkowymi polega na tym, że testy jednostkowe zawierają dane testowe (wartości umożliwiające uruchomienie programu), podczas gdy twierdzenia nie. Oznacza to, że możesz wykonać testy jednostkowe automatycznie, podczas gdy nie możesz powiedzieć tego samego o twierdzeniach. Na potrzeby tej dyskusji założyłem, że mówisz o wykonywaniu programu w kontekście testów funkcji wyższego rzędu (które wykonują cały program i nie sterują modułami jak testy jednostkowe). Jeśli nie mówimy o automatycznych testach funkcji jako sposobie „zobaczenia rzeczywistych danych wejściowych”, to oczywiście wartość leży w automatyzacji, a zatem testy jednostkowe by wygrały. Jeśli mówisz o tym w kontekście (automatycznych) testów funkcji, zobacz poniżej.
Testowane elementy mogą się pokrywać. Na przykład Stack
warunek końcowy może faktycznie twierdzić, że rozmiar stosu wzrasta o jeden. Są jednak granice tego, co można wykonać w tym stwierdzeniu: czy powinno to również sprawdzić, czy element górny jest właśnie dodany?
W obu przypadkach celem jest poprawa jakości. W przypadku testów jednostkowych celem jest znalezienie błędów. W przypadku stwierdzeń celem jest ułatwienie debugowania poprzez obserwowanie niepoprawnych stanów programu natychmiast po ich wystąpieniu.
Zauważ, że żadna technika nie weryfikuje poprawności. W rzeczywistości, jeśli przeprowadzisz testy jednostkowe w celu sprawdzenia, czy program jest poprawny, prawdopodobnie opracujesz nieciekawy test, o którym wiesz, że zadziała. To efekt psychologiczny: zrobisz wszystko, aby osiągnąć swój cel. Jeśli Twoim celem jest znalezienie błędów, twoje działania to odzwierciedlą.
Oba są ważne i mają swoje własne cele.
[Jako ostatnia uwaga na temat twierdzeń: Aby uzyskać jak największą wartość, musisz używać ich we wszystkich krytycznych punktach programu, a nie kilku kluczowych funkcjach. W przeciwnym razie pierwotne źródło problemu mogło zostać zamaskowane i trudne do wykrycia bez wielu godzin debugowania.]
:-)