Ostatnio natknąłem się na nowo napisany kod, który był przeplatany dużą ilością Debug.Assert (C #).
Czy powinniśmy nadal używać tego na szeroką skalę, pomimo ogólnego stosowania TDD, BDD i testów jednostkowych?
unit-testing
assertions
Dominik Fretz
źródło
źródło
Odpowiedzi:
Nie widzę powodu, dla którego nie powinieneś używać Assert. Czyniąc to, już uznałeś potrzebę ochrony, takiej jak warunki wstępne i niezmienniki, i robisz krok w kierunku projektowania według umowy . Assert to tylko jeden ze sposobów na osiągnięcie tego ...
Wszystkie są sposobami na osiągnięcie tego samego: niezawodność kodu. Sprowadza się to tylko do wyboru opcji, z których Assert jest prawidłowym wyborem.
Zauważ, że jak dotąd nie wspominałem o testach jednostkowych, ponieważ osiągają one coś zupełnie innego. Test jednostkowy formalnie potwierdza solidność kodu, wykonując osłonę:
To zupełnie inny rodzaj twierdzeń ...
** Należy pamiętać, że w niektórych środowiskach testowanie jednostkowe pod kątem niepowodzenia asercji jest dość trudne, ponieważ awaria asercji może skrócić cały czas działania, więc jedna z pozostałych opcji może być preferowana ... *
źródło
Uważam twierdzenia i testy jednostkowe za dwa różne narzędzia w moim zestawie narzędzi. Niektóre rzeczy lepiej pasują do jednej, a niektóre lepiej do drugiej.
Jako przykład, obecnie używam głównie asercji do sprawdzania poprawności parametrów metod niepublicznych.
źródło
W dzisiejszych czasach uważam Debug.Assert za przedwczesną optymalizację. O ile naprawdę nie potrzebujesz wydajności, pomijanie Assert w trybie wydania może dłużej ukrywać błędy.
Jak zauważa MattDavey, kontrakty kodowe mogą być lepsze, zapewniając sprawdzanie statyczne zamiast sprawdzania dynamicznego, a jeśli nie są dostępne, wolę Trace.Assert lub zwykły stary
if(x) throw SomeException;
źródło
Debug
klasy zostaną pominięte podczas kompilacji ... więc tłumienie wywołań w celu zwiększeniaAssert
wydajności nie jest tylko przedwczesną optymalizacją, to zwykły nonsens.