Jest kompromis. Im więcej spakujesz w jednym teście, tym bardziej prawdopodobne będzie, że będziesz mieć efekt cebuli, próbując go przejść. Innymi słowy, pierwsza awaria kończy ten test. Nie poznasz innych twierdzeń, dopóki nie naprawisz pierwszej awarii. To powiedziawszy, posiadanie szeregu testów jednostkowych, które są w większości podobne, z wyjątkiem kodu konfiguracji, jest bardzo pracochłonne, aby dowiedzieć się, że niektóre prace są napisane, a inne nie.
Możliwe narzędzia, w zależności od twojego frameworka:
- Teorie . Teoria pozwala przetestować szereg faktów na temat zestawu danych. Struktura będzie następnie zasilać twoje testy wieloma scenariuszami danych testowych - albo przez pole, albo za pomocą metody statycznej, która generuje dane. Jeśli niektóre z twoich faktów mają zastosowanie w oparciu o pewne warunki wstępne, a inne nie, te ramy wprowadzają koncepcję założenia . Po
Assume.that()
prostu pomija test danych, jeśli nie spełni warunku wstępnego. Pozwala to zdefiniować „Działa zgodnie z oczekiwaniami”, a następnie po prostu podać mu dużo danych. Podczas przeglądania wyników masz pozycję dla testów nadrzędnych, a następnie pozycję dla każdego elementu danych.
- Testy sparametryzowane . Testy sparametryzowane były prekursorem teorii, więc może nie być tego sprawdzania warunków wstępnych, które można mieć z teoriami. Wynik końcowy jest taki sam. Wyświetlane są wyniki, masz pozycję nadrzędną dla samego testu, a następnie określoną pozycję dla każdego punktu danych.
- Jeden test z wieloma twierdzeniami . Wykonanie konfiguracji zajmuje mniej czasu, ale w końcu od czasu do czasu odkrywasz problemy. Jeśli test jest zbyt długi i testowanych jest zbyt wiele różnych scenariuszy, istnieją dwa duże zagrożenia: jego uruchomienie zajmie dużo czasu, a Twój zespół będzie miał tego dość i wyłączy test.
- Wiele testów z podobną implementacją . Należy zauważyć, że jeśli twierdzenia są różne, testy nie nakładają się na siebie. Byłaby to jednak konwencjonalna mądrość zespołu skoncentrowanego na TDD.
Nie jestem przekonany, że może być tylko jeden assert
w teście stwierdzenie, ale stawiam ograniczenia, że wszyscy twierdzący powinni przetestować warunki pojedynczego działania. Jeśli jedyną różnicą między testami są dane, jestem skłonny do korzystania z bardziej zaawansowanych funkcji testowych opartych na danych, takich jak sparametryzowane testy lub teorie.
Zważyć opcje, aby zdecydować, jaki jest najlepszy wynik. Powiem, że „WorksAsExpectedWhenNull” zasadniczo różni się od wszystkich przypadków, w których mamy do czynienia z kolekcją zawierającą różną liczbę elementów.