Testy jednostkowe a testy funkcjonalne

Odpowiedzi:

254

Test jednostkowy - testowanie pojedynczej jednostki, takiej jak metoda (funkcja) w klasie, z wykreśleniem wszystkich zależności.

Test funkcjonalny - test integracji AKA, testujący wycinek funkcjonalności w systemie. Spowoduje to przetestowanie wielu metod i może oddziaływać z zależnościami, takimi jak bazy danych lub usługi sieciowe.

bpapa
źródło
170
Nie zgadzam się z „Testem integracji AKA”. Test integracji sprawdza integrację dwóch lub więcej systemów / podsystemów w kodzie. Przykład: sprawdzenie zapytania SQL za pomocą ORM, sprawdza, czy ORM i baza danych działają dobrze. Testy funkcjonalne od końca do końca IMHO.
graffic
7
Zgadzam się z @graffic Functional Test! = Test integracji Musisz pomylić „integrację” między sobą podskładników systemu, takich jak utrzymujący się stan itp. Ale w ogólnym sensie Testy integracji mają znacznie szerszy zakres.
nabster 13.03.15
4
Nie, nie byłem zdezorientowany niczym.
bpapa,
3
Test integracji IS-A Test funkcjonalny. Ale nie odwrotnie. Google „testy funkcjonalne i niefunkcjonalne” i zaznacz „Obrazy”.
Andrejs
4
Ta odpowiedź jest po prostu ZŁA! Testy funkcjonalne nie jest nawet blisko do testu integracyjnego ..
sotn
517

Testy jednostkowe informują programistę, że kod działa poprawnie; testy funkcjonalne informują programistę, że kod robi właściwe rzeczy .

Możesz przeczytać więcej na temat Testowania jednostkowego a testowania funkcjonalnego


Dobrze wyjaśnioną rzeczywistą analogię testów jednostkowych i testów funkcjonalnych można opisać następująco:

Wiele razy rozwój systemu jest porównywany do budowy domu. Chociaż ta analogia nie jest całkiem poprawna, możemy ją rozszerzyć w celu zrozumienia różnicy między testami jednostkowymi i funkcjonalnymi.

Testy jednostkowe są analogiczne do inspekcji budowlanej odwiedzającej plac budowy domu. Koncentruje się na różnych wewnętrznych systemach domu, fundamencie, ramie, instalacji elektrycznej, hydraulice i tak dalej. Zapewnia (testy), że części domu będą działały poprawnie i bezpiecznie, to znaczy będą zgodne z kodeksem budowlanym.

Testy funkcjonalne w tym scenariuszu są analogiczne jak w przypadku właściciela domu odwiedzającego ten sam plac budowy. Zakłada, że ​​systemy wewnętrzne będą się odpowiednio zachowywać, a inspektor budowlany wykonuje swoje zadanie. Właściciel domu koncentruje się na tym, jak to będzie mieszkać w tym domu. Martwi się tym, jak wygląda dom, czy różne pokoje mają wygodny rozmiar, czy dom odpowiada potrzebom rodziny, czy okna są dobrym miejscem, by złapać poranne słońce.

Właściciel domu przeprowadza testy funkcjonalne w domu. Ma perspektywę użytkownika.

Inspektor budowlany przeprowadza testy jednostkowe w domu. Ma perspektywę budowniczego.


Podsumowując

Testy jednostkowe są pisane z perspektywy programisty . Są one wykonywane w celu zapewnienia, że ​​określona metoda (lub jednostka ) klasy wykonuje zestaw określonych zadań.

Testy funkcjonalne są pisane z perspektywy użytkownika . Zapewniają, że system działa tak, jak tego oczekują użytkownicy.

Anthony Forloney
źródło
18
Cytat jest nieco niejasny dla kogoś, kto jest nowy w koncepcji.
2
@ fig-gnuton, starałem się opracować, aby nie dopuścić do tego, aby opis był niejasny. W linku stanowią dobry przykład, mógłbym zaktualizować odpowiedź cytatem, jeśli uważasz, że może to pomóc OP.
Anthony Forloney
147
Być może innym sposobem byłoby powiedzenie: „Test jednostkowy upewnia się, że kod robi to, czego chce programista. Testy funkcjonalne upewniają się, że programista robi to, czego chce klient”?
JS.
3
Podoba mi się, ale dostosowałbym to. Funkcjonalny test pilnuje aplikacja pozwala użytkownikowi wykonać działanie. Test jednostki sprawia, że zachowuje się upewnić się, że kod w jaki sposób oczekuje programista.
Adam,
2
Czy to, czego chce programista, nie spełnia tego, czego chce użytkownik końcowy? Po co pisać test, który nie spełnia oczekiwań klienta?
O.Badr
140
  • Test jednostkowy sprawdza niezależną jednostkę zachowania . Jaka jest jednostka zachowania? To najmniejszy element systemu, który można niezależnie testować jednostkowo. (Definicja ta jest rzeczywiście okrągła, IOW to naprawdę nie jest definicja w ogóle , ale wydaje się całkiem dobrze funkcjonować w praktyce, ponieważ można sort-of zrozumieć intuicyjnie.)

  • Test funkcjonalny testuje niezależny element funkcjonalności.


  • Jednostka zachowania jest bardzo mała: chociaż absolutnie nie lubię tej głupiej mantry „test jednostkowy na metodę”, z punktu widzenia wielkości jest ona odpowiednia. Jednostka zachowania jest czymś pomiędzy częścią metody a może kilkoma metodami. Co najwyżej obiekt, ale nie więcej niż jeden.

  • Element funkcjonalny zwykle obejmuje wiele metod i przekrojów na kilka obiektów, a często przez wiele warstw architektonicznych.


  • Test jednostkowy wyglądałby tak: kiedy wywołam validate_country_code()funkcję i przekażę jej kod kraju 'ZZ', powinna ona zwrócić false.

  • Test funkcjonalny byłby następujący: po wypełnieniu formularza wysyłki kodem kraju ZZpowinienem zostać przekierowany na stronę pomocy, która pozwala mi wybrać kod kraju z menu.


  • Testy jednostkowe są pisane przez programistów, dla programistów, z perspektywy programisty.

  • Testy funkcjonalne mogą być dla użytkownika, w którym to przypadku są pisane przez programistów wraz z użytkownikami (lub może przy użyciu odpowiednich narzędzi i odpowiednich użytkowników, nawet przez samych użytkowników), dla użytkowników, z perspektywy użytkownika. Lub mogą mieć do czynienia z programistami (np. Kiedy opisują jakąś wewnętrzną funkcjonalność, o którą użytkownik nie dba), w którym to przypadku są pisane przez programistów, dla programistów, ale nadal z perspektywy użytkownika.


  • W pierwszym przypadku testy funkcjonalne mogą również służyć jako testy akceptacyjne i jako wykonywalne kodowanie wymagań funkcjonalnych lub specyfikacji funkcjonalnej, w drugim przypadku mogą również służyć jako testy integracyjne.

  • Testy jednostkowe zmieniają się często, testy funkcjonalne nigdy nie powinny się zmieniać w ramach głównych wydań.


Jörg W Mittag
źródło
doskonała odpowiedź! jedno - „testy funkcjonalne nigdy nie powinny się zmieniać w głównej wersji” dlaczego?
Lazer,
5
@Lazer, @cdeszaq: W wielu projektach zmiana głównego numeru wersji jest używana do wskazania wstecznej niezgodności i OTOH, jeśli główna wersja nie zmienia się, gwarantuje się wsteczną kompatybilność . Co oznacza „zgodność wsteczna”? Oznacza to „nie zmienia widocznego zachowania użytkownika”. A testy funkcjonalne są wykonywalnym kodowaniem specyfikacji zachowania widocznego dla użytkownika. Tak więc, jeśli liczba główna się nie zmienia, testy funkcjonalne nie mogą się zmieniać i odwrotnie, jeśli tety funkcjonalne się zmieniają, to liczba główna również musi się zmienić.
Jörg W Mittag,
2
Uwaga: nic nie mówiłem o dodawaniu testów funkcjonalnych! To, czy dodanie funkcjonalności, której wcześniej nie było, stanowi zmianę niezgodną wstecz, zależy od projektu. W przypadku oprogramowania końcowego prawdopodobnie nie. Ale dla języka programowania? Może: na przykład wprowadzenie nowego słowa kluczowego powoduje, że obecnie działające programy, które używają tego słowa kluczowego jako nazwy zmiennej, są nieprawidłowe, a zatem jest to zmiana niezgodna wstecz.
Jörg W Mittag
3
@ JörgWMittag uwielbiam ten pomysł: „testy funkcjonalne są wykonywalnym kodowaniem specyfikacji zachowania widocznego dla użytkownika” ... niezależnie od tego, czy inni super-eksperci faktycznie się zgadzają, pomaga mi to z pierwotnym pytaniem, aby dostrzec „różnicę między 'em'
Mike Rodent
1
„Test funkcjonalny byłby następujący: po wypełnieniu formularza wysyłki kodem kraju ZZ powinienem zostać przekierowany na stronę pomocy, która pozwala mi wybrać kod kraju z menu”. To trochę wybredne, ale nazwałbym to „testem akceptacyjnym”. Test funkcjonalny sprawdziłby, czy wprowadzenie ZZ w formularzu wysyłkowym przekierowało użytkownika na prawidłowy adres URL lub zgłosiło szczególny wyjątek lub błąd.
Bob Ray
98

TLDR:

Aby odpowiedzieć na pytanie: Testowanie jednostkowe jest podtypem Testowania funkcjonalnego.


Istnieją dwie duże grupy: funkcjonalne i niefunkcjonalne testów. Najlepsza (niewyczerpująca) ilustracja, którą znalazłem, to ta (źródło: www.inflectra.com ):

wprowadź opis zdjęcia tutaj

(1) Testowanie jednostkowe: testowanie małych fragmentów kodu (funkcji / metod). Można to uznać za (funkcjonalne) badanie funkcjonalne.

Po połączeniu funkcji tworzysz moduł = samodzielny element, prawdopodobnie z interfejsem użytkownika, który można przetestować (testowanie modułu). Gdy masz co najmniej dwa oddzielne moduły, następnie sklejasz je ze sobą, a następnie przychodzi:

(2) Testy integracyjne: kiedy umieścisz dwa lub więcej elementów (pod) modułów lub (pod) systemów razem i sprawdzisz, czy dobrze się ze sobą bawią.

Następnie integrujesz 3. moduł, a następnie 4. i 5. w dowolnej kolejności, którą ty lub twoja drużyna uznacie za stosowną, a gdy wszystkie układanki zostaną ułożone razem, przychodzi

(3) Testowanie systemu: testowanie SW jako całości. To właściwie „Testowanie integracyjne wszystkich elementów razem”.

Jeśli to w porządku, to nadchodzi

(4) Testy akceptacyjne: czy zbudowaliśmy to, o co właściwie prosił klient? Oczywiście testy akceptacyjne powinny być wykonywane przez cały cykl życia , a nie tylko na ostatnim etapie, kiedy zdajesz sobie sprawę, że klient chciał samochód sportowy i zbudowałeś furgonetkę.

wprowadź opis zdjęcia tutaj

Andrejs
źródło
2
Widziałem wiele takich zdjęć w Google, które opisują „Test jednostkowy” jako rodzaj „testu funkcjonalnego”. Ale dlaczego inne odpowiedzi opisują tutaj zupełnie inną koncepcję: „test funkcjonalny” jest raczej testem kompleksowym, a test jednostkowy nie jest testem funkcjonalnym? Myliłem się. Istnieją dwie różne „religie”, które inaczej definiują termin „test funkcjonalny” czy co?
Ruslan Stelmachenko
Odpowiedzi (nawet te bardzo wysoko ocenione) również mogą być błędne;)
Andrejs
1
Podoba mi się zdjęcie, ale w przypadku testów integracji systemu układanka powinna wydawać się „kompletna”, bez żadnych miejsc do połączenia z innymi elementami.
Jonathon Reinhart
4
@JonathonReinhart - niekoniecznie. Otwarte krawędzie mogą reprezentować łatwą rozszerzalność systemu dzięki nowym funkcjom, co jest szczególnie przydatne, gdy stosuje się podejście programistyczne, takie jak Agile.
Myles
Z wielu sprzecznych odpowiedzi powyżej, oczywiście Functional Testnie jest znormalizowanym terminem i ma inne znaczenie dla różnych ludzi.
Penghe Geng
12

„Test funkcjonalny” nie oznacza, że ​​testujesz funkcję (metodę) w kodzie. Ogólnie oznacza to, że testujesz funkcjonalność systemu - kiedy uruchamiam foo file.txtz wiersza poleceń file.txt, być może wiersze są odwrócone. W przeciwieństwie do tego, test pojedynczej jednostki ogólnie obejmuje pojedynczy przypadek jednej metody - length("hello")powinien zwrócić 5, a length("hi")powinien zwrócić 2.

Zobacz także stanowisko IBM na granicy między testami jednostkowymi a testami funkcjonalnymi .

Mark Rushakoff
źródło
Cóż, ciekawe, ale link, który pokazujesz, oznacza coś innego: funkcjonalność dotyczy funkcji do wykonania poprzez implementację, tj. Testowanie z punktu widzenia użytkownika, czyli funkcja dla użytkownika.
Stefano Scarpanti
8

Podstawową różnicą jest jednak to, że testy funkcjonalne testują aplikację z zewnątrz, z punktu widzenia użytkownika. Testy jednostkowe testują aplikację od wewnątrz, z punktu widzenia programisty. Testy funkcjonalne powinny pomóc w zbudowaniu aplikacji o odpowiedniej funkcjonalności i zagwarantować, że nigdy nie zostanie ona przypadkowo uszkodzona. Testy jednostkowe powinny pomóc Ci napisać kod, który jest czysty i wolny od błędów.

Zaczerpnięte z książki „Python TDD” Harry'ego Percivala

Humoyun Ahmad
źródło
8

Według ISTQB tych dwóch nie można porównać. Testy funkcjonalne nie są testami integracyjnymi.

Test jednostkowy jest jednym z poziomów testów, a testy funkcjonalne są rodzajem testów.

Gruntownie:

Funkcją systemu (lub komponentu) jest „to, co robi”. Zazwyczaj jest to opisane w specyfikacji wymagań, specyfikacji funkcjonalnej lub w przypadkach użycia.

podczas

Testowanie komponentów, znane również jako testowanie jednostkowe, modułowe i programowe, wyszukuje defekty i weryfikuje funkcjonowanie oprogramowania (np. Modułów, programów, obiektów, klas itp.), Które można oddzielnie testować.

Według ISTQB test elementu / jednostki może być funkcjonalny lub niefunkcjonalny:

Testowanie komponentów może obejmować testowanie funkcjonalności i specyficznych cech niefunkcjonalnych, takich jak zachowanie zasobów (np. Wycieki pamięci), testowanie wydajności lub niezawodności, a także testowanie strukturalne (np. Pokrycie decyzji).

Cytaty z Podstaw testowania oprogramowania - certyfikacja ISTQB

Dominik
źródło
Zgadzam się z zbyt dużą ilością puchu, ale w każdym razie to oni są tam największym graczem, a to pytanie dotyczyło teorii, więc myślę, że ISTQB powinien być wystarczająco dobry.
Dominik
6

W Railsach folder jednostek służy do przechowywania testów modeli, folder funkcjonalny służy do przechowywania testów sterowników, a folder integracji służy do przechowywania testów obejmujących dowolną liczbę kontrolerów wchodzących w interakcję. Urządzenia są sposobem organizowania danych testowych; znajdują się w folderze urządzeń. Plik test_helper.rb zawiera domyślną konfigurację dla twoich testów. możesz to odwiedzić .

Bhimasen Rautaray
źródło
3

Myślę o tym w ten sposób: test jednostkowy stwierdza, że ​​kod wykonuje to, co zamierzałeś zrobić (np. Chciałeś dodać parametr aib, w rzeczywistości dodajesz je i nie odejmujesz), testy funkcjonalne sprawdzają, czy cały kod działa razem, aby uzyskać poprawny wynik, dzięki czemu to, co zamierzałeś zrobić, w rzeczywistości uzyskuje właściwy wynik w systemie.

Yishai
źródło
3

AFAIK, testy jednostkowe NIE są testami funkcjonalnymi. Pozwól, że wyjaśnię małym przykładem. Chcesz sprawdzić, czy funkcjonalność logowania do aplikacji internetowej działa, czy nie, tak jak użytkownik. W tym celu powinny wyglądać twoje testy funkcjonalne.

1- existing email, wrong password -> login page should show error "wrong password"!
2- non-existing email, any password -> login page should show error "no such email".
3- existing email, right password -> user should be taken to his inbox page.
4- no @symbol in email, right password -> login page should say "errors in form, please fix them!" 

Czy nasze testy funkcjonalne powinny sprawdzać, czy możemy zalogować się przy użyciu nieprawidłowych danych? Na przykład. E-mail nie ma symbolu @, nazwa użytkownika ma więcej niż jedną kropkę (dozwolona jest tylko jedna kropka), .com pojawia się przed @ itd.? Ogólnie nie! Tego rodzaju testy wchodzą w skład testów jednostkowych.

Możesz sprawdzić, czy nieprawidłowe testy są odrzucane w testach jednostkowych, jak pokazano w poniższych testach.

class LoginInputsValidator
  method validate_inputs_values(email, password)
    1-If email is not like [email protected], then throw error.
    2-If email contains abusive words, then throw error.
    3-If password is less than 10 chars, throw error.

Zauważ, że test funkcjonalny 4 faktycznie wykonuje to, co robi test jednostkowy 1. Czasami testy funkcjonalne mogą powtórzyć niektóre (nie wszystkie) testy przeprowadzone przez testy jednostkowe, z różnych powodów. W naszym przykładzie używamy testu funkcjonalnego 4, aby sprawdzić, czy konkretny komunikat o błędzie pojawia się przy wprowadzaniu nieprawidłowych danych wejściowych. Nie chcemy sprawdzać, czy wszystkie złe dane wejściowe są odrzucane, czy nie. To jest zadanie testów jednostkowych.

MasterJoe2
źródło
1
Dobra uwaga na temat testowania funkcjonalnego często mającego znacznie węższy zakres niż testowanie jednostkowe (pod względem testowania funkcjonalnego bardziej skupionego na zasadniczo udowodnieniu, że oczekiwana funkcja została osiągnięta), ale powiedziałbym, że opisują one różne wymiary ( skład w testach jednostkowych a cel w testach funkcjonalnych); niektóre testy jednostkowe to testy funkcjonalne, a niektóre testy funkcjonalne to testy jednostkowe, ale jest też wiele Venn, które się nie pokrywają.
Myles
Dobre przykłady tego, co jest i nie wchodzi w zakres testów funkcjonalnych.
Myles
2

TESTÓW JEDNOSTKOWYCH

Testowanie jednostkowe obejmuje testowanie najmniejszej jednostki kodu, którą zwykle są funkcje lub metody. Testy jednostkowe przeprowadzane są głównie przez twórcę jednostki / metody / funkcji, ponieważ rozumieją one rdzeń funkcji. Głównym celem programisty jest objęcie kodu testami jednostkowymi.

Ma ograniczenie polegające na tym, że niektórych funkcji nie można przetestować za pomocą testów jednostkowych. Nawet po pomyślnym zakończeniu wszystkich testów jednostkowych; nie gwarantuje prawidłowego działania produktu. Tej samej funkcji można użyć w kilku częściach systemu, podczas gdy test jednostkowy został napisany tylko do jednego użycia.

TESTY FUNKCJONALNOŚCI

Jest to rodzaj testowania Black Box, w którym testy będą przeprowadzane pod kątem funkcjonalnych aspektów produktu bez zagłębiania się w kod. Testy funkcjonalne przeprowadzane są głównie przez dedykowanego testera oprogramowania. Obejmie to techniki pozytywne, negatywne i BVA wykorzystujące niestandaryzowane dane do testowania określonej funkcjonalności produktu. Pokrycie testowe przeprowadza się w udoskonalony sposób za pomocą testów funkcjonalnych niż testów jednostkowych. Do testowania używa GUI aplikacji, więc łatwiej jest ustalić, za co dokładnie odpowiada konkretna część interfejsu, a nie za określenie funkcji odpowiedzialnej za kod.

Ashish Gupta
źródło
2

bardzo prosto możemy powiedzieć:

  • czarna skrzynka: test interfejsu użytkownika jak test funkcjonalny
  • białe pole: test kodu jak test jednostkowy

czytaj więcej tutaj .

Alireza Rahmani Khalili
źródło
@fafl Przepraszam mój zły
Alireza Rahmani Khalili
1

Test jednostkowy : - Test jednostkowy jest szczególnie stosowany do testowania komponentu produktu po komponencie, szczególnie podczas opracowywania produktu. Narzędzia typu Junit i Nunit pomogą również przetestować produkt zgodnie z Jednostką. ** Zamiast rozwiązywania problemów po integracji zawsze wygodnie jest je rozwiązać na wczesnym etapie rozwoju.

Testy funkcjonalne: - Jeśli chodzi o testowanie, istnieją dwa główne typy testowania: 1. Test funkcjonalny 2. Test niefunkcjonalny.

Test niefunkcjonalny to test, w którym tester sprawdza, czy produkt wykona wszystkie atrybuty jakości, o których klient nie wspomina, ale te atrybuty jakości powinny tam być. Jak: -wydajność, użyteczność, bezpieczeństwo, obciążenie, obciążenie itp., Ale w teście funkcjonalnym : - klient jest już obecny z jego wymaganiami i są one odpowiednio udokumentowane, zadaniem testerów jest sprawdzenie, czy funkcjonalność aplikacji działa zgodnie z do proponowanego systemu lub nie. W tym celu Tester powinien przetestować zaimplementowaną funkcjonalność z proponowanym Systemem.

mohit sarsar
źródło
0

Testy jednostkowe są zwykle wykonywane przez programistów. Celem tego samego jest upewnienie się, że ich kod działa poprawnie. Ogólna ogólna zasada polega na objęciu wszystkich ścieżek kodu za pomocą testów jednostkowych.

Testy funkcjonalne : jest to dobre odniesienie. Testowanie funkcjonalne Objaśnienie

użytkownik automatyzacji
źródło
6
Wklej najważniejszy tekst do swojej odpowiedzi, nigdy nie wiesz, kiedy strona może zostać usunięta, co powoduje, że link jest nieprawidłowy.
Andrejs,