... wszystkie testy jednostkowe przechodzą na zielono - co powinno być dobre.
To jest dobre. Nie ma w tym „być”.
Promuje ideę, że kod powinien być idealny i nie powinny istnieć żadne błędy - co w prawdziwym świecie jest z pewnością niemożliwe dla programu dowolnej wielkości.
Nie. Dowodzi to, że przetestowałeś kod tak dobrze, jak możesz. Jest całkiem możliwe, że twoje testy nie obejmują wszystkich przypadków. Jeśli tak, ewentualne błędy pojawią się w raportach o błędach, a ty napiszesz [nieudane] testy w celu odtworzenia problemów, a następnie naprawisz aplikację tak, aby testy zakończyły się pomyślnie.
Odradza się wymyślanie testów jednostkowych, które się nie powiodą.
Niepowodzenie lub negatywne testy nakładają twarde ograniczenia na to, co Twoja aplikacja zaakceptuje i nie zaakceptuje. Większość programów, które znam, sprzeciwi się „dacie” 30 lutego. Ponadto programiści, którymi jesteśmy kreatywni, nie chcą łamać „swoich dzieci”. Koncentracja na przypadkach „szczęśliwej ścieżki” prowadzi do kruchych aplikacji, które często się psują.
Aby porównać sposób myślenia programisty i testera:
- Deweloper zatrzymuje się, gdy tylko kod zrobi to, co chce.
- Tester zatrzymuje się, gdy nie może już złamać kodu.
Są to radykalnie różne perspektywy, które trudno jest pogodzić wielu programistom.
Lub z pewnością wymyślą testy jednostkowe, które byłyby trudne do naprawienia.
Nie piszesz testów, aby pracować dla siebie. Piszesz testy, aby upewnić się, że Twój kod robi to, co powinien, a co ważniejsze, że nadal robi to, co powinien, po zmianie wewnętrznej implementacji.
- Debugowanie „dowodzi”, że kod robi to, co chcesz dzisiaj .
- Testy „dowodzą”, że kod nadal robi to, co chcesz, z czasem .
Jeśli w dowolnym momencie wszystkie testy jednostkowe zakończą się pomyślnie, nie ma dużego obrazu stanu oprogramowania w żadnym momencie. Nie ma mapy drogowej / celu.
Jedynym testem „obrazkowym” jest migawka, w której kod „działa” w momencie, w którym został przetestowany. Jak ewoluuje potem, to inna historia.
Odstrasza pisanie testów jednostkowych z góry - przed wdrożeniem.
Właśnie to powinieneś robić. Napisz test, który się nie powiedzie (ponieważ metoda, którą testuje, nie został jeszcze zaimplementowany), a następnie napisz kod metody, aby metoda zadziałała, a tym samym pozytywny wynik testu. To właściwie sedno rozwoju opartego na testach.
Sugerowałbym nawet, że nawet wydanie oprogramowania z nieudanymi testami jednostkowymi nie jest konieczne. Przynajmniej wtedy wiesz, że niektóre aspekty oprogramowania mają ograniczenia.
Zwolnienie kodu z uszkodzonymi testami oznacza, że część jego funkcjonalności nie działa już tak jak wcześniej. Może to być celowe działanie, ponieważ naprawiłeś błąd lub ulepszyłeś funkcję (ale najpierw powinieneś zmienić test, aby się nie powiódł, a następnie zakodować poprawkę / ulepszenie, aby test działał w tym procesie). Co ważniejsze: wszyscy jesteśmy ludźmi i popełniamy błędy. Jeśli złamiesz kod, powinieneś przerwać testy, a te zepsute testy powinny ustawić dzwonienie dzwonków alarmowych.
Czy to nie życie w świecie snów?
Jeśli już, to żyje w świecie rzeczywistym , uznając, że deweloperzy nie są ani wszechwiedzący, ani infallable, że możemy zrobić, popełniają błędy i że potrzebujemy siatki bezpieczeństwa złapać nas, czy i kiedy zrobić bałagan!
Wprowadź testy.
I czy tak naprawdę nie przeszkadza to w prawdziwym zrozumieniu kodu?
Być może. Niekoniecznie musisz rozumieć implementację czegoś, aby napisać testy na to (to jest ich sedno). Testy określają zachowanie i ograniczenia aplikacji i zapewniają, że pozostają one takie same, chyba że celowo je zmienisz.