2010-05-03 16 views
6

Rozumiem, że istnieją @Before i @BeforeClass, które są używane do definiowania urządzeń dla urządzeń @Test. Ale co powinienem użyć, jeśli potrzebuję różnych urządzeń dla każdego @Test?JUnit Najlepsza praktyka: różne urządzenia dla każdego testu @Test

  • Czy powinienem zdefiniować urządzenie w @Test?
  • Czy należy utworzyć testową klasę dla każdego @Test?

Proszę o najlepsze praktyki tutaj, ponieważ oba rozwiązania nie są w mojej opinii czyste. Przy pierwszym rozwiązaniu przetestowałbym kod inicjujący. A z drugim rozwiązaniem złamałbym wzór "jedna klasa testowa dla każdej klasy".

Odpowiedz

14

Porady:

  1. zapomnę klasę jedno badanie na wzór klasy, ma małą zasługę. Przejdź do jednej klasy testowej na każdą perspektywę użycia. W jednej perspektywie możesz mieć wiele przypadków: górna granica, dolna granica itp. Twórz różne @Testy dla osób z tej samej klasy.
  2. Pamiętaj, że JUnit utworzy instancję klasy testowej dla każdego testu @Test, więc każdy test otrzyma odrębne urządzenie (skonfigurowane przez tę samą metodę @Before). Jeśli potrzebujesz odmiennego urządzenia, potrzebujesz innej klasy testowej, ponieważ jesteś w innej perspektywie (patrz 1.)
  3. Nie ma nic złego w dostosowywaniu urządzenia do konkretnego testu, ale powinieneś próbować utrzymać test w czystości więc opowiada historię. Ta historia powinna być szczególnie jasna, gdy test się nie powiedzie, stąd inny, dobrze nazwany @ test dla każdego przypadku (patrz 1.)
+0

Posiadanie testów "czystych, więc opowiada historię", która jest dobra sama w sobie "zwykle prowadzi do wielokrotnego użytku w testach pomocniczych funtów, więc, miejmy nadzieję, kiedy trzeba będzie zmienić kod i złamie 200 testów wystarczy zmienić funkcję 1. Brak 200 testów. – borjab

0

Proponuję utworzyć oddzielną klasę na podstawie różnych urządzeń, których potrzebujesz. Jeśli masz dwa różne urządzenia, musisz utworzyć dwie różne klasy (nadaj im wygodną nazwę). Ale pomyślałbym po raz drugi o tym, w szczególności o różnicy w meczach i dlaczego są różne. Być może jesteś na drodze do pewnego rodzaju testu integracyjnego zamiast testu jednostkowego?

0

Jeśli masz pewność, że twoje urządzenie jest unikalne dla pojedynczego testu, to należy ono do metody @Test. To jednak nie jest typowe. Może się zdarzyć, że jakaś jego część jest unikalna lub nie sparametryzowałeś/wyodrębniłeś jej poprawnie, ale zazwyczaj będziesz dzielił wiele tych samych danych pomiędzy testami.

Ostatecznie urządzenie należy do testu. Umieszczanie uchwytu w @Before przyjęto jako xUnit wzór dlatego testy zawsze:

  1. przygotowanie danych testowych/kpi
  2. wykonywania operacji SUT
  3. Walidacja/stwierdzić stan/zachowania
  4. zniszczenia danych testowych/kpi

i kroki 1 (@Before) i 4 (@After) są wielokrotnie używane (przynajmniej częściowo) w powiązanych testach. Ponieważ xUnit bardzo poważnie podchodzi do niezależności testu, oferuje metody ustalania, które gwarantują, że zawsze uruchamiają i testują prawidłowo utworzone/zniszczone dane.

Powiązane problemy