Czym dokładnie jest test integracyjny?

110

Wspólnie z moimi przyjaciółmi staramy się dokładnie sklasyfikować, co jest testem integracyjnym.

Teraz, wracając do domu, właśnie zdałem sobie sprawę, że za każdym razem, gdy próbuję podać prawdziwy przykład testu integracyjnego w świecie rzeczywistym, okazuje się, że jest to test akceptacyjny, tj. coś, co przedsiębiorca powiedziałby na głos, określające, co powinien zapewniać system.

Sprawdziłem dokumentację Ruby on Rails pod kątem ich klasyfikacji tych typów testów, a teraz całkowicie mnie wyrzuciła.

Czy możesz podać mi krótki akademicki opis testu integracyjnego z przykładem ze świata rzeczywistego?

Martin Blore
źródło
76
BTW, kiedy masz frazę rzeczownikową („Ja i niektórzy znajomi”), musisz uważać, której liczby pojedynczej z pierwszej osoby używasz. Oto test. Upuść znajomych i sprawdź, czy nadal działa. „Ja walczyłem” kontra „Walczyłem”. Ten test mówi ci, że to „ja i moi przyjaciele ...” I - żeby być grzecznym - najpierw wymieniamy inne. "Moi przyjaciele i ja". Testowanie jest ważne.
S.Lott,
58
Myślę, że S.Lott właśnie dał ci test integracji gramatyki-> społeczeństwa.
Jordan

Odpowiedzi:

78

W tej chwili podoba mi się to stwierdzenie: „Nie ważne, jak to nazywasz, ale co robi” autorstwa Gojko Adzica w tym artykule .

Naprawdę musisz określić z osobami rozmawiającymi o testach, co zamierzasz przetestować.

Wiele osób ma różne poglądy, w zależności od ich roli.

Dla testerów ogólnie przyjętą metodologią testów w Holandii jest TMap . TMap dokonuje następującego rozróżnienia.

  • test jednostkowy
  • test integracji jednostki
  • test systemu
  • test integracji systemu
  • test akceptacyjny (wszystkie rodzaje / poziomy)
  • test akceptacji funkcjonalnej
  • Test akceptacji użytkownika
  • test akceptacyjny produkcji

Mają bardziej szczegółowy rodzaj testów, które można wykonać w ramach wyżej wymienionych testów. Spójrz na to słowo doc na przegląd.

Wikipedia ma również ładny przegląd .

Książka pragmatyczny programista mówi:

  • test jednostkowy to test ćwiczący moduł
  • testy integracji pokazują, że główne części systemu działają dobrze razem

Przeglądając te różne źródła i zamieszczając własne doświadczenia i opinie, zacznę od rozróżnienia według trzech kategorii

  • kto ogólnie przeprowadza testy
  • co jest testowane
  • jaki jest cel testu

    • Test jednostkowy : testuj logikę w klasach przez programistów, aby pokazać poprawność poziomu kodu. Powinny być szybkie i nie mogą zależeć od innych części systemu, których nie zamierzasz testować
    • Test akceptacji funkcjonalnej : przetestuj scenariusz przypadku użycia na ograniczonym (specjalnie utworzonym) zestawie danych wykonanym przez dział testowy, aby pokazać, że każdy określony scenariusz działa zgodnie z określonym.
    • Test akceptacji użytkownika : przetestuj scenariusze przypadków użycia dotyczące produkcji, takie jak dane wykonane przez przedstawicieli użytkowników, aby formalnie zaakceptować aplikację
    • Test integracji : przetestuj ścieżki komunikacji między różnymi częściami modułu wykonane przez dział testowy lub programistów, aby wykazać, że wszystkie moduły działają poprawnie razem.

Moja powyższa lista to tylko początek i sugestia, ale naprawdę myślę: „To nie jest ważne, jak to nazywasz, ale to, co robi”

Mam nadzieję że to pomoże.

26-10-2016 Edycja: Niedawno wprowadzono bardzo miłe wprowadzenie do testów jednostkowych YouTube vs. testy integracyjne - rozważania MPJ - FunFunFunction # 55

KeesDijk
źródło
3
+1 Za „nie ma znaczenia, jak to nazwiesz”. Niestety nie ma uniwersalnej definicji jakiegokolwiek testu. Nawet dobry test jednostkowy OL jest nieco zmienny. Czy testowanie DOM dla aplikacji internetowej jest uważane za test jednostkowy? Niektórzy mówią tak, inni mówią nie.
Laurent Bourgault-Roy
2
Link do słowa doc nie jest dostępny.
Paul Rougieux,
6
„Nieważne, jak to nazywasz” dotyczy całej informatyki, a właściwie prawie wszystkich dziedzin. Uważam, że wiele gorących argumentów, w które wchodzą ludzie, można sprowadzić do „kłócimy się nad definicją dowolnego zdania”.
ogrodnik
+1 zgadzają się z definicjami: Byłem w miejscu, w którym „Test jednostkowy” powiedział, że programista wypróbował system z co najmniej jednym próbnym wejściem ... ręcznie ... i wizualnie sprawdził wyjście, jeśli „wydawało się właściwe” . Brak umowy dotyczącej tego, czego się spodziewano, żadnych kontrolowanych danych wejściowych itp.
Newtopian
Link do Gojko zwraca 404. Możesz uzyskać dostęp do archiwum tutaj: web.archive.org/web/20150104002755/http://gojko.net/2011/01/12/…
Eduardo Copat
32

test integracji okazuje się testem akceptacyjnym

Oczywiście.

Te dwie rzeczy są prawie takie same. Istnieją jednak nieco inne wymiary definicji testu.

Integracja == system jako całość.

Akceptacja == system jako całość.

Jedyną różnicą - i to jest subtelna - jest definicja przypadków testowych.

Integracja == przypadki testowe do testowania głębokości i stopnia integracji. Czy to działa dla wszystkich skrzynek krawędziowych i narożnych? Przypadki testowe są zazwyczaj techniczne, napisane przez projektantów i programistów.

Akceptacja == przypadków testowych do wykonania 80% zestawu funkcji zorientowanych na użytkownika końcowego. Nie wszystkie skrzynie krawędzi i narożników. Przypadki testowe są zwykle nietechniczne i napisane przez użytkowników końcowych.

S.Lott
źródło
7
Dodam tylko, że testy integracyjne mogą testować tylko część systemu, ale więcej niż jeden element na raz. Za każdym razem, gdy szukasz błędów spowodowanych przez dwie lub więcej części systemu pracujących razem (zintegrowane razem), testujesz integrację. Integracja przebiega od dwóch składników rzeczywistych i wszystkich innych wyśmiewanych, do całego pakietu aplikacji współpracujących ze sobą, a nawet może sięgać nawet sprawdzania integracji z innymi aplikacjami (np. „Jak MS Office działa z Internet Explorerem?”).
Ethel Evans,
1
@Ethel Evans: Dobra uwaga. Test nadal będzie niewyraźny między integracją a akceptacją, nawet jeśli zaangażowana jest tylko część systemu. Testy odbywają się na wystarczająco wysokim poziomie, aby akceptacja i integracja były podobne.
S.Lott,
3
Testy integracyjne na pewno nie (i prawdopodobnie nie powinny) testować „systemu jako całości”. Wszędzie tam, gdzie dwa lub więcej komponentów jest testowanych razem, w szczególności podczas testowania na komponentach zewnętrznych (baza danych, sieć itp.), Przeprowadzasz testy integracji. Z powodu wysokich kosztów testowania „całego systemu” chcesz tego uniknąć w jak największym stopniu, zamiast tego spróbuj wykonać więcej testów integracji z częściowym systemem (patrz Piramida testowa
Schneider
1
@ Schneider mówi to dobrze, testy integracyjne nie powinny testować „systemu jako całości”. Takie testy byłyby uważane za „testy kompleksowe” lub „testy systemowe”, w zależności od zakresu, który rozważasz w swoim projekcie. Kompleksowe testy mogą obejmować przepływ danych „jako całość”, który przebiega przez wiele systemów, a system testuje tylko „jeden system jako całość”.
RoyB
Oto jak je zdefiniowałem, aby uniknąć nieporozumień związanych z szerokim zastosowaniem testu „Integracja”. Testy jednostkowe -> testuje najmniejszą jednostkę pracy, metodę w klasie, która nie wywołuje żadnego innego kodu poza tą metodą (w razie potrzeby wyśmiewa zależności) Testy integracyjne -> testy o większym zakresie z testów jednostkowych, w których mogą i powinny testować warstwy aplikacji współpracujące ze sobą, ale NIE całą aplikację gdzieś wdrożono.) Testy funkcjonalne / test akceptacyjny -> testy testujące wdrożoną wersję aplikacji
Kevin M
16

Osobiście lubię myśleć o teście integracji jako o teście funkcji, gdy każdy element systemu jest prawdziwy , bez fałszywych obiektów.

Prawdziwe repozytorium, prawdziwa baza danych, prawdziwy interfejs użytkownika. Testowane są określone funkcje, gdy system jest w pełni zmontowany i wygląda tak, jak powinien być po wdrożeniu.


źródło
4
Zgadzam się, z tym wyjątkiem, że nie musi to być system „w pełni zmontowany”. Możesz (i należy) przeprowadzić testy integracyjne z podzestawami całego systemu, ponieważ jest to zwykle tańsze / łatwiejsze.
Schneider
Integrację między 2 jednostkami / komponentami można również „przetestować pod kątem integracji”, podczas gdy reszta jest nadal wyśmiewana. Stąd wiele frameworków testujących integrację pozwala na kpiny :)
RoyB 14.10.16
1
Mam testy w aplikacji Spring Boot, która testuje interfejs użytkownika (kontrakt API) w kontenerze Spring, ale wyśmiewa warstwę repozytorium / danych. Wykorzystuje więc wyśmiewane repozytoria / dane, ale łączy warstwę kontrolera i przeprowadza zestawienie Jacksona itp. Test integracji.
Kevin M
8

W moim (przyznaję) małym doświadczeniu zrozumiałem, że słowo integracja może naprawdę powodować nieporozumienia: naprawdę trudno jest znaleźć coś całkowicie izolowanego w systemie, niektóre elementy na pewno będą wymagać pewnej integracji.

W ten sposób przyzwyczaiłem się do następujących rozróżnień:

  • Używam testu jednostkowego, aby zidentyfikować, udokumentować i podkreślić wszystkie zachowania, które klasa, którą testuję, jest odpowiedzialna za osiągnięcie.
  • Robię testy integracyjne, ilekroć mam komponent (może więcej niż jeden) w moim systemie, który prowadzi rozmowę z innym „ zewnętrznym ” systemem. (kontynuuje poniżej ...)
  • I wdrożyć kontrolę odbioru do zdefiniowania, dokumentowania i stres pewien przepływ pracy, który jest oczekiwany przez system.

W definicji testu integracji przez zewnętrzny miałem na myśli system, który jest poza moim zakresem programistycznym : z jakiegokolwiek powodu nie mogę natychmiast zmienić sposobu ich działania. Może to być biblioteka, składnik systemu, którego nie można zmienić (tzn. Jest współdzielony z innymi projektami w firmie), dbms itp. Do tych testów muszę skonfigurować coś bardzo podobnego do rzeczywistego środowiska systemu będzie działał w: system zewnętrzny musi zostać zainicjowany i ustawiony na określony stan; realistyczne dane muszą być zarejestrowane w bazie danych; itp.

Zamiast tego, kiedy przeprowadzam testy akceptacyjne, podrabiam rzeczy: pracuję nad czymś innym, pracuję nad specyfikacjami systemu, a nie nad jego zdolnością do współpracy z podmiotami zewnętrznymi.

To naprawdę jest węższy pogląd w porównaniu z tym, co opisał KeesDijk wcześniej, ale przypuszczam, że projekty, nad którymi pracowałem do tej pory, były wystarczająco małe, aby pozwolić mi na ten poziom uproszczenia.

Marco Ciambrone
źródło
6

Test integracyjny sprawdza, czy elementy złożonego systemu (np. Oprogramowanie, samolot, elektrownia) działają razem zgodnie z przeznaczeniem.

Wyobraźmy sobie, że mówimy o samolocie (z oprogramowaniem jest bardziej abstrakcyjne i trudne do zrobienia). Testy integracyjne obejmują sprawdzenie:

  • poprawna interakcja między niektórymi komponentami. Przykład: po naciśnięciu przycisku Start silnik uruchamia się, a śmigło osiąga oczekiwaną prędkość obrotową (dron nadal pozostaje na ziemi)
  • poprawna interakcja z komponentami zewnętrznymi. Przykład: sprawdź, czy wbudowane radio może komunikować się z radiem stacjonarnym (dron nadal znajduje się na ziemi)
  • poprawna interakcja między wszystkimi zaangażowanymi komponentami, aby system jako całość działał zgodnie z oczekiwaniami. Przykład: załoga pilotów testowych i inżynierów uruchamia samolot i lata nim (wszyscy noszą spadochrony ...).

Test integracji rozwiązuje problem techniczny , a mianowicie to, że system działa pomimo podziału na komponenty. W oprogramowaniu komponentami mogą być przypadki użycia, moduły, funkcje, interfejsy, biblioteki itp.

Test akceptacyjny sprawdza, czy produkt jest odpowiedni do określonego celu. Zasadniczo są one wykonywane przez klienta. Przyjmując analogię samolotu, obejmują sprawdzenie, czy:

  • przewidywane scenariusze biznesowe prowadzą do oczekiwanego rezultatu w niemal realnej sytuacji. Przykład: przećwicz próbę wejścia na pokład z pasażerami testowymi, aby sprawdzić, czy personel może monitorować wejście na pokład zgodnie z oczekiwaniami za pomocą procedur operacyjnych. Niektóre scenariusze mogą być tak proste, że wyglądałyby jak test jednostkowy, ale są wykonywane przez użytkownika (np. Wypróbuj wtyczki elektryczne ze sprzętem firm).
  • system działa w niemal realnej sytuacji biznesowej. Przykład: wykonaj pusty lot testowy między dwoma prawdziwymi miejscami docelowymi, z nowo wyszkolonymi pilotami z linii lotniczej, aby sprawdzić, czy zużycie paliwa jest zgodne z obietnicą.

Test akceptacyjny dotyczy bardziej kwestii odpowiedzialności . W relacji klient / dostawca może to być odpowiedzialność umowna (zgodność ze wszystkimi wymogami). Ale w każdym przypadku obowiązkiem organizacji używającej jest zapewnienie, aby ich obowiązki mogły być wykonywane z systemem i ostrożnie zapobiegać wszelkim nieprzewidzianym problemom (np. Ta korporacja kolejowa, która podczas testów akceptacyjnych odkryła, że ​​musiała skrócić niektóre quais, ponieważ nowe wagony były o 5 cm za duże - bez żartów!).

Wnioski: Testy integracji i akceptacji pokrywają się. Obaj zamierzają pokazać, że system jako całość działa. Jednak „całość” może być większa dla klienta (ponieważ sam system może być częścią większego systemu organizacyjnego) i bardziej techniczna dla integratora systemu:

wprowadź opis zdjęcia tutaj

Christophe
źródło
1

Testy integracyjne to nic innego jak sprawdzenie połączenia i poprawności przepływu danych między dwoma lub więcej modułami.

Na przykład: gdy tworzymy pocztę (jeden moduł) i wysyłamy ją do ważnego identyfikatora użytkownika (drugi moduł), testowanie integracji polega na sprawdzeniu, czy wysłana poczta znajduje się w wysłanych elementach.

Anita
źródło
3
Witamy w Programistach. Co dodaje twoja odpowiedź, która nie została jeszcze podana w istniejących odpowiedziach? Programmers.SE nie przypomina tradycyjnych forów. Koncentruje się na wysokiej jakości pytaniach i odpowiedziach zamiast wielu rozmów. Proszę spojrzeć na turystycznej stronie więcej informacji na temat jak działa strona.
0

Jedna praktyczna definicja testu integracji to: Każdy test, który wymaga interakcji z czymś poza procesem.

Na przykład:

  • System plików
  • Sieć
  • Baza danych
  • Zewnętrzny interfejs API

Istnieje pewien rodzaj umowy między twoim procesem a światem zewnętrznym, a minimalna weryfikacja tej umowy powinna być celem testu integracyjnego. tzn. nie powinno to nic więcej niż weryfikować umowy. Jeśli tak, to zbliżasz się do przestrzeni systemowej / end-to-end.

Testy jednostkowe są w stanie przetestować całą logikę w granicach procesu i mogą to zrobić z łatwością właśnie z powodu braku zależności od powolnego / kruchego / złożonego „świata zewnętrznego”.

Chociaż istnieją testy integracyjne, definicja ta nie obejmuje (stąd dlaczego nazwałem ją praktyczną definicją), myślę, że są one znacznie mniej popularne / przydatne.

NB Ściśle mówiąc, tak, ta definicja obejmie również testy systemowe / kompleksowe. W mojej filozofii są one formą „ekstremalnego” testu integracji, dlatego ich nazwy podkreślają inny aspekt. W drugim kierunku test jednostkowy można uznać za test całkowania zerowych składników, tzn. Wszystkie testy można uznać za leżące gdzieś na spektrum całkowania, integrujące między składnikami 0-n :-)

Schneider
źródło
Gdy masz dwie jednostki, każdą testujesz za pomocą testu jednostkowego. Kiedy te dwie jednostki integrują się ze sobą, testujesz integrację za pomocą testu integracji. Nie muszą być „poza procesem”, a tego rodzaju testy są niezwykle powszechne.
Bryan Oakley
Masz całkowitą rację - nie musi być poza procesem, aby być testem integracyjnym. Dlatego starałem się wyjaśnić, że moja odpowiedź była raczej „ogólną zasadą” (ale być może nie powiodła się). Nie zgadzam się jednak, że testy integracji między jednostkami są „niezwykle powszechne”. Testy integracyjne bez procesu są o wiele bardziej powszechne w moim doświadczeniu i często są bardzo cenne, dlatego moja odpowiedź podkreśla ten aspekt testów integracyjnych.
Schneider,