W ciągu ostatnich kilku tygodni zastanawiałem się, jak wypełnić lukę w naszej metodologii testowania. Upraszczając, testy jednostkowe są zbyt małe, a tradycyjne testy integracyjne są zbyt duże.
Częstym scenariusz pojawia się gdzie A
i B
stosowania zarówno komponent C
. Jednak A
i B
mają nieco inne wymagania dotyczące i zrobić nieco inne założenia dotyczące C
. Jeśli jestem programistą tego, A
jak i gdzie mam przetestować moje założenia C
?
Oczywiście testowanie jednostkowe A
przy wyśmiewanych założeniach C
jest odpowiednie do testowania A
w izolacji, ale nie testuje samych założeń.
Inną możliwością jest dodanie testów jednostkowych C
. Nie jest to jednak idealne, ponieważ w trakcie A
opracowywania zmiana testów C
przy zmieniających się założeniach A
będzie nadmiernie niezręczna. Rzeczywiście A
programista może nawet nie mieć odpowiedniego dostępu do testów jednostkowych C
(np. Biblioteki zewnętrznej).
Aby przedstawić to w bardziej konkretny przykład: Załóżmy, że jest to aplikacja węzłowa. A
i B
zależy od C
odczytu pliku (między innymi) i przechowywania zawartości pliku w przekazanym obiekcie C
. Początkowo wszystkie C
obsługiwane pliki są małe i można je odczytywać synchronicznie bez znaczącego blokowania. Jednak twórca B
zdaje sobie sprawę, że jego pliki stają się ogromne i musi przejść C
na odczyt asynchroniczny. Powoduje to sporadyczny błąd synchronizacji A
, który nadal zakłada C
synchroniczne czytanie plików.
Jest to rodzaj błędu, który jest niezwykle trudny do wyśledzenia z pełnych testów integracyjnych i może w ogóle nie zostać złapany w testach integracyjnych. Nie jest również wychwytywany przez A
testy jednostkowe, ponieważ A
założenia są kpione. Można go jednak łatwo złapać przez „mini” test integracyjny, który ćwiczy tylko A
i C
.
Znalazłem tylko kilka odniesień do tego typu testów. Integracja w małej , Komponent testy integracyjne , Dział Integracji Badań. Odnosi się również w pewnym stopniu do kierunku testowania BDD, a nie do formalnego testowania jednostki TDD.
Jak wypełnić tę lukę testową? W szczególności - gdzie mam umieścić takie testy? Jak wyśmiewać dane wejściowe A
i C
testy integracji „mini”? A ile wysiłku należy włożyć w rozdzielenie problemów związanych z testowaniem między tymi testami a testami jednostkowymi? Czy jest lepszy sposób na wypełnienie luki w testowaniu?
Odpowiedzi:
Wydaje mi się, że masz podstawowy problem ze swoimi komponentami.
C powinien zrobić to, co C musi zrobić, i być przetestowany, udokumentowany i zaprojektowany właśnie do tego. Kiedy masz sytuację, w której C ma „robić to, czego chce B”, masz nadużycie, które staje się bardzo jasne, gdy A przybywa i chce, aby C zrobił coś nieco innego.
To, czego nie powinieneś robić, to testowanie jednostkowe C w kontekście A, a zwłaszcza nie A w kontekście C - testujesz A niezależnie i podajesz wyniki próbnego C do A. Jeśli rzeczywista wersja C nie zapewnia tych samych wyników, wtedy masz błąd lub wadę projektową w C, która zostanie złapana podczas wykonywania dużych testów integracyjnych. Testowanie jednostek zawsze odbywało się w ten sposób - nie można przetestować jednej jednostki, testując inną jednostkę w tym samym czasie. Testy jednostkowe po prostu nie są do tego przeznaczone.
Testy integracyjne nie muszą być „całym programem”, choć często są konfigurowane w ten sposób. Mogą to być stanowiska testowe, które obsługują A i C razem bez uruchamiania reszty programu (lub tak mało, jak tylko można uciec). W tym momencie nie mogę udzielić dalszych porad, ponieważ zależy to od tego, co robią te komponenty i jak one współdziałają z resztą twojego programu, ale zazwyczaj jest tak, że możesz napisać platformę testową, która zapewnia testowe pokrycie obu komponentów. Niezależnie od tego, czy warto to zrobić, czy też bardziej efektywne jest przetestowanie integracji całego programu jako jednego (nawet jeśli uruchamiasz podzbiór testów integracyjnych), możesz odpowiedzieć tylko na to. Większość testów integracyjnych składa się z wielu sekcji, więc mam nadzieję, że powinieneś być w stanie uruchomić tylko te odpowiednie dla tych 2 składników (a jeśli nie,
źródło