Co to jest testowanie jednostkowe i jak to zrobić? [duplikat]

Dokładny duplikat wielu postów:

Czym jest testowanie jednostkowe?
co sprawia, że dobry test jednostkowy?
nowość w testach jednostkowych
testy jednostkowe-definicje
Testowanie jednostek dydaktycznych
Jak prawidłowo wykonać makietę i test jednostkowy
testy jednostkowe: pytania dla początkujących
i wiele innych ...
Również Google dla site:stackoverflow.com "how do you" unit-test

Przeczytałem kilka pytań na temat jednostki testuję, ale nie wiem dokładnie, co to jest i jak to robisz. Miałem nadzieję, że jeśli ktoś może mi powiedzieć, co następuje:

  • czym dokładnie są testy jednostkowe? Czy jest wbudowany w KOD czy uruchamiany jako oddzielne programy? Albo coś innego?
  • Jak ty to robisz?
  • Kiedy należy to zrobić? Czy są czasy lub projekty, aby tego nie robić? Czy wszystko można przetestować jednostkowo?
Wielkie dzięki za pomoc.
 102
Author: Community, 2009-03-17

7 answers

Testowanie jednostkowe polega na rozbiciu programu na kawałki i poddaniu każdego elementu serii testów.

Zazwyczaj testy są uruchamiane jako oddzielne programy, ale sposób testowania różni się w zależności od języka i rodzaju oprogramowania (GUI, wiersz poleceń, biblioteka).

Większość języków posiada frameworki do testowania jednostkowego, powinieneś poszukać takiego dla siebie.

Testy są zwykle uruchamiane okresowo, często po każdej zmianie kodu źródłowego. Im częściej lepiej, bo im szybciej złapiesz problemy.

 42
Author: MattJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 23:17:32

Co to jest testowanie jednostkowe?

Testy jednostkowe po prostu sprawdzają, czy poszczególne jednostki kodu (głównie funkcje) działają zgodnie z oczekiwaniami. Zazwyczaj piszesz przypadki testowe samodzielnie, ale niektóre mogą być generowane automatycznie.

Wyjście z testu może być tak proste, jak wyjście konsoli, do "green light " W interfejsie graficznym, takim jak NUnit , lub inny framework specyficzny dla języka.

Wykonywanie testów jednostkowych ma być proste, generalnie testy są napisane w forma funkcji, która określi, czy zwracana wartość jest równa wartości, której oczekiwałeś podczas pisania funkcji (lub wartości, której oczekujesz , gdy W końcu ją napiszesz - nazywa się to Test Driven Development , gdy piszesz testy jako pierwszy).

Jak wykonać testy jednostkowe?

Wyobraź sobie bardzo prostą funkcję, którą chciałbyś przetestować:

int CombineNumbers(int a, int b) {
    return a+b;
}

Kod testu jednostkowego wyglądałby jak to:

void TestCombineNumbers() {
    Assert.IsEqual(CombineNumbers(5, 10), 15); // Assert is an object that is part of your test framework
    Assert.IsEqual(CombineNumbers(1000, -100), 900);
}

Kiedy wykonasz testy, zostaniesz poinformowany, że te testy przeszły pomyślnie. Teraz, gdy zbudowałeś i uruchomiłeś testy, wiesz, że ta konkretna funkcja lub jednostka będzie działać zgodnie z oczekiwaniami.

Teraz wyobraź sobie, że pojawia się inny programista i zmienia funkcję CombineNumbers() dla wydajności, lub z innego powodu:

int CombineNumbers(int a, int b) {
    return a * b;
}

Kiedy programista uruchomi testy, które utworzyłeś dla tej bardzo prostej funkcji, zobaczy, że pierwsza Assert nie powiedzie się, a oni teraz wiedz, że konstrukcja jest zepsuta.

Kiedy należy wykonać testy jednostkowe?

Powinny być wykonywane tak często, jak to możliwe. Kiedy wykonujesz testy w ramach procesu rozwoju, Twój kod będzie automatycznie zaprojektowany lepiej niż Jeśli po prostu napisałeś funkcje, a następnie ruszyłeś dalej. Również koncepcje takie jak Dependency Injection będą ewoluować naturalnie w Twoim kodzie.

Najbardziej oczywistą korzyścią jest świadomość, że gdy zmiana jest wykonane, żadne inne jednostki kodu nie miały wpływu na to, jeśli wszystkie przechodzą testy.

 123
Author: John Rasch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 22:25:08

Co?..

Metodologia automatycznego testowania kodu przed zestawem testów, zaprojektowana w celu wyegzekwowania pożądanych wyników i zarządzania zmianami.

"jednostka" w tym sensie jest najmniejszym atomowym składnikiem kodu, który ma sens do testowania, zazwyczaj metodą jakiejś klasy na przykład. Częścią tego procesu jest tworzenie obiektów stub (lub "mocks"), które pozwalają na pracę z jednostką jako niezależnym obiektem.

Jak...

Prawie zawsze, proces testowania jednostkowego jest wbudowany w IDE (lub poprzez rozszerzenia) tak, że wykonuje testy z każdą kompilacją. Istnieje wiele frameworków wspomagających tworzenie testów jednostkowych (a nawet mockowych obiektów), często nazywanych fooUnit (por. jUnit, xUnit, nUnit). Ramy te zapewniają sformalizowany sposób tworzenia testów.

Test driven development (TDD) jest często motywacją do testowania jednostkowego (ale testowanie jednostkowe nie wymaga TDD), co zakłada, że testy są częścią definicji spec i dlatego wymaga, aby były napisane jako pierwsze, z kodem napisanym tylko w celu "rozwiązania" tych testów.

Kiedy...

prawie zawsze. Bardzo małe, odrzucane projekty mogą nie być tego warte, ale tylko wtedy, gdy jesteś pewien, że naprawdę są odrzucane. W teorii każdy program zorientowany obiektowo jest testowalny jednostkowo, ale niektóre pattrny projektowe utrudniają to. Notorycznie wzór Singletona jest problematyczny, gdzie odwrotnie struktura iniekcji zależnościowej jest bardzo zorientowana na testy jednostkowe.

 11
Author: annakata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 22:17:37

Co to jest unittesting? To trudne do zdefiniowania. Na poziomie technicznym budujesz funkcje, które wywołują funkcje w bazie kodowej i sprawdzają wyniki. Zasadniczo dostajesz kilka rzeczy takich jak "assert(5+3) == 8", po prostu bardziej skomplikowane (jak w DataLayer(MockDatabase ()). getUser (). name = = "Dilbert"). Na poziomie widoku narzędzia dodajesz zautomatyzowane, specyficzne dla projektu sprawdzenie, czy wszystko nadal działa tak, jak zakładałeś, że wszystko działa. Jest to bardzo, bardzo pomocne, jeśli refakturujesz i wdrożysz skomplikowane algorytmy. Rezultatem jest na ogół masa dokumentacji i dużo mniej błędów, ponieważ zachowanie kodu jest przypięte.

Buduję przypadki testowe dla wszystkich przypadków brzegowych i uruchamiam je podobnie do działania generacyjnego garbage collector. Podczas gdy implementuję klasę, uruchamiam tylko przypadki testowe, które dotyczą klasy. Kiedy skończę pracować nad tą klasą, uruchamiam wszystkie testy, aby sprawdzić, czy wszystko nadal działa.

Powinieneś przetestować tyle, ile możliwe, o ile kod testowy jest wystarczająco łatwy, aby pozostać nieprzetestowany. Biorąc to pod uwagę, nie, nie wszystko można przetestować w rozsądny sposób. Pomyśl o interfejsach użytkownika. Pomyśl o sterowniku dla promu kosmicznego lub bomby atomowej (przynajmniej nie z czystymi testami JUnit;)). Jednak wiele i wiele kodu można przetestować. Datastruktury są. Algorytmy są. Większość Applicationlogic-klasy są. Więc przetestuj to!

HTH. tetha

 4
Author: Tetha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 22:09:00

Uważam, że najprostszym sposobem na zilustrowanie tego jest przyjrzenie się jakiemuś kodowi. Ta strona startowa na stronie NUnit jest dobrym wprowadzeniem do tego, co i jak

Http://www.nunit.org/index.php?p=quickStart&r=2.5

Czy wszystko można przetestować? Ogólnie jeśli coś wylicza to tak. Kod interfejsu użytkownika to zupełnie inny problem, z którym można sobie poradzić, ponieważ symulowanie użytkowników klikających przyciski jest trudne.

Co należy przetestować? Mam tendencję do pisania testów wokół rzeczy I wiem, że to będzie trudne. Skomplikowane zmiany stanu, krytyczne obliczenia biznesowe, tego typu rzeczy. Generalnie nie martwię się zbytnio testowaniem podstawowych rzeczy wejściowych/wyjściowych, chociaż puryści bez wątpienia powiedzą, że się mylę i Wszystko powinno być przetestowane. Jak wiele innych rzeczy, nie ma właściwej odpowiedzi!

 2
Author: MarcE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 22:13:30

Czym dokładnie jest testowanie jednostkowe? Czy to wbudowany w kod lub uruchamiany jako osobny programy? Albo coś innego?

Od MSDN : głównym celem testów jednostkowych jest pobranie najmniejszego elementu testowalnego oprogramowania w aplikacji, odizolowanie go od reszty kodu i ustalenie, czy zachowuje się dokładnie tak, jak oczekujesz.

Zasadniczo piszesz małe bity kodu, aby przetestować poszczególne bity kodu. W świecie. NET można by uruchomić te małe kawałki kodu przy użyciu czegoś takiego jak NUnit lub MBunit lub nawet wbudowanych narzędzi testowych w visual studio. W Javie można użyć JUnit. Zasadniczo biegacze testowe zbudują Twój projekt, załadują i wykonają testy jednostkowe, a następnie poinformują Cię, czy zdają lub nie.

Jak ty to robisz?
Łatwiej powiedzieć niż zrobić test jednostkowy. Potrzeba sporo praktyki, aby być w tym dobrym. Musisz skonstruować swój kod w sposób ułatwiający testowanie jednostkowe aby twoje testy były skuteczne.
Kiedy należy to zrobić? Czy są czasy lub projekty, aby tego nie robić? Na wszystko można przetestować jednostkowo?
Powinieneś to robić tam, gdzie ma to sens. Nie wszystko nadaje się do testów jednostkowych. Na przykład kod interfejsu użytkownika jest bardzo trudny do przetestowania jednostkowego i często uzyskujesz z tego niewielkie korzyści. Kod warstwy biznesowej jest jednak często bardzo odpowiedni do testów i na tym skupia się większość testów jednostkowych.

Testy jednostkowe to ogromny temat i do w pełni zrozumieć, w jaki sposób może to najlepiej przynieść ci korzyści polecam zdobycie książki na temat testów jednostkowych, takiej jak " {23]}Test Driven Development by Example ", która da ci dobre zrozumienie pojęć i sposobu zastosowania ich do kodu.

 1
Author: lomaxx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 22:08:31

W części "Jak to zrobić":

Myślę, że wprowadzenie do ScalaTest dobrze ilustruje różne style testów jednostkowych.

W części "kiedy to zrobić":

Testowanie jednostkowe to nie tylko testowanie. Wykonując testy jednostkowe, wymusisz również projektowanie oprogramowania w coś, co można przetestować jednostkowo. Wiele osób uważa, że ten projekt jest w większości dobry (TM), niezależnie od innych korzyści z testów.

So one powodem do przeprowadzenia testu jednostkowego jest zmuszenie twojego projektu do czegoś, co, miejmy nadzieję, będzie łatwiejsze do utrzymania, gdyby nie zaprojektowano go do testów jednostkowych.

 0
Author: John Nilsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 22:24:49