Niedawno ukończyłem refaktoryzację czarnej skrzynki. Nie mogę tego sprawdzić, ponieważ nie mogę wymyślić, jak to przetestować.
Na wysokim poziomie mam klasę, której inicjalizacja obejmuje pobieranie wartości z niektórych klas B. Jeśli klasa B jest „pusta”, generuje sensowne wartości domyślne. Wyodrębniłem tę część do metody, która inicjuje klasę B na te same wartości domyślne.
Muszę jeszcze opracować cel / kontekst jednej z klas lub sposób ich wykorzystania. Nie mogę więc zainicjować obiektu z pustej klasy B i sprawdzić, czy ma właściwe wartości / robi właściwą rzecz.
Moim najlepszym pomysłem jest uruchomienie oryginalnego kodu, twardego kodu w wynikach metod publicznych w zależności od zainicjowanych elementów członkowskich i przetestowanie nowego kodu pod tym kątem. Nie potrafię do końca wyrazić, dlaczego czuję się nieswojo z tym pomysłem.
Czy jest tu lepszy atak?
źródło
Odpowiedzi:
Dobrze ci idzie!
Tworzenie automatycznych testów regresji jest często najlepszą rzeczą, jaką możesz zrobić, aby umożliwić refaktoryzację komponentu. Może to być zaskakujące, ale takie testy często można napisać bez pełnego zrozumienia tego, co robi komponent wewnętrznie, o ile rozumiesz wejściowe i wyjściowe „interfejsy” (w ogólnym znaczeniu tego słowa). Robiliśmy to kilka razy w przeszłości dla pełnoprawnych starszych aplikacji, nie tylko klas, i często pomogło nam to uniknąć zepsucia rzeczy, których nie do końca rozumieliśmy.
Jednak powinieneś mieć wystarczającą ilość danych testowych i upewnić się, że dobrze rozumiesz, co robi oprogramowanie z punktu widzenia użytkownika tego komponentu, w przeciwnym razie możesz pominąć ważne przypadki testowe.
IMHO jest dobrym pomysłem, aby zaimplementować automatyczne testy przed rozpoczęciem refaktoryzacji, a nie później, aby można było refaktoryzować małymi krokami i weryfikować każdy krok. Samo refaktoryzacja powinna sprawić, że kod będzie bardziej czytelny, więc pomoże Ci to lepiej zrozumieć krok po kroku elementy wewnętrzne. Tak więc kolejność kroków w tym procesie jest
źródło
Ważnym powodem pisania testów jednostkowych jest to, że w jakiś sposób dokumentują one interfejs API komponentu. Niezrozumienie celu testowanego kodu jest tutaj naprawdę problemem. Pokrycie kodu jest kolejnym ważnym celem, trudnym do osiągnięcia bez wiedzy, które gałęzie wykonawcze istnieją i jak są uruchamiane.
Jeśli jednak możliwe jest czyste zresetowanie stanu (lub skonstruowanie nowego obiektu testowego za każdym razem), można napisać testy typu „wyrzucanie śmieci do kosza”, które po prostu dostarczają do systemu głównie losowe dane wejściowe i obserwują dane wyjściowe.
Takie testy są trudne do utrzymania, ponieważ kiedy zawodzą, określenie złożonej przyczyny i powagi może być trudne. Zakres może być wątpliwy. Jednak nadal są znacznie lepsze niż nic. Gdy taki test się nie powiedzie, deweloper może z większą uwagą zweryfikować najnowsze zmiany i, mam nadzieję, wykryć tam błąd.
źródło