Testy jednostkowe podczas przeglądania kodu są słabym zamiennikiem testów jednostkowych podczas programowania.
To, co sugerujesz, ma sens, intuicyjnie. Do czego służy opinia? Aby sprawdzić, czy kod jest dobry. Do czego służą testy? Aby sprawdzić, czy kod jest dobry. Dlaczego więc nie połączyć tych dwóch elementów?
Dlatego.
Testowanie kodu to ciężka praca. Pisanie kodu, który działa tylko w jednym celu, to jedna rzecz; pisanie kodu, który można skutecznie i wydajnie przetestować, to kolejne. Sam fakt, że kod działa teraz w dwóch scenariuszach - „prawdziwej pracy” i „testowaniu” - wymaga znacznie większej elastyczności, wymaga od tego, aby kod mógł samodzielnie działać w znaczący sposób.
Pisanie kodu w celu jego przetestowania to dodatkowa praca i umiejętności. Refaktoryzacja kodu innej osoby pod kątem testowalności, jeśli nie została napisana z myślą o testowaniu na początku, może być dużym zadaniem.
Dublujesz wysiłek programisty i recenzenta. Można przypuszczać, że programista nie podając swój kod do sprawdzenia bez przynajmniej pewnym poziomem ufności, że to działa. On już musi przetestować kod. Teraz istnieją różne poziomy i zakresy testowania. Kontrola jakości testuje kod po programiście i recenzencie. Ale niezależnie od tego, jaki zakres uważasz za odpowiedni dla programisty i recenzenta, nie ma sensu, aby programista raz testował kod na tym poziomie , ale sprawiał, że jego testy były niepotrzebne i trudne do odtworzenia, a następnie doprowadził recenzenta do opracuj test ponownie, tym razem zautomatyzowane i odtwarzalne. Wystarczy, że oboje zainwestują czas w pisanie tych samych testów - raz źle, raz dobrze.
Zmieniasz recenzję w znacznie dłuższy i bardziej pracochłonny krok. Jeśli testowanie jest główną częścią procesu przeglądu, co się stanie, gdy niektóre testy się nie powiodą ? Czy recenzent jest odpowiedzialny za uruchomienie testów, więc musi również debugować kod? A może będzie ping-pong w jedną i drugą stronę, jeden test pisania, a drugi sprawi, że zdadzą egzamin?
Czasami możesz napisać całą serię testów, które są do siebie prostopadłe, więc nie musisz ping-ponga. Recenzent pisze kilkanaście testów, połowa z nich kończy się niepowodzeniem, programista naprawia błędy, a wszystkie testy pozostają ważne i przechodzą teraz. Ale ... dużo czasu masz błędy blokujące lub błędy wymagające przeprojektowania i zmian interfejsu API, czy coś w tym rodzaju. Jeśli podrzucasz odpowiedzialność za przekazywanie testów tam iz powrotem między recenzentem a programistą, to tak naprawdę nie jesteś na etapie recenzji. Nadal się rozwijasz.
Konieczność napisania testów nie zachęca do dokładniejszego przeglądu. Zasadniczo oznacza to, że im głębiej idziesz, tym więcej testów musisz napisać, i prawdopodobnie będą to trudne testy, które muszą wejść głęboko w system.
Porównaj z programistą piszącym testy, gdzie jego motywacją jest: jeśli nie piszę ważnych testów, recenzent zwróci na to uwagę w recenzji.
Nawet recenzent będzie miał znacznie lepsze zrozumienie systemu, jeśli będzie musiała przejść dokładne testy kodu , a następnie, jeśli będzie musiała sama zdecydować, kiedy może przestać pisać test głębokiego wyszukiwania i po prostu OK recenzję kodu.
Jeśli programista nie pisze testów jednostkowych, recenzent też tego nie zrobi. Istnieje wiele przeszkód w przyjmowaniu testów jako powszechnej praktyki. Może jesteś pod zbyt dużą presją, a twoja baza kodu jest trudna do przetestowania. Być może nie masz zbyt dużego doświadczenia w testowaniu i masz wrażenie, że nie stać Cię na naukę. Może masz mordercę siekiery wysyłającego groźne notatki do ludzi, którzy piszą testy. Nie wiem!
Ale bez względu na przyczynę można bezpiecznie założyć, że dotyczy to zarówno recenzenta, jak i programisty. Jeśli zespół jest zestresowany, recenzent nie ma więcej czasu niż programista (jeśli tak, rozdziel pracę, aby ludzie nie byli tak zestresowani ). Jeśli nikt nie wie, jak dobrze pisać testy jednostkowe, recenzent prawdopodobnie również nie (jeśli tak, powinna usiąść i uczyć swoich kolegów z drużyny ).
Ta sugestia brzmi jak próba przekazania złotówki od jednego kolegi do drugiego. I po prostu nie widzę żadnego sposobu, aby to dobrze zadziałało, przede wszystkim dlatego, że naprawdę ciężko (i niezdrowo) jest stworzyć sytuację, w której jedna osoba jest jedyną, która może wykonywać testy, a inna nie może jakiekolwiek testy w ogóle.
Co robi pracy jest posiadanie testy pokrywy ocena również. Jeśli programista napisał już dziesięć testów, jest o wiele bardziej prawdopodobne, że recenzent może zasugerować kolejną dziesięć, niż gdyby programista nie napisał żadnego.
A jeśli testowanie narożnych przypadków jest poważnym zadaniem, sensowniejsze może być rozpowszechnianie tego w całym zespole. ** Kiedy kod jest w pierwszej kolejności testowalny, pisanie kolejnych testów staje się znacznie łatwiejsze. **
Recenzja to świetny czas na wykrycie narożnych skrzynek. A jeśli recenzent może wskoczyć i napisać test dla narożnych skrzynek, które znajdzie, to hej - tym lepiej! Ale ogólnie mówiąc, zakładając, że recenzent może napisać testy, w których programista nie brzmi jak bardzo kiepski pomysł.