Testy kompleksowe a testy jednostkowe, czy należy oddzielić testy?


23

W naszej firmie zazwyczaj upewniamy się, że piszemy kompleksowy test dla naszych stron internetowych / aplikacji internetowych. Oznacza to, że uzyskujemy dostęp do adresu URL, wypełniamy formularz, przesyłamy formularz na inny adres URL i sprawdzamy wyniki strony. Robimy to w celu przetestowania weryfikacji formularza, sprawdzenia, czy szablony HTML mają poprawne zmienne kontekstowe itp.

Używamy go również do pośredniego testowania podstawowej logiki.

Współpracownik powiedział mi, że powodem tego jest to, że możemy zerwać i zmienić implementację bazową w dowolnym momencie, pod warunkiem, że przejdą testy end-to-end.

Zastanawiam się, czy tego rodzaju odsprzęganie ma sens, czy to tylko sposób na uniknięcie pisania testów dla mniejszych jednostek kodu?


6
was told by a co-worker that the reason for this is that we can rip out and change the underlying implementation at any point as long as the end-to-end tests pass.- Dotyczy to również testów jednostkowych. Wydaje mi się, że kompleksowe testy są wykorzystywane jako wymówka dla nie pisania testów jednostkowych.
Robert Harvey

12
Nie dotyczy to testów jednostkowych. Zmiana / usuwanie / tworzenie metod lub klas wymaga aktualizacji wszystkich testów jednostkowych dla tych metod lub klas. Nie dotyczy to testów końcowych, chyba że zmienia się funkcjonalność użytkownika końcowego. Tak długo, jak jest to refaktor na poziomie systemu (bez modyfikacji funkcjonalności użytkownika końcowego), nie są wymagane żadne zmiany w końcowych testach.
dietbuddha

2
@dietbuddha, myślę, że ogólna koncepcja jest prawdziwa dla testów jednostkowych, ale w mniejszym (jednostkowym) zakresie.
Sam

Odpowiedzi:


38

Niezbędne są również kompleksowe testy. Skąd jeszcze możesz wiedzieć, że poprawnie połączyłeś wszystkie jednostki? Na bardzo prostym kodzie możliwe jest przetestowanie wszystkich ścieżek w kodzie za pomocą tylko testów end-to-end, ale gdy otrzymujesz więcej warstw, staje się to zbyt kosztowne.

Załóżmy na przykład, że masz trzy warstwy, każda z pięcioma możliwymi ścieżkami. Testowanie wszystkich ścieżek w całej aplikacji wymagałoby 5 3 kompleksowych testów, ale można przetestować wszystkie ścieżki w każdej jednostce za pomocą jedynie 5 · 3 testów jednostkowych. Jeśli wykonujesz tylko testy end-to-end, wiele ścieżek zostaje zaniedbanych, głównie w zakresie obsługi błędów i warunków brzegowych.


To dobra odpowiedź. Widzę wartość obu, ale dostrzeganie liczby możliwości pełnego przetestowania wszystkich ścieżek z testami od końca do końca jest pomocne w wyjaśnieniu, dlaczego testy jednostkowe należy wykonywać więcej niż to jest
Rudolf Olah

14
Uważam, że testy jednostkowe są cenne głównie dlatego, że szybko lokalizują problemy. Kompleksowe są cenne, ponieważ dają pewność, że wszystko działa razem.
Jason Swett

20

Tak, testy end-to-end (lub testy integracyjne) mają sens, ale także testy jednostkowe. Najlepiej, jeśli masz je oba, ponieważ oba zazwyczaj łapią różnego rodzaju błędy. Zatem posiadanie kompleksowych testów nigdy nie powinno być usprawiedliwieniem dla braku testów jednostkowych.


2
Szybka uwaga na temat sformułowania; nawet jeśli nie jest to ścisła nauka, wiele osób powie, że kompleksowe testy i testy integracyjne to różne rzeczy. Zobacz stackoverflow.com/questions/4904096/…
sbrattla

6

Po kilku latach programowania i pracy nad projektami udzielę odpowiedzi na moje własne pytanie.

Tak, powinieneś napisać testy jednostkowe. Testy od końca do końca są trudniejsze do napisania i kruche, zwłaszcza jeśli polegają na składnikach interfejsu użytkownika.

Jeśli używasz frameworka, takiego jak Django lub Rails (lub własne niestandardowe klasy), powinieneś mieć klasę formularza, która będzie obsługiwać sprawdzanie poprawności formularza. Będziesz także mieć klasy widoku, które wyświetlają renderowane szablony oraz formularz i obsługują żądania GET i POST.

W ramach testu od końca do końca:

  1. pobierz adres URL
  2. wypełnij formularz prawidłowymi danymi
  3. opublikuj formularz na adres URL
  4. sprawdź, czy baza danych została zaktualizowana lub czy jakieś działanie zostało wykonane w wyniku prawidłowego formularza

Testujesz dużo kodu i zasięg będzie całkiem dobry, ale testujesz szczęśliwą ścieżkę tylko wtedy, gdy wszystko pójdzie dobrze. W jaki sposób upewniasz się, że formularz ma odpowiednią weryfikację? Co jeśli ten formularz jest używany na wielu stronach? Czy piszesz jeszcze jeden test od końca do końca?

Spróbujmy jeszcze raz z testami jednostkowymi:

  1. przetestuj metodę GET widoku
  2. przetestuj metodę POST widoku za pomocą fałszywego / próbnego formularza
  3. przetestuj formularz z poprawnymi danymi
  4. przetestuj formularz z nieprawidłowymi danymi
  5. przetestuj skutki uboczne formularza

Korzystając z testów jednostkowych, testujesz mniejsze fragmenty kodu, a testy są specyficzne i łatwiejsze do napisania. Połączenie tego z TDD (Test Driven Development) daje kod o wyższej jakości.

Łatwość pisania testów jednostkowych nie powinna zostać odrzucona, ponieważ jeśli pracujesz nad projektem, który nie ma testów automatycznych, musisz gdzieś zacząć. Rozpoczęcie od testów jednostkowych jest łatwiejsze i szybsze i pozwala natychmiast rozpocząć testowanie pod kątem błędów, a nie tylko szczęśliwej ścieżki.


inny punkt danych, Blog testowy Google mówi „nie” więcej testom end2end
Rudolf Olah

5

W rzeczywistości testy kompleksowe lub testy integracyjne są ważniejsze niż testy jednostkowe, ponieważ zapewniają, że masz w pełni działający system. Testy jednostkowe nie obejmują części integracyjnej systemu, co jest skomplikowanym zadaniem, szczególnie w dużych projektach.

Jednak, jak już powiedziano, powinieneś również przeprowadzać testy jednostkowe, ponieważ bardziej skomplikowane jest wychwycenie przypadków skrajnych w testach integracyjnych.


1

Weryfikuje zachowanie systemu, podczas gdy testy jednostkowe weryfikują zachowanie urządzenia. Korzyści i koszty dla każdego są różne. Możesz zrobić jedno lub drugie albo jedno i drugie.

W mojej pracy wykonujemy rozwój oparty na testach akceptacyjnych bez testów jednostkowych, co brzmi podobnie do tego, co opisałeś. Z czasem zaczęliśmy robić jedno i drugie, ostatecznie wyeliminowaliśmy testy jednostkowe, których koszt przekraczałby dla nas korzyści.

Biorąc to pod uwagę, uważam, że koszt / korzyść dla Twojej problematycznej domeny i środowiska powinna wpływać na decyzje o zaangażowaniu się w dowolną praktykę programistyczną, w tym różne praktyki automatycznego testowania. Zamiast wiary wolę, aby wszystkie praktyki miały dowody empiryczne w kontekście ich użycia, aby je poprzeć.


Martwię się o to, że będziemy kodować w kierunku testów akceptacyjnych, które prowadzą do dużych klas lub metod zamiast mniejszych jednostek.
Rudolf Olah

@omouse: Tylko dlatego, że nie piszesz testów jednostkowych, nie ma powodu, aby nie pisać dobrego kodu. Jeśli jednak masz programistów, którzy nie mają doświadczenia lub mają po prostu złe nawyki, korzyści mogą przewyższyć koszty. W obu przypadkach należy wykonać analizę i sprowadzić ją do prostego równania. For Any Practice: Practice iff Benefit > Cost
dietbuddha
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.