2010-11-09 22 views
48

Czy jesteś za jednym lub drugim? Lub oba?Testy jednostkowe vs. testy akceptacyjne

Rozumiem, testy jednostkowe:

  • walidacji systemu z punktu widzenia programisty widzenia
  • pomóc programistom ćwiczyć TDD
  • kod
  • keep modułowy
  • pomóc w wykrywaniu błędów przy niskich poziomach szczegółowości

Testy akceptacji:

  • walidacji systemu z działalności i punkty QC/QA widzenia
  • wydają się być wysoki poziom jak są one często pisane przez ludzi nie znających wewnętrzne funkcjonowanie kodu

I czuć, że oba są konieczne. Jednak w celu zminimalizowania nadmiarowej pracy dobrym pomysłem jest próba włączenia testów jednostkowych do testów akceptacyjnych? Innymi słowy, niech te drugie wezmą to pierwsze. Czy pójście w przeciwnym kierunku ma jakiś sens?

Jakie są Pana ogólne poglądy na temat testów jednostkowych a testów akceptacyjnych i jak nimi zarządzać w stosunku do siebie nawzajem?

Odpowiedz

67

Testy akceptacyjne i integracyjne informują, czy kod działa i jest kompletny; testy jednostkowe mówią ci, gdzie to się nie udaje.

Jeśli wykonałeś dobrą robotę z testami akceptacyjnymi i integracyjnymi, a one mijają, Twój kod implementuje wszystkie funkcje, które powinien i działa. Wspaniale jest wiedzieć (wspaniale jest wiedzieć, że tak nie jest). Ale jeśli to nie działa, test akceptacyjny nie da ci wiele wglądu w to, co poszło źle; ponieważ testuje wiele jednostek funkcjonalności, może to być rodzaj porażki z lotu ptaka. Tu właśnie świecą się testy jednostkowe. Dobre testy jednostek mówią dokładnie, co poszło nie tak, z dokładną częścią kodu. Trudniej jest stwierdzić, czy napisałeś wystarczająco dużo testów jednostkowych, a nie testów akceptacyjnych, ale gdy masz nieudany test akceptacyjny bez odpowiedniego testu jednostki - nadszedł czas, aby napisać test jednostkowy.

To wszystko z perspektywy testowania. I, oczywiście, TDD nie jest (i ATDD nie jest) o testowaniu. Jeśli chodzi o prowadzenie twojego projektu, testy akceptacyjne dają ci szeroki plan działania ("tutaj jesteś, gdzie chcesz iść"), podczas gdy testy jednostkowe prowadzą cię do następnego skrzyżowania ("skręć w lewo"). Obydwa są cenne w tym względzie, a ich wartość uzupełnia się wzajemnie.

Nie mylić ich; nie wykreślaj ich. Testy jednostkowe, w szczególności, nie powinny zależeć od niczego innego, a błędem byłoby ograniczać testy jednostkowe, uzależniając od nich test akceptacyjny. Oczywiście mogą one udostępniać pewien kod strukturalny, ale powinny być niezależne.

+0

Dzięki, Carl. Czy możesz powiedzieć coś więcej o tym, dlaczego nie powinniśmy ograniczać testów jednostkowych, wiążąc z nimi testy akceptacyjne? – Calvin

+2

Cóż, jeśli AT wykorzystuje UT, to jesteśmy mniej wolni, aby zmienić UT, gdy widzimy, że lepszy projekt jest odpowiedni. Każde użycie kodu ogranicza go, a kod (nawet testy), który jest zbyt mocno ograniczony, staje się kruchy. Stacje UT powinny być bardzo ciągliwe, abyśmy mogli je zrestrukturyzować w celu spełnienia nowych wymagań i wizji. –

+0

Opisujesz test akceptacji jako oprogramowanie uruchamiane i dostarczające wynik. To wcale nie jest to, co to określenie oznacza dla mnie. – reinierpost

11

Jednak, w celu zminimalizowania zbędnej pracy, czy warto spróbować włączyć testy jednostkowe do testów akceptacyjnych?

nr

Innymi słowy, czy to drugie [akceptacji] Wywołanie byłą [jednostka]. Czy pójście w przeciwnym kierunku ma jakiś sens?

Nie trudź się.

Testy akceptacyjne są często polityczne. Pokazujesz je ludziom, którzy - opierając się na instynkcie jelitowym - decydują się zaakceptować lub odrzucić.

Następnie spierasz się o ważność testów akceptacyjnych.

Następnie spierasz się o zakres prac i kolejne wydanie.

Testy akceptacyjne nie są - ogólnie rzecz biorąc - techniczne. Gdyby tak było, mielibyśmy formalne testy jednostkowe i to by było właśnie to.

Nie próbuj finalizować polityki. Obejmij to. Niech to się stanie.


Można mieć nadzieję, że Acceptance Test-Driven Development (ATDD) prowadzi do „testy akceptacyjne są napisane i uzgodnione przez cały zespół przed rozpoczęciem rozwoju.” Musicie jednak odzwierciedlać rzeczywistość, że wszystko, co napisano z wyprzedzeniem, jest w najlepszym razie obłudne, aw najgorszym - do zliberalizowania.

Przesłanką stojącą za wszystkimi metodami Agile jest to, że można się zgodzić tylko na coś możliwego do uwolnienia. Wszystko po tym jest do negocjacji.

Przesłanką stojącą za wszystkimi testami pierwszego (TDD, ATDD lub cokolwiek innego) jest to, że test jest żelazną zgodą. Tylko że tak nie jest. W przypadku każdej metody TDD (lub ATDD) możesz zgodzić się - w zasadzie - na test wyników, ale nie masz tak naprawdę zgody na test sam w sobie.

Może się zdarzyć, że testu nie da się łatwo zapisać. Albo gorzej, w ogóle nie można napisać. Możesz zgodzić się na wyniki, które wydają się być testowalne, ale okazują się słabo zdefiniowane. Co teraz? Są to rzeczy, których nie możesz poznać, dopóki nie zaczniesz rozwijać i dotrzeć do szczegółów.

Wszystkie testy są ważne. Żaden szczególny rodzaj testów nie może być nadzbiorem ani podzbiorem jakichkolwiek innych rodzajów testów. Są to zawsze częściowo zachodzące na siebie sety. Próba połączenia w celu zaoszczędzenia pewnej ilości pracy może okazać się stratą czasu.

Więcej testów jest lepszych niż cokolwiek innego. Związek wszystkich testów ma większą wartość niż próba wymuszenia relacji między podzbiorami wśród testów.

+0

Dzięki za odpowiedź. W ATDD testy akceptacyjne są pisane wcześniej, wyraźnie i wyraźnie, prawda? Oznacza to, że nie są one używane do akceptowania lub odrzucania dostarczonej funkcjonalności, ale raczej do określenia, jakie funkcje powinny być dostarczane. Programiści wiedzą, że ich kod musi przejść testy akceptacyjne, zanim uznają to za wykonane. – Calvin

+0

@Calvin: Istnieje nieodłączna niejednoznaczność pomiędzy testami "Acceptance" i innymi testami, które wykonujesz. Wszystkie testy akceptują lub odrzucają funkcje. Wszystkie testy. Jeśli test się nie powiedzie, odrzuci funkcjonalność. Jeśli test przejdzie, akceptuje funkcjonalność. –

+0

Powinienem był wyjaśnić. Mam na myśli testy akceptacyjne z perspektywy rozwoju opartego na akceptacji (ATDD). Doktryna jest taka, że ​​testy akceptacyjne są spisane i uzgodnione przez cały zespół przed rozpoczęciem rozwoju. Twórcy kodują następnie ze świadomością, że ich celem końcowym jest sprawdzenie wszystkich testów akceptacyjnych (tj. Spełnienie wszystkich wcześniej zdefiniowanych wymagań). – Calvin

2

Są to tylko moja osobista opinia w kwestii niektórych rodzajów testów:

Jednak dla minimalizacji redundantnych pracy, czy jest to dobry pomysł, aby spróbować testów jednostkowych włączenie do akceptacji testy ?

ja bym sekund S. Lott ma na ten temat i dodać, że istnieje niebezpieczeństwo tutaj testów jednostkowych są uzbrojone w pewnym stopniu, że może mieć jakieś błędy przejść. Na przykład z listy rozwijanej ktoś może przetestować kilka stanów, ale prawdopodobnie nie wszystkie, gdzie tester może użyć innych danych do wykrycia potencjalnego błędu.

Innymi słowy, należy zadzwonić pod ten drugi numer . Czy zmierzanie w przeciwnym kierunku ma jakiś sens?

Byłbym ostrożny, łącząc je razem. Testy jednostkowe reprezentują testy najmniejszych bitów funkcjonalności, często tak małe, że użytkownik końcowy nie zrozumie, że setki testów mogą być tylko po to, aby uzyskać formularz internetowy do wprowadzania danych do systemu CRM. Testy akceptacyjne dotyczą raczej tego, czego chce użytkownik aplikacji, co może być bardziej subiektywne, np. "Czy to wygląda ładnie?" kontra "Czy to wygląda dobrze?" Może istnieć ten znak "wystarczająco dobry" z testami akceptacyjnymi, których nie jestem pewien, aby zadziałały z testami jednostkowymi. Zasadniczo, jeśli test jednostkowy nie powiedzie się, ktoś musi zdecydować, czy naprawić kod, czy usunąć test, ponieważ każda z nich może być dobrym rozwiązaniem w zależności od okoliczności.

Jakie są twoje myśli w ogóle na testach jednostkowych vs. testów akceptacyjnych i jak zarządzać ich w stosunku do siebie inny?

Jednostkowe testy polegają na sprawdzeniu najprostszych fragmentów kodu. Mogą być testy integracyjne, ale jest to poziom wyższy, ponieważ po sprawdzeniu wszystkich małych kawałków, kombinacja elementów działa razem, np. w sobotnie poranki widziałem kreskówki, które dorastałem, i zabawki, które można złożyć, jak "Voltron" lub różne Transformatory, takie jak Constructicons, które stworzyły Devastator. Testy akceptacyjne są na ogół z punktu widzenia użytkownika końcowego "Czy mogę teraz zrobić X z aplikacją?" mając odpowiedź "Tak", zanim coś wyjdzie za drzwi.Podczas gdy niektóre przypadki błędów mogą być sprawdzane w teście akceptacyjnym, nie jest powszechne przeprowadzanie dokładnego testu każdej możliwej kombinacji, którą można wprowadzić do aplikacji. Jednak testy jednostkowe mogą obejmować warunki brzegowe i kilka innych losowych przypadków.

9

Testy jednostkowe - moja konkretna funkcja wykonuje to, co ma robić, nic więcej i nic mniej.

Test akceptacji - moja aplikacja robi to, co powinna.

Przykład: Aplikacja do obliczania pierwiastków kwadratowych funkcji. Przyjmuje dane wejściowe a, b i c, zwraca pierwiastki x1 i x2. Ta aplikacja jest zbudowana przez funkcje, które piszę, aby dodać dwie liczby, odjąć dwie liczby, pomnożyć dwie liczby, podzielić dwie liczby i wziąć pierwiastek kwadratowy z dwóch liczb.

Testy jednostkowe - sprawdź, czy moje funkcje dzielenia i mnożenia działają poprawnie, mój pierwiastek kwadratowy działa poprawnie, moje dodawanie i odejmowanie działa poprawnie.

Testy akceptacji - sprawdź, czy moja aplikacja oblicza pierwiastki funkcji kwadratowych.

Ponieważ moje całe zastosowanie polega na obliczaniu korzeni, nie powinienem mieć testu jednostkowego, który również oblicza korzenie, ponieważ nie ma indywidualnej funkcji, która to robi.

3

Jako Podsumowując wszystko powyższe,

  • Testy akceptacyjne upewnij się, że jesteś budowania słusznie
  • Testy jednostkowe upewnij się, że jesteś budowania rzeczą prawo