Podczas szkolenia TDD opartego na oprogramowaniu medycznym wdrażamy następującą historię: „Gdy użytkownik naciśnie przycisk Zapisz, system powinien dodać pacjenta, dodać urządzenie i dodać rekordy danych urządzenia”.
Ostateczne wdrożenie będzie wyglądać mniej więcej tak:
if (_importDialog.Show() == ImportDialogResult.SaveButtonIsPressed)
{
AddPatient();
AddDevice();
AddDeviceDataRecords();
}
Mamy dwa sposoby na jego wdrożenie:
- Wywołano trzy testy, w których każdy weryfikuje jedną metodę (AddPatient, AddDevice, AddDeviceDataRecords)
- Wywołano jeden test weryfikujący wszystkie trzy metody
W pierwszym przypadku, jeśli stanie się coś złego, jeśli warunek klauzuli, wszystkie trzy testy zakończą się niepowodzeniem. Ale w drugim przypadku, jeśli test się nie powiedzie, nie jesteśmy pewni, co jest dokładnie nie tak. W jaki sposób wolisz
źródło
Granulacja w twoim przykładzie wydaje się być różnicą między testami jednostkowymi i akceptacyjnymi.
Unittest testuje pojedynczą jednostkę funkcjonalności przy możliwie jak najmniejszej liczbie zależności. W twoim przypadku mogą być 4 unittests
Unittests są dla programistów , więc mają pewność, że ich kod jest technicznie poprawny
Testy akceptacyjne powinny przetestować połączoną funkcjonalność z perspektywy użytkownika. Powinny być wzorowane na historiach użytkowników i znajdować się na jak najwyższym poziomie. Nie musisz więc sprawdzać, czy funkcje są wywoływane, ale czy osiągnięto korzyść widoczną dla użytkownika :
gdy użytkownik wprowadza dane, klika ok i ...
testy akceptacyjne są dla klientów lub dla lepszej komunikacji z nimi.
Aby odpowiedzieć na pytanie „co wolisz”: co jest dla ciebie większym problemem, błędy i regresja (=> więcej nieuczciwych odpowiedzi) lub zrozumienie i sformalizowanie dużego obrazu (=> więcej testów akceptacyjnych)
źródło
To nieprawda.
Państwo musi to zrobić, aby mieć pewność, że działa.
Musisz to również zrobić, aby mieć pewność, że interfejs API działa.
Klasa - jako całość - musi zostać całkowicie przetestowana. Każda metoda
Możesz zacząć od testu obejmującego wszystkie trzy metody, ale niewiele ci to mówi.
Poprawny. Dlatego testujesz wszystkie metody.
Państwo musi przetestować interfejs publiczny. Ponieważ ta klasa wykonuje trzy plus jedną czynność (nawet jeśli są one połączone w jedną metodę ze względu na historię użytkownika), musisz przetestować wszystkie cztery rzeczy. Trzy zestawy niskiego poziomu i jeden pakiet.
źródło
Piszemy nasze testy jednostkowe pod kątem znaczących zdań funkcjonalności, które wielokrotnie mapują się na metodę (jeśli dobrze napisałeś kod), ale czasem stają się większe, obejmując wiele metod.
Na przykład wyobraź sobie, że dodanie pacjenta do systemu wymaga wywołania niektórych podprogramów (funkcji potomnych):
Możemy również napisać test jednostkowy dla każdej z tych funkcji.
źródło
Jedną prostą zasadą, którą stosuję, jest nazwać test, aby dokładnie opisał jego działanie. Jeśli nazwa testu staje się zbyt złożona, oznacza to, że test może robić zbyt wiele. Na przykład nazwanie testu w celu wykonania tego, co zaproponujesz w opcji 2, może wyglądać jak PatientIsAddedDeviceIsAddedAndDeviceDataRecordsWhenSaved, który jest znacznie bardziej złożony niż trzy osobne testy PatientIsAddedWhenSaved, DeviceIsAddedWhenSaved, DataRecordsWhenSaved. Myślę też, że lekcje, które można wyciągnąć z BDD, są dość interesujące, gdzie każdy test jest naprawdę reprezentatywny dla jednego wymagania, które można opisać w języku naturalnym.
źródło