Zacznę od podłączania źródeł - pragmatyczne testowanie jednostkowe w Javie z JUnitem (jest też wersja z C # -Nunit ... ale mam tę ... jest w większości agnostyczna.)
Dobre testy powinny być WYCIECZKĄ (akronim nie jest wystarczająco lepki - mam wydruk ściągawki w książce, którą musiałem wyciągnąć, aby upewnić się, że wszystko się zgadza ..)
- Automatyczny : Wywoływanie testów, jak również sprawdzanie wyników dla wyniku PASS / FAIL powinno być automatyczne
- Thorough : pokrycie; Chociaż błędy mają tendencję do gromadzenia się wokół pewnych regionów w kodzie, upewnij się, że przetestowano wszystkie kluczowe ścieżki i scenariusze. Użyj narzędzi, jeśli musisz znać nieprzetestowane regiony
- Powtarzalne : Testy powinny dawać te same wyniki za każdym razem ... za każdym razem. Testy nie powinny opierać się na niekontrolowanych parametrach.
- Niezależne : bardzo ważne.
- Testy powinny testować tylko jedną rzecz naraz. Wiele asercji jest w porządku, o ile wszystkie testują jedną funkcję / zachowanie. Gdy test się nie powiedzie, powinien wskazać lokalizację problemu.
- Testy nie powinny na sobie polegać - izolowane. Brak założeń dotyczących kolejności wykonywania testów. Przed każdym testem upewnij się, że jest to „czyste konto”, używając odpowiednio konfiguracji / dezaktywacji
Profesjonalny : na dłuższą metę będziesz mieć tyle kodu testowego, co produkcyjny (jeśli nie więcej), dlatego postępuj zgodnie z tym samym standardem dobrego projektowania kodu testowego. Dobrze podzielone na czynniki metody-klasy z nazwami ujawniającymi intencje, bez duplikacji, testy z dobrymi nazwami itp.
Dobre testy również działają szybko . każdy test, który trwa ponad pół sekundy, musi zostać opracowany. Im dłużej trwa uruchomienie zestawu testów… tym rzadziej będzie uruchamiany. Im więcej zmian, które deweloper spróbuje przekraść się między biegami… jeśli coś się zepsuje… zajmie więcej czasu ustalenie, która zmiana była przyczyną.
Aktualizacja 2010-08:
- Czytelne : można to uznać za część wersji Professional - jednak nie można tego wystarczająco podkreślić. Test kwasowości polega na znalezieniu kogoś, kto nie jest częścią twojego zespołu i poproszeniu go o ustalenie testowanego zachowania w ciągu kilku minut. Testy muszą być utrzymywane tak jak kod produkcyjny - więc należy je łatwo odczytać, nawet jeśli wymaga to więcej wysiłku. Testy powinny być symetryczne (według wzorca) i zwięzłe (testuj jedno zachowanie na raz). Używaj spójnej konwencji nazewnictwa (np. Stylu TestDox). Unikaj zaśmiecania testu "przypadkowymi szczegółami" ... stań się minimalistą.
Poza tym, większość innych to wskazówki, które ograniczają pracę o niskich korzyściach: np. „Nie testuj kodu, którego nie jesteś właścicielem” (np. Biblioteki DLL innych firm). Nie próbuj testować metod pobierających i ustawiających. Miej oko na stosunek kosztów do korzyści lub prawdopodobieństwo defektu.
źródło
Większość odpowiedzi tutaj wydaje się odnosić do najlepszych praktyk testowania jednostkowego w ogóle (kiedy, gdzie, dlaczego i co), a nie do pisania samych testów (jak). Ponieważ pytanie wydawało się dość konkretne w części „jak”, pomyślałem, że opublikuję to, zaczerpnięte z prezentacji „brązowej torby”, którą przeprowadziłem w mojej firmie.
Pięć zasad pisania testów Womp:
1. Używaj długich, opisowych nazw metod testowych.
2. Napisz testy w stylu Rozmieść / Działaj / Potwierdź .
3. Zawsze dostarczaj komunikat o błędzie wraz z potwierdzeniami.
4. Skomentuj powód testu - jakie jest założenie biznesowe?
5. Każdy test musi zawsze przywracać stan każdego zasobu, którego dotyka
źródło
Pamiętaj o tych celach (na podstawie książki xUnit Test Patterns autorstwa Meszaros)
Kilka rzeczy, które mogą to ułatwić:
Nie zapominaj, że możesz również przeprowadzić testy integracyjne ze swoim środowiskiem xUnit, ale oddziel testy integracyjne i testy jednostkowe
źródło
Testy powinny być izolowane. Jeden test nie powinien zależeć od drugiego. Co więcej, test nie powinien polegać na systemach zewnętrznych. Innymi słowy, testuj swój kod, a nie kod, od którego ten kod zależy - możesz testować te interakcje w ramach testów integracyjnych lub funkcjonalnych.
źródło
Niektóre właściwości świetnych testów jednostkowych:
Gdy test się nie powiedzie, powinno być natychmiast oczywiste, na czym polega problem. Jeśli musisz użyć debugera, aby wyśledzić problem, testy nie są wystarczająco szczegółowe. Pomaga w tym posiadanie dokładnie jednego potwierdzenia na test.
Podczas refaktoryzacji żadne testy nie powinny zakończyć się niepowodzeniem.
Testy powinny przebiegać tak szybko, że nigdy nie wahasz się przed ich uruchomieniem.
Wszystkie testy powinny zawsze przejść pomyślnie; brak wyników niedeterministycznych.
Testy jednostkowe powinny być dobrze rozłożone na czynniki, tak jak kod produkcyjny.
@Alotor: Jeśli sugerujesz, że biblioteka powinna mieć testy jednostkowe tylko w swoim zewnętrznym interfejsie API, nie zgadzam się. Chcę testów jednostkowych dla każdej klasy, w tym klas, których nie ujawniam zewnętrznym wywołującym. (Jeśli jednak czuję potrzebę pisania testów dla metod prywatnych, muszę dokonać refaktoryzacji ).
EDYCJA: Pojawił się komentarz dotyczący powielania spowodowanego „jednym potwierdzeniem na test”. W szczególności, jeśli masz kod do skonfigurowania scenariusza, a następnie chcesz dokonać wielu potwierdzeń na jego temat, ale masz tylko jedno potwierdzenie na test, możesz zduplikować konfigurację w wielu testach.
Nie mam takiego podejścia. Zamiast tego używam urządzeń testowych dla każdego scenariusza . Oto przybliżony przykład:
źródło
To, czego szukasz, to nakreślenie zachowań testowanej klasy.
Podstawowym celem jest zwiększenie zaufania do zachowania klasy.
Jest to szczególnie przydatne, gdy patrzymy na refaktoryzację kodu. Martin Fowler opublikował interesujący artykuł dotyczący testowania w swojej witrynie internetowej.
HTH.
Twoje zdrowie,
Obrabować
źródło
Test powinien początkowo zakończyć się niepowodzeniem. Następnie powinieneś napisać kod, który sprawi, że przejdą, w przeciwnym razie ryzykujesz napisaniem testu, który jest błędny i zawsze kończy się wynikiem.
źródło
Podoba mi się właściwy akronim BICEP z wyżej wymienionej książki Pragmatic Unit Testing :
Osobiście uważam, że można zajść całkiem daleko, sprawdzając, czy otrzymujesz prawidłowe wyniki (1 + 1 powinno zwrócić 2 w funkcji dodawania), wypróbowując wszystkie warunki brzegowe, o których myślisz (np. Używając dwóch liczb, których suma jest większa niż maksymalna wartość całkowita w funkcji add) i wymusza warunki błędu, takie jak awarie sieci.
źródło
Dobre testy muszą być możliwe do utrzymania.
Nie do końca wymyśliłem, jak to zrobić w złożonych środowiskach.
Wszystkie podręczniki zaczynają się odklejać, gdy baza kodu zaczyna sięgać do setek tysięcy lub milionów linii kodu.
Dobra architektura może kontrolować część eksplozji interakcji, ale nieuchronnie, gdy systemy stają się bardziej złożone, rośnie wraz z nią automatyczny system testowania.
Tutaj zaczynasz zajmować się kompromisami:
Musisz także zdecydować:
gdzie przechowujesz przypadki testowe w swojej bazie kodu?
Mógłbym trwać wiecznie, ale chodzi mi o to:
Testy muszą być możliwe do utrzymania.
źródło
Omówiłem te zasady jakiś czas temu w tym artykule w MSDN Magazine, który moim zdaniem jest ważny do przeczytania dla każdego programisty.
Sposób definiowania „dobrych” testów jednostkowych polega na tym, że mają one następujące trzy właściwości:
źródło
źródło
Jay Fields ma wiele dobrych rad dotyczących pisania testów jednostkowych i jest post, w którym podsumowuje najważniejsze porady . Tam przeczytasz, że powinieneś krytycznie przemyśleć swój kontekst i ocenić, czy rada jest dla Ciebie warta. Otrzymasz tutaj mnóstwo niesamowitych odpowiedzi, ale od Ciebie zależy, która z nich będzie najlepsza w Twoim kontekście. Wypróbuj je i po prostu dokonaj refaktoryzacji, jeśli źle ci to pachnie.
Z poważaniem
źródło
Nigdy nie zakładaj, że trywialna metoda dwuwierszowa zadziała. Napisanie szybkiego testu jednostkowego jest jedynym sposobem, aby zapobiec ukąszeniu Cię przez brakujący test zerowy, niewłaściwy znak minus i / lub subtelny błąd zakresu, nieuchronnie wtedy, gdy masz jeszcze mniej czasu na rozwiązanie tego problemu niż teraz.
źródło
Popieram odpowiedź "WYCIECZKA", z tym że testy POWINNY polegać na sobie !!!
Czemu?
DRY - nie powtarzaj się - dotyczy również testów! Zależności testowe mogą pomóc 1) zaoszczędzić czas konfiguracji, 2) oszczędzić zasoby urządzeń i 3) wskazać awarie. Oczywiście pod warunkiem, że twój framework testowy obsługuje zależności pierwszej klasy. W przeciwnym razie, przyznaję, są złe.
Dalsze informacje http://www.iam.unibe.ch/~scg/Research/JExample/
źródło
Często testy jednostkowe są oparte na pozorowanych obiektach lub próbnych danych. Lubię pisać trzy rodzaje testów jednostkowych:
Chodzi o to, aby unikać powtarzania wszystkiego , aby móc przetestować wszystkie funkcje.
źródło
Pomyśl o dwóch rodzajach testów i traktuj je inaczej - testy funkcjonalne i testy wydajnościowe.
Użyj różnych danych wejściowych i danych dla każdego. Może być konieczne użycie innego oprogramowania dla każdego typu testu.
źródło
Używam spójnej konwencji nazewnictwa testów opisanej przez standardy nazewnictwa testów jednostkowych Roya Osherove'a. Każda metoda w danej klasie przypadku testowego ma następujący styl nazewnictwa MethodUnderTest_Scenario_ExpectedResult.
Pierwsza sekcja z nazwą testu to nazwa metody w testowanym systemie.
Następny jest konkretny scenariusz, który jest testowany.
Wreszcie są wyniki tego scenariusza.
Każda sekcja używa Upper Camel Case i jest oddzielona podcięciem.
Uważam, że jest to przydatne, gdy uruchamiam test, testy są grupowane według nazwy testowanej metody. A konwencja pozwala innym programistom zrozumieć cel testu.
Dołączam również parametry do nazwy metody, jeśli testowana metoda została przeciążona.
źródło