Testowanie luki między jednostką a integracją: integracja w małych, komponentowych, integracyjnych testach

9

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 Ai Bstosowania zarówno komponent C. Jednak Ai Bmają nieco inne wymagania dotyczące i zrobić nieco inne założenia dotyczące C. Jeśli jestem programistą tego, Ajak i gdzie mam przetestować moje założenia C?

Oczywiście testowanie jednostkowe Aprzy wyśmiewanych założeniach Cjest odpowiednie do testowania Aw 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 Aopracowywania zmiana testów Cprzy zmieniających się założeniach Abędzie nadmiernie niezręczna. Rzeczywiście Aprogramista 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. Ai Bzależy od Codczytu pliku (między innymi) i przechowywania zawartości pliku w przekazanym obiekcie C. Początkowo wszystkie Cobsługiwane pliki są małe i można je odczytywać synchronicznie bez znaczącego blokowania. Jednak twórca Bzdaje sobie sprawę, że jego pliki stają się ogromne i musi przejść Cna odczyt asynchroniczny. Powoduje to sporadyczny błąd synchronizacji A, który nadal zakłada Csynchroniczne 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 Atesty jednostkowe, ponieważ Azałożenia są kpione. Można go jednak łatwo złapać przez „mini” test integracyjny, który ćwiczy tylko Ai 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 Ai Ctesty 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?

mjhm
źródło
1
czy zastanawiałeś się nad wersją modułów AC i korzystasz z jakiejś formy zarządzania zależnościami?
miraculixx
1
@gnat Dzięki za wskazówkę. Sprawiłem, że pytanie stało się mniej niejasne.
mjhm
@miraclixx Dzięki za sugestię. Czy mógłbyś opracować? Jeśli masz na myśli coś takiego jak blog.nodejitsu.com/package-dependencies-done-right - myślę, że to rozwiązuje inny problem niż pytam. Komponenty, o których mówię, są generalnie zbyt małe, aby można je było samodzielnie wykonać jako moduł węzła - na przykład plik komponentu Model lub Kontroler. Dodatkowo wersjonowanie daje jedynie wskazówki dotyczące bezpieczeństwa i źródeł awarii, a nie wyraźne testowanie konkretnych problemów.
mjhm

Odpowiedzi:

6

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,

gbjbaanb
źródło
Tak, tak myślę. Jest to poza zakresem i celem testów jednostkowych. Niestety nie mieszkam w świecie oprogramowania, w którym komponenty zależne są doskonale zaprojektowane, przetestowane i udokumentowane. A to, co mamy niewiele testów integracyjnych, jest na ogół kompleksowe i jest obsługiwane przez specjalistów ds. Kontroli jakości, a nie deweloperów źródeł. Jak można się domyślić, w mieszance występują problemy związane z zarządzaniem i organizacją.
mjhm
Myślę, że będziesz musiał dodać własne testy integracyjne, ale nazwij je testami jednostkowymi, „testujemy jednostkę modułu logowania klienta”, gdy napotkasz ogórek lub selen.
gbjbaanb