Gdzie powinienem wytyczyć granicę między testami jednostkowymi a testami integracyjnymi? Czy powinny być oddzielne?

11

Mam małe środowisko MVC, nad którym pracowałem. Baza kodu zdecydowanie nie jest duża, ale to już nie tylko kilka klas. W końcu zdecydowałem się rzucić okiem i zacząć pisać testy na to (tak, wiem, że powinienem to robić przez cały czas, ale do tej pory API było bardzo niestabilne)

W każdym razie moim planem jest, aby testowanie, w tym testy integracyjne, było niezwykle łatwe. Przykładowy test integracyjny przebiegałby w następujący sposób:

Fałszywy obiekt żądania HTTP -> framework MVC -> obiekt odpowiedzi HTTP -> sprawdź, czy odpowiedź jest poprawna

Ponieważ wszystko to jest możliwe bez żadnego stanu lub specjalnych narzędzi (automatyzacja przeglądarki itp.), Mógłbym to zrobić z łatwością za pomocą regularnych ram testów jednostkowych (używam NUnit).

Teraz wielkie pytanie. Gdzie dokładnie powinienem wytyczyć granicę między testami jednostkowymi a testami integracyjnymi? Czy powinienem testować tylko jedną klasę na raz (w miarę możliwości) z testami jednostkowymi? Ponadto, czy testy integracyjne powinny być umieszczone w tym samym projekcie testowym, co mój projekt testów jednostkowych?

Earlz
źródło
Test integracji obejmuje testowanie więcej niż jednej faktycznej implementacji komponentów razem (rzeczywiste implementacje oznaczają brak prób).
Kemoda,
1
To pytanie dotyczy testowania i kontroli jakości. Sugerowałbym więc migrację do odpowiedniej strony, SQA na Stack Exchange ( sqa.stackexchange.com )
dzieciou
@dzieciou nawet nie wiedziałem, że istnieje!
Earlz

Odpowiedzi:

19

Integracja a testy jednostkowe

Powinieneś zachować testy jednostkowe i testy integracyjne całkowicie osobne. Twoje testy jednostkowe powinny przetestować tylko jedną rzecz i całkowicie w izolacji od reszty systemu. Jednostka jest luźno zdefiniowana, ale zwykle sprowadza się do metody lub funkcji.

Sensowne jest przeprowadzenie testów dla każdej jednostki, abyś wiedział, że ich algorytmy są poprawnie zaimplementowane i od razu wiesz, co poszło nie tak, jeśli implementacja jest wadliwa.

Ponieważ podczas testowania jednostkowego testujesz w pełnej izolacji, używasz obiektów pośredniczących i próbnych, aby zachowywać się jak reszta aplikacji. W tym momencie pojawiają się testy integracyjne. Testowanie wszystkich jednostek w izolacji jest świetne, ale musisz wiedzieć, czy jednostki faktycznie działają razem.

Oznacza to wiedzieć, czy model jest rzeczywiście przechowywany w bazie danych, czy też naprawdę ostrzeżenie jest generowane po awarii algorytmu X.

Rozwój oparty na testach

Cofając się o krok i patrząc na Test Driven Development (TDD), należy wziąć pod uwagę kilka rzeczy.

  1. Test jednostkowy piszesz przed napisaniem kodu, który go powoduje.
  2. Wykonujesz test, piszesz tylko tyle kodu, aby to osiągnąć.
  3. Po przejściu testu czas cofnąć się o krok. Czy jest coś do refaktoryzacji dzięki tej nowej funkcjonalności? Możesz to zrobić bezpiecznie, ponieważ wszystko jest objęte testami.

Integracja pierwsza a integracja ostatnia

Testy integracyjne pasują do tego cyklu TDD na jeden z dwóch sposobów. Znam ludzi, którzy lubią je wcześniej pisać. Nazywają test integracji testem end-to-end i definiują test end-to-end jako test, który całkowicie testuje całą ścieżkę przypadku użycia (pomyśl o skonfigurowaniu aplikacji, ładowaniu jej, przechodzeniu do kontrolera, wykonywaniu go, sprawdzanie wyniku, danych wyjściowych itp.). Następnie zaczynają od pierwszego testu jednostkowego, sprawiają, że przechodzi, dodaje drugi, sprawiają, że przechodzi itp. Powoli coraz więcej części testu integracji również przechodzi, aż funkcja się zakończy.

Innym stylem jest budowanie testu jednostki funkcji po teście jednostki i dodawanie testów integracji, które zostaną uznane za konieczne później. Duża różnica między nimi polega na tym, że w przypadku testu integracyjnego najpierw musisz pomyśleć o projekcie aplikacji. Ten rodzaj nie zgadza się z założeniem, że TDD dotyczy zarówno projektowania aplikacji, jak i testowania.

Praktyczne

W mojej pracy mamy wszystkie testy w tym samym projekcie. Istnieją jednak różne grupy. Narzędzie do ciągłej integracji najpierw uruchamia to, co jest oznaczone jako testy jednostkowe. Tylko wtedy, gdy się to powiedzie, wykonywane są również wolniejsze (ponieważ wysyłają prawdziwe żądania, używają prawdziwych baz danych itp.) Testy integracyjne.

Nawiasem mówiąc, zwykle używamy jednego pliku testowego dla jednej klasy.

Sugerowane czytanie

  1. Rosnące oprogramowanie obiektowe oparte na testach Ta książka jest wyjątkowo dobrym przykładem pierwszej metodologii testu integracyjnego
  2. Sztuka testowania jednostkowego, z przykładami w dot.net. Testowanie jednostkowe, z przykładami w dot.net: D Bardzo dobra książka na temat zasad testowania jednostkowego.
  3. Robert C. Martin o TDD (darmowe artykuły): Przeczytaj również dwa pierwsze artykuły, które tam linkował.
hoppa
źródło
2

W każdej strategii testowej ważny jest zasięg testowy - czyli możliwość pokazania, że ​​testowana jest cała funkcjonalność.

Ja ogólnie i chyba, że ​​masz specyficzne wymagania przeciwne (np. DO178 poziom A, IEC61508 SIL 4 itp.), Co nie wydaje się być w twojej sytuacji, to jeśli możesz przetestować pełną funkcję klasy lub modułu (i wykazać, że masz) na poziomie systemu, wtedy testowanie na poziomie systemu jest wystarczające. I tak dalej. Testy jednostkowe są konieczne tylko wtedy, gdy nie zostały jeszcze opisane.

Gdzie dokładnie powinienem wytyczyć granicę między testami jednostkowymi a testami integracyjnymi?

Biorąc pod uwagę, że testy integracyjne są zwykle łatwiejsze, szybsze i tańsze, narysuj linię tak daleko, jak to możliwe ...

Czy powinienem testować tylko jedną klasę na raz (w miarę możliwości) z testami jednostkowymi?

Zależy to od zakresu, znowu ... z definicji test jednostkowy testuje pojedynczą jednostkę. Ale jeśli możesz w pełni przetestować pełny moduł za jednym razem, to jeśli chcesz, zrób to. W efekcie wykonujesz kilka testów jednostkowych za jednym trafieniem.

Ponadto, czy testy integracyjne powinny być umieszczone w tym samym projekcie testowym, co mój projekt testów jednostkowych?

Nie ma podstawowego powodu, dlaczego nie ... chyba że testowanie na wyższym poziomie jest wykonywane przez niezależnego testera, w którym to momencie powinieneś wydawać tylko wykonywalne i minimalne oprzyrządowanie.

Andrzej
źródło
2
Nie widzę, jak testowanie integracji jest łatwiejsze, szybsze lub tańsze. Dla mnie jest to przeciwieństwo wszystkich 3. A testy integracyjne są zwykle bardziej kruche niż testy jednostkowe
Earlz
0

Kiedy mam małe projekty, po prostu umieszczam wszystkie testy w tym samym projekcie. Ponieważ większy projekt miałby te podziały, zapewniam, że w razie potrzeby będzie można je rozśmieszyć.

W testach jednostkowych zwykle testuję tylko jedną klasę (SUT) w pliku.


źródło