Piszemy testy sprawdzające poprawność działania programu.
Weryfikacja poprawności działania programu poprzez sprawdzenie treści instrukcji wyjściowych za pomocą oczu jest procesem ręcznym , a dokładniej wizualnym .
Można się temu spierać
inspekcja wizualna działa , sprawdzam, czy kod robi to, co powinien, dla tych scenariuszy i kiedy widzę, że jest poprawny, możemy zaczynać.
Po pierwsze, świetnie, że jesteś zainteresowany tym, czy kod działa poprawnie. To dobra rzecz. Wyprzedzasz zakręt! Niestety, z takim podejściem są problemy.
Pierwszy problem z inspekcją wizualną polega na tym, że jesteś poważnym wypadkiem spawalniczym i nie możesz nigdy ponownie sprawdzić poprawności kodu.
Drugi problem polega na tym, że para oczu jest ściśle sprzężona z mózgiem właściciela oczu. Jeżeli autor kodu jest również właścicielem oczu wykorzystywanych w procesie oględzin, to proces weryfikacji poprawności jest uzależniony od wiedzy o programie zinternalizowanej w mózgu inspektora wizualnego.
Trudno jest wejść nowej parze oczu i zweryfikować poprawność kodu tylko dlatego, że nie współpracują z mózgiem oryginalnego programisty. Właściciel drugiej pary oczu będzie musiał porozmawiać z oryginalnym autorem kodu, aby w pełni zrozumieć dany kod. Rozmowa jako sposób dzielenia się wiedzą jest notorycznie zawodna. Kwestia dyskusyjna, jeśli oryginalny koder jest niedostępny dla nowej pary oczu. W takim przypadku nowa para oczu musi odczytać oryginalny kod.
Czytanie kodu innych osób, który nie jest objęty testami jednostkowymi, jest trudniejsze niż czytanie kodu, który ma skojarzone testy jednostkowe. W najlepszym przypadku czytanie kodu innych ludzi jest trudną pracą, w najgorszym jest to najbardziej natarczywe zadanie w inżynierii oprogramowania. Nie bez powodu pracodawcy, ogłaszając oferty pracy, podkreślają, że projekt jest od podstaw (lub zupełnie nowy). Pisanie kodu od podstaw jest łatwiejsze niż modyfikowanie istniejącego kodu, a tym samym sprawia, że ogłoszone stanowisko wydaje się bardziej atrakcyjne dla potencjalnych pracowników.
Za pomocą testów jednostkowych dzielimy kod na części składowe. Dla każdego komponentu określamy następnie nasze stanowisko, określając, jak powinien zachowywać się program . Każdy test jednostkowy opowiada historię tego, jak ta część programu powinna działać w określonym scenariuszu. Każdy test jednostkowy jest jak klauzula w umowie, która opisuje, co powinno się stać z punktu widzenia kodu klienta.
Oznacza to, że nowa para oczu ma dwa pasma żywej i dokładnej dokumentacji dotyczącej danego kodu.
Najpierw mają sam kod, implementację, sposób wykonania kodu ; po drugie, mają całą wiedzę, którą pierwotny koder opisał w zestawie formalnych instrukcji, które opowiadają historię tego, jak ten kod ma się zachowywać.
Testy jednostkowe wychwytują i formalnie opisują wiedzę, jaką posiadał pierwotny autor, kiedy implementował klasę. Zawierają opis tego, jak ta klasa zachowuje się, gdy jest używana przez klienta.
Masz rację, kwestionując przydatność tego rozwiązania, ponieważ możliwe jest pisanie testów jednostkowych, które są bezużyteczne, nie obejmują całego kodu, stają się nieaktualne lub nieaktualne i tak dalej. W jaki sposób możemy zapewnić, że testy jednostkowe nie tylko naśladują, ale także usprawniają proces doświadczonego, sumiennego autora, który wizualnie sprawdza instrukcje wyjściowe swojego kodu w czasie wykonywania? Najpierw napisz test jednostkowy, a następnie napisz kod, aby ten test przeszedł pomyślnie. Kiedy skończysz, pozwól komputerom uruchomić testy, są szybkie, świetnie radzą sobie z powtarzającymi się zadaniami, idealnie nadają się do pracy.
Zapewnij jakość testów, przeglądając je za każdym razem, gdy wyłączasz testowany przez nie kod i uruchamiasz testy dla każdej kompilacji. Jeśli test się nie powiedzie, napraw go natychmiast.
Automatyzujemy proces uruchamiania testów tak, aby były uruchamiane za każdym razem, gdy budujemy projekt. Automatyzujemy również generowanie raportów pokrycia kodu, które szczegółowo opisują, jaki procent kodu jest pokryty i poddany testom. Dążymy do wysokich procentów. Niektóre firmy uniemożliwiają wprowadzanie zmian w kodzie do kontroli kodu źródłowego, jeśli nie mają napisanych wystarczających testów jednostkowych, aby opisać wszelkie zmiany w zachowaniu kodu. Zazwyczaj druga para oczu dokonuje przeglądu zmian w kodzie w połączeniu z autorem zmian. Recenzent przeprowadzi zmiany, upewniając się, że zmiany są zrozumiałe i dostatecznie objęte testami. Proces recenzji jest więc ręczny, ale gdy testy (testy jednostkowe i integracyjne oraz ewentualnie testy akceptacyjne użytkownika) przejdą ten ręczny proces przeglądu, stają się częścią automatycznego procesu kompilacji. Są one uruchamiane za każdym razem, gdy wprowadzana jest zmiana. Aciągła integracja serwer wykonuje to zadanie jako część procesu budowania.
Testy, które są uruchamiane automatycznie, utrzymują integralność zachowania kodu i zapobiegają uszkodzeniu kodu przez przyszłe zmiany w bazie kodu .
Wreszcie, udostępnianie testów pozwala na agresywne ponowne fakturowanie kodu, ponieważ można bezpiecznie wprowadzać duże ulepszenia kodu, wiedząc, że zmiany nie przerywają istniejących testów.
Istnieje zastrzeżenie dotyczące programowania sterowanego testami, a mianowicie, że musisz pisać kod z myślą o umożliwieniu jego testowania. Obejmuje to kodowanie do interfejsów i używanie technik, takich jak Dependency Injection, w celu tworzenia instancji współpracujących obiektów. Sprawdź prace Kenta Becka, który bardzo dobrze opisuje TDD. Wyszukaj kodowanie w interfejsach i przestudiujwzorce projektowe