Dla mnie kluczową różnicą jest to, że testy integracyjne ujawniają, czy dana funkcja działa, czy jest zepsuta, ponieważ kładą nacisk na kod w scenariuszu zbliżonym do rzeczywistości. Przywołują jedną lub więcej metod lub funkcji oprogramowania i sprawdzają, czy działają zgodnie z oczekiwaniami.
Przeciwnie, test jednostkowy testujący pojedynczą metodę opiera się na (często błędnym) założeniu, że reszta oprogramowania działa poprawnie, ponieważ jawnie kpi z każdej zależności.
Dlatego, gdy test jednostkowy metody implementującej jakąś funkcję jest zielony, nie oznacza to, że funkcja działa.
Powiedz, że masz taką metodę:
public SomeResults DoSomething(someInput) {
var someResult = [Do your job with someInput];
Log.TrackTheFactYouDidYourJob();
return someResults;
}
DoSomething
jest bardzo ważny dla twojego klienta: to funkcja, jedyna rzecz, która ma znaczenie. Dlatego zwykle piszesz specyfikację Ogórka, potwierdzając ją: chcesz zweryfikować i poinformować, że funkcja działa, czy nie.
Feature: To be able to do something
In order to do something
As someone
I want the system to do this thing
Scenario: A sample one
Given this situation
When I do something
Then what I get is what I was expecting for
Bez wątpienia: jeśli test się powiedzie, możesz stwierdzić, że dostarczasz działającą funkcję. To właśnie można nazwać wartością biznesową .
Jeśli chcesz napisać test jednostkowy DoSomething
, powinieneś udawać (używając niektórych prób ), że pozostałe klasy i metody działają (to znaczy, że wszystkie zależności, których używa metoda, działają poprawnie) i upewnić się, że metoda działa.
W praktyce robisz coś takiego:
public SomeResults DoSomething(someInput) {
var someResult = [Do your job with someInput];
FakeAlwaysWorkingLog.TrackTheFactYouDidYourJob(); // Using a mock Log
return someResults;
}
Możesz to zrobić za pomocą Dependency Injection, metody Factory lub dowolnego Mock Framework lub po prostu rozszerzając testowaną klasę.
Załóżmy, że występuje błąd Log.DoSomething()
. Na szczęście specyfikacja Korniszon znajdzie to, a kompleksowe testy zakończą się niepowodzeniem.
Ta funkcja nie działa, ponieważ Log
jest zepsuta, a nie dlatego, że [Do your job with someInput]
nie wykonuje swojej pracy. A tak przy okazji, [Do your job with someInput]
to jedyna odpowiedzialność za tę metodę.
Załóżmy również, że Log
jest używany w 100 innych funkcjach, w 100 innych metodach z 100 innych klas.
Tak, 100 funkcji zakończy się niepowodzeniem. Ale na szczęście 100 kompleksowych testów również nie udaje się i ujawnia problem. I tak: mówią prawdę .
To bardzo przydatna informacja: wiem, że mam zepsuty produkt. Jest to również bardzo myląca informacja: nie mówi mi nic o tym, gdzie jest problem. Przekazuje mi objaw, a nie pierwotną przyczynę.
Jednak DoSomething
test jednostkowy jest zielony, ponieważ wykorzystuje fałszywy Log
, zbudowany tak, aby nigdy się nie łamał. I tak: wyraźnie kłamie . Komunikowanie, że uszkodzona funkcja działa. Jak to może być przydatne?
(Jeśli DoSomething()
test jednostkowy nie powiedzie się, upewnij się: [Do your job with someInput]
ma kilka błędów.)
Załóżmy, że jest to system z uszkodzoną klasą:
Jeden błąd spowoduje uszkodzenie kilku funkcji, a kilka testów integracji zakończy się niepowodzeniem.
Z drugiej strony ten sam błąd przerwie tylko jeden test jednostkowy.
Teraz porównaj dwa scenariusze.
Ten sam błąd przerwie tylko jeden test jednostkowy.
- Wszystkie funkcje używające uszkodzonego
Log
są czerwone
- Wszystkie testy jednostkowe są zielone, tylko test jednostkowy
Log
jest czerwony
W rzeczywistości testy jednostkowe dla wszystkich modułów korzystających z uszkodzonej funkcji są zielone, ponieważ dzięki próbom usunięto zależności. Innymi słowy, działają w idealnym, całkowicie fikcyjnym świecie. Jest to jedyny sposób na izolowanie błędów i poszukiwanie ich. Testowanie jednostkowe oznacza kpiny. Jeśli nie kpisz, nie przeprowadzasz testów jednostkowych.
Różnica
Testy integracyjne pokazują, co nie działa. Ale nie mają sensu zgadywać, gdzie może być problem.
Testy jednostkowe to jedyne testy, które pokazują, gdzie dokładnie jest błąd. Aby narysować te informacje, muszą uruchomić metodę w fałszywym środowisku, w którym wszystkie inne zależności powinny działać poprawnie.
Dlatego myślę, że twoje zdanie „Czy to tylko test jednostkowy obejmujący 2 klasy” jest w jakiś sposób przesunięte. Test jednostkowy nigdy nie powinien obejmować 2 klas.
Ta odpowiedź jest w zasadzie streszczeniem tego, co tu napisałem: Testy jednostkowe kłamią, dlatego je uwielbiam .
Kiedy piszę testy jednostkowe, ograniczam zakres testowanego kodu do klasy, którą obecnie piszę, kpiąc z zależności. Jeśli piszę klasę zdań, a zdanie ma zależność od programu Word, użyję próbnego słowa. Szydząc z programu Word, mogę skupić się tylko na jego interfejsie i przetestować różne zachowania mojej klasy Zdanie, gdy wchodzi ona w interakcję z interfejsem programu Word. W ten sposób testuję tylko zachowanie i implementację Zdania, a jednocześnie nie testuję implementacji Słowa.
Po napisaniu testów jednostkowych, aby upewnić się, że zdanie działa poprawnie podczas interakcji z programem Word opartym na interfejsie programu Word, następnie piszę test integracji, aby upewnić się, że moje założenia dotyczące interakcji są prawidłowe. W tym celu dostarczam rzeczywiste obiekty i piszę test, który ćwiczy funkcję, która zakończy się użyciem zarówno Zdania, jak i Słowa.
źródło
Moje 10 bitów: D
Zawsze mi mówiono, że testy jednostkowe to testowanie pojedynczego komponentu - które należy wykonać w pełni. Teraz ma to zwykle wiele poziomów, ponieważ większość elementów składa się z mniejszych części. Dla mnie jednostka jest funkcjonalną częścią systemu. Musi więc podać coś wartościowego (tj. Nie metodę parsowania ciągów, ale może HtmlSanitizer ).
Testy integracyjne to kolejny krok w górę, obejmujący jeden lub więcej składników i upewniający się, że współpracują ze sobą tak, jak powinny. Jesteś wtedy ponad zawiłościami martwienia się o to, jak poszczególne składniki działają indywidualnie, ale kiedy wpiszesz html w HtmlEditControl , to jakoś magicznie wie, czy jest to ważne czy nie ...
To jednak prawdziwa ruchoma linia. Wolę bardziej skupić się na tym, żeby ten cholerny kod działał na pełnych obrotach ^ _ ^
źródło
Testy jednostkowe wykorzystują symulacje
Mówisz o testach integracyjnych, które faktycznie testują całą integrację twojego systemu. Ale kiedy przeprowadzasz testy jednostkowe, powinieneś faktycznie przetestować każdą jednostkę osobno. Wszystko inne powinno być wyśmiewane. Tak więc w przypadku
Sentence
klasy, jeśli korzysta ona zWord
klasy, twojaWord
klasa powinna być wyśmiewana. W ten sposób przetestujesz tylkoSentence
funkcjonalność swojej klasy.źródło
Myślę, że kiedy zaczynasz myśleć o testach integracyjnych, mówisz raczej o skrzyżowaniu warstw fizycznych niż warstwach logicznych.
Na przykład, jeśli twoje testy dotyczą samego generowania treści, jest to test jednostkowy: jeśli twój test dotyczy samego zapisu na dysk, jest to nadal test jednostkowy, ale po przetestowaniu zarówno operacji we / wy ORAZ zawartości pliku, wtedy masz test integracyjny. Kiedy testujesz wyjście funkcji w ramach usługi, jest to test jednostkowy, ale kiedy wykonasz zgłoszenie serwisowe i zobaczysz, czy wynik funkcji jest taki sam, to jest to test integracyjny.
Z technicznego punktu widzenia i tak nie można testować jednostkowo tylko jednej klasy. Co jeśli twoja klasa składa się z kilku innych klas? Czy to automatycznie czyni go testem integracyjnym? Nie wydaje mi się
źródło
za pomocą projektu Pojedyncza odpowiedzialność, jest czarno-biały. Więcej niż 1 odpowiedzialność, to test integracyjny.
Według testu kaczki (wygląd, szarlatany, kałuże, to kaczka), to tylko test jednostkowy z więcej niż 1 nowym obiektem.
Kiedy wchodzisz do mvc i testujesz go, testy kontrolera są zawsze integracją, ponieważ kontroler zawiera zarówno jednostkę modelową, jak i jednostkę widokową. Testując logikę w tym modelu, nazwałbym test jednostkowy.
źródło
Charakter twoich testów
Badanej jednostki modułu X jest test, który oczekuje na (i) sprawdza problemy tylko moduł X.
Test integracyjny wielu modułów jest testem, który oczekuje problemów wynikających ze współpracy między nimi modułami, tak że problemy te byłyby trudne do znalezienia przy użyciu samych testów jednostkowych.
Pomyśl o charakterze swoich testów w następujący sposób:
Pamiętaj, że test integracyjny może nadal zniszczyć / podrobić / wykpić niektóre z jego zależności. Zapewnia to dużo pośredniego poziomu między testami jednostkowymi a testami systemowymi (najbardziej kompleksowe testy integracyjne, testowanie całego systemu).
Pragmatyczne podejście do korzystania z obu
Tak pragmatyczne podejście byłoby takie: elastycznie polegaj na testach integracyjnych w miarę możliwości i używaj testów jednostkowych tam, gdzie byłoby to zbyt ryzykowne lub niewygodne. Ten sposób myślenia może być bardziej przydatny niż pewna dogmatyczna dyskryminacja testów jednostkowych i testów integracyjnych.
źródło
W teście jednostkowym testujesz każdą izolowaną część:
w teście integracyjnym testujesz wiele modułów swojego systemu:
i tak się dzieje, gdy używasz tylko testów jednostkowych (ogólnie oba okna działają, niestety nie razem):
Źródła: source1 source2
źródło
Moim zdaniem odpowiedź brzmi „Dlaczego to ma znaczenie?”
Czy to dlatego, że testy jednostkowe to coś, co robisz, a testy integracyjne to coś, czego nie robisz? Lub odwrotnie? Oczywiście, że nie, powinieneś spróbować zrobić jedno i drugie.
Czy to dlatego, że testy jednostkowe muszą być szybkie, izolowane, powtarzalne, samo sprawdzające i na czas, a testy integracyjne nie powinny? Oczywiście, że nie, wszystkie testy powinny być tymi.
Czy to dlatego, że używasz próbnych testów w testach jednostkowych, ale nie używasz ich w testach integracyjnych? Oczywiście nie. Oznaczałoby to, że jeśli mam przydatny test integracyjny, nie wolno mi dodawać próbnego elementu, obawiam się, że będę musiał zmienić nazwę mojego testu na „test jednostkowy” lub przekazać go innemu programistowi do pracy.
Czy to dlatego, że testy jednostkowe testują jedną jednostkę, a testy integracyjne testują kilka jednostek? Oczywiście nie. Jakie to praktyczne znaczenie? Teoretyczna dyskusja na temat zakresu testów i tak załamuje się w praktyce, ponieważ termin „jednostka” jest całkowicie zależny od kontekstu. Na poziomie klasy jednostka może być metodą. Na poziomie zespołu jednostka może być klasą, a na poziomie usługi jednostka może być komponentem. A nawet klasy używają innych klas, więc jaka jest jednostka?
To nie ma znaczenia.
Testowanie jest ważne, PIERWSZE jest ważne, dzielenie się włosami na temat definicji jest stratą czasu, która tylko myli nowicjuszy w testowaniu.
źródło
Myślę, że nadal nazwałbym kilka oddziaływujących klas testem jednostkowym, pod warunkiem, że testy jednostkowe dla klasy 1 testują cechy klasy 1, a testy jednostkowe dla klasy 2 testują jej funkcje, a także że nie uderzają w bazę danych.
Test nazywam testem integracyjnym, gdy przechodzi przez większość mojego stosu, a nawet trafia do bazy danych.
Naprawdę podoba mi się to pytanie, ponieważ dyskusja TDD wydaje mi się czasami zbyt purystyczna i dobrze jest zobaczyć konkretne przykłady.
źródło
Robię to samo - nazywam je wszystkimi testami jednostkowymi, ale w pewnym momencie mam „test jednostkowy”, który obejmuje tak wiele, że często zmieniam nazwę na „..IntegrationTest” - tylko zmiana nazwy, nic innego się nie zmienia.
Myślę, że istnieje kontynuacja od „testów atomowych” (testowanie jednej małej klasy lub metody) do testów jednostkowych (poziom klasy) i testów integracyjnych - a następnie testu funkcjonalnego (który zwykle obejmuje znacznie więcej rzeczy z góry na dół) - wydaje się, że nie ma czystego odcięcia.
Jeśli twój test konfiguruje dane i być może ładuje bazę danych / plik itp., Być może jest to raczej test integracyjny (testy integracyjne, które według mnie używają mniej próbnych i bardziej rzeczywistych klas, ale to nie znaczy, że nie możesz wyśmiewać niektórych systemu).
źródło
Testowanie jednostkowe to metoda testowania, która sprawdza, czy poszczególne jednostki kodu źródłowego działają poprawnie.
Testy integracyjne to faza testowania oprogramowania, w której poszczególne moduły oprogramowania są łączone i testowane jako grupa.
Wikipedia definiuje jednostkę jako najmniejszą testowalną część aplikacji, która w Javie / C # jest metodą. Ale w twoim przykładzie klasy Słowo i Zdanie prawdopodobnie po prostu napisałbym testy zdania, ponieważ prawdopodobnie uznałbym, że używanie fałszywej klasy słów w celu przetestowania klasy zdań byłoby przesadą . Tak więc zdanie byłoby moją jednostką, a słowo jest szczegółem implementacyjnym tej jednostki.
źródło
Testy integracji: Testowana jest trwałość bazy danych.
Testy jednostkowe: dostęp do bazy danych jest wyśmiewany. Metody kodu są testowane.
źródło
Testowanie jednostkowe polega na testowaniu pod kątem jednostki pracy lub bloku kodu, jeśli chcesz. Zwykle wykonywane przez jednego programistę.
Testowanie integracji odnosi się do testu, który jest przeprowadzany, najlepiej na serwerze integracyjnym, gdy programista przekazuje swój kod do repozytorium kontroli źródła. Testy integracyjne mogą być wykonywane przez narzędzia takie jak Cruise Control.
Więc wykonujesz testy jednostkowe, aby sprawdzić, czy jednostka pracy, którą zbudowałeś, działa, a następnie test integracyjny sprawdza, czy wszystko, co dodałeś do repozytorium, nie zepsuło czegoś innego.
źródło
Nazywam testy jednostkowe tymi testami, w których biała skrzynka testuje klasę. Wszelkie zależności wymagane przez klasę są zastępowane fałszywymi (próbnymi).
Testy integracyjne to testy, w których jednocześnie testowanych jest wiele klas i ich interakcji. Tylko niektóre zależności w tych przypadkach są sfałszowane / wyśmiewane.
Nie nazwałbym testów integracji Kontrolera, chyba że jedna z ich zależności jest prawdziwa (tj. Nie sfałszowana) (np. IFormsAuthentication).
Rozdzielenie dwóch typów testów jest przydatne do testowania systemu na różnych poziomach. Testy integracyjne są również długotrwałe, a testy jednostkowe powinny być szybkie. Rozróżnienie prędkości wykonania oznacza, że są wykonywane inaczej. W naszych procesach programistycznych testy jednostkowe są przeprowadzane przy odprawie (co jest w porządku, ponieważ są bardzo szybkie), a testy integracyjne są przeprowadzane raz / dwa razy dziennie. Próbuję uruchamiać testy integracyjne tak często, jak to możliwe, ale zwykle uderzam w bazę danych / zapisuję do plików / powodując spowolnienie rpc / etc.
Rodzi to kolejną ważną kwestię: testy jednostkowe powinny unikać trafiania we / wy (np. Dysk, sieć, db). W przeciwnym razie dużo spowalniają. Opracowanie tych zależności we / wy zajmuje trochę wysiłku - nie mogę przyznać, że byłem wierny zasadzie „testy jednostkowe muszą być szybkie”, ale jeśli tak, korzyści z dużo większego systemu stają się widoczne bardzo szybko .
źródło
Proste objaśnienie z analogiami
Powyższe przykłady mają się bardzo dobrze i nie muszę ich powtarzać. Dlatego skupię się na użyciu przykładów, które pomogą Ci zrozumieć.
Testy integracyjne
Testy integracyjne sprawdzają, czy wszystko działa razem. Wyobraź sobie serię kół zębatych współpracujących ze sobą w zegarku. Testem integracyjnym byłoby: czy zegarek wskazuje prawidłową godzinę? Czy nadal podaje prawidłową godzinę za 3 dni?
Wszystko, co mówi, to to, czy cały kawałek działa. Jeśli zawiedzie: nie powie dokładnie, gdzie zawodzi.
Testy jednostkowe
To są naprawdę specyficzne typy testów. Mówią ci, czy jedna konkretna rzecz działa, czy nie. Kluczem do tego typu testu jest to, że testuje tylko jedną konkretną rzecz, zakładając, że wszystko inne działa dobrze. To jest kluczowy punkt.
Przykład: omówmy ten punkt na przykładzie:
Używanie skrótów
Załóżmy, że test integracji samochodu nie powiedzie się. Nie prowadzi pomyślnie do Echuca. Gdzie jest problem?
Załóżmy teraz, że Twój silnik korzysta ze specjalnego układu wtryskowego paliwa i że ten test zespołu silnikowego również się nie powiódł. Innymi słowy, zarówno test integracji, jak i test jednostki silnikowej nie powiódł się. Gdzie zatem jest problem? (Daj sobie 10 sekund na odpowiedź).
Czy problem dotyczy silnika lub układu wtrysku paliwa?
Widzisz tutaj problem? Nie wiesz, co dokładnie zawodzi. Jeśli użyjesz różnych zależności zewnętrznych, to każda z tych 10 mogła spowodować problem - i nie będziesz wiedział, od czego zacząć. Dlatego testy jednostkowe wykorzystują kody pośredniczące, aby założyć, że wszystko inne działa dobrze.
źródło
To trochę akademickie pytanie, prawda? ;-) Mój punkt widzenia: Dla mnie test integracyjny jest testem całej części, nie jeśli dwie części na dziesięć idą razem. Nasz test integracji pokazuje, czy kompilacja główna (zawierająca 40 projektów) się powiedzie. Dla projektów mamy mnóstwo testów jednostkowych. Najważniejszą rzeczą dotyczącą testów jednostkowych jest dla mnie to, że jeden test jednostkowy nie może zależeć od innego testu jednostkowego. Zatem dla mnie oba opisane powyżej testy są testami jednostkowymi, jeśli są niezależne. W przypadku testów integracyjnych nie musi to być ważne.
źródło
Myślę, że tak i tak. Twój test jednostkowy obejmujący 2 klasy stał się testem integracyjnym.
Można tego uniknąć, testując klasę Sentence z próbną implementacją - klasę MockWord, co jest ważne, gdy te części systemu są wystarczająco duże, aby mogły zostać zaimplementowane przez różnych programistów. W takim przypadku Word jest testowany jednostkowo sam, Zdanie jest testowane jednostkowo za pomocą MockWord, a następnie Zdanie jest testowane integracyjnie z Word.
Przykładem prawdziwej różnicy może być 1) Tablica 1 000 000 elementów jest łatwo testowana jednostkowo i działa dobrze. 2) BubbleSort jest łatwo testowany jednostkowo na próbnej tablicy 10 elementów, a także działa dobrze 3) Testy integracji pokazują, że coś nie jest tak dobrze.
Jeśli te części są opracowywane przez jedną osobę, najprawdopodobniej problem zostanie znaleziony podczas testowania jednostki BubbleSoft tylko dlatego, że programista ma już prawdziwą tablicę i nie potrzebuje fałszywej implementacji.
źródło
Ponadto należy pamiętać, że zarówno testy jednostkowe, jak i testy integracyjne można zautomatyzować i napisać przy użyciu, na przykład, JUnit. W testach integracyjnych JUnit można użyć tej
org.junit.Assume
klasy do przetestowania dostępności elementów środowiska (np. Połączenie z bazą danych) lub innych warunków.źródło
Jeśli jesteś purystą TDD, piszesz testy przed napisaniem kodu produkcyjnego. Oczywiście testy nie będą się kompilować, więc najpierw musisz je skompilować, a następnie pomyślnie przejść testy.
Możesz to zrobić za pomocą testów jednostkowych, ale nie możesz za pomocą testów integracji lub testów akceptacyjnych. Jeśli spróbujesz z testem integracyjnym, nic się nie skompiluje, dopóki nie skończysz!
źródło