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?
Odpowiedzi:
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.
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
źródło
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.
Biorąc pod uwagę, że testy integracyjne są zwykle łatwiejsze, szybsze i tańsze, narysuj linię tak daleko, jak to możliwe ...
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.
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.
źródło
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