2012-03-12 14 views
13

Używam JUnit4.Jak sprawić, aby przypadki testowe JUnit działały w kolejności?

Mam zestaw metod testowych w przypadku testowym.

Każda metoda testowania powoduje wstawienie niektórych rekordów i zweryfikowanie wyniku testu, a następnie usunięcie wprowadzonych rekordów.

Od biegu JUnit równolegle, metody badań nie z powodu jakiegoś rekordy obecny podczas wykonywania poprzedniej metody badania. To dzieje się tylko w moim komputerze współpracownika (Windows 7), a nie w moim komputerze (Cent OS 6).

Potrzebujemy, aby metody testowe musiały przejść na wszystkich naszych maszynach.

Próbowałem wyczyścić rekordy w metodzie Setup(), ale znowu działa tylko na moim komputerze. Czy w JUnit dostępna jest jakakolwiek opcja, aby uruchomić metody testowe w jednolitej kolejności?

Dzięki,

Odpowiedz

5

Zamawianie testów nie jest gwarantowane w JUnit.

Powodem tego jest to, że testy jednostkowe mają być atomowe - wszystkie ustawienia powinny się odbywać w metodach konfiguracji/odrywania, ale nie w innych testach.

Rozważ przeniesienie kodu wstawiającego dane do innej klasy pomocnika, która może zostać wywołana zarówno przez test, który wstawia, jak i klasę wymagającą weryfikacji, oraz wywołanie tej klasy w metodach @Before.

Należy również rozważyć rozwiązanie szydercze (np. Mockito), a nie uderzać bezpośrednio w bazę danych, jeśli możesz - kpiny pójdą na długą drogę, aby zapewnić, że twoje testy są ładne i odizolowane, a jako przyjemna korzyść uboczna, zwykle pomagają wskazać, gdzie można użyć refaktoryzacji.

+0

Dzięki za odpowiedź, sprawdzę to. – Athiruban

+1

Można również użyć czegoś w rodzaju DBUnit do kontrolowania konfiguracji i rozbiórki bazy danych, ale w przypadku czystych testów jednostkowych Mockito ma więcej sensu, ponieważ pozwala na całkowicie niezależne testy. – TrueDub

2

Ponieważ testy są przeprowadzane równolegle, a użytkownik trafia do bazy danych, najprawdopodobniej wystąpią problemy, ponieważ baza danych niekoniecznie będzie w stanie spójnym dla każdego testu.

Rozwiązanie: nie uruchamiaj testów równolegle. JUnit domyślnie nie uruchamia testów równolegle, więc albo ustawiasz opcję w maven, albo używasz jednego z równoległych biegaczy w JUnit.

Jeśli nadal masz problemy między testami, które zawiodły w systemie Windows, ale nie w Cent Center, może to być problem z kolejnością uruchamiania, którą musisz naprawić. Zobacz moją odpowiedź na Has JUnit4 begun supporting ordering of test? Is it intentional?.

Sposób obejścia tego (przynajmniej w kategoriach JUnit) polega na usunięciu zależności między testami. Zasadniczo JUnit nie obsługuje zamawiania, a testy powinny być uruchamiane w dowolnej kolejności.

Jeśli naprawdę potrzebujesz zależności między testami, użyj TestNG, gdzie możesz mieć zależności.

23

JUnit 4.11 obsługuje teraz określanie kolejności wykonywania przy użyciu adnotacji @FixMethodOrder.

21

MethodSorters to nowa klasa wprowadzona po wydaniu Junit 4.6. Klasa ta zadeklarowała trzy typy kolejności wykonania, które można wykorzystać w testowych przypadkach podczas ich wykonywania.

  1. NAME_ASCENDING (MethodSorters.NAME_ASCENDING) - sortuje METODY BADAŃ nazwą metody, w leksykograficznej kolejności.

  2. JVM (zerowy) - pozostawia metody badań w celu zwróconego przez JVM. Zauważ, że kolejność z JVM moi się zmienia od uruchomienia do uruchomienia.

  3. DEFAULT (MethodSorter.DEFAULT) - Sortuje metod badawczym w deterministyczny, ale nie do przewidzenia, porządku.

.

import org.junit.FixMethodOrder; 
import org.junit.Test; 
import org.junit.runners.MethodSorters; 

//Running test cases in order of method names in ascending order 

@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class OrderedTestCasesExecution { 

    @Test 
    public void secondTest() { 
     System.out.println("Executing second test"); 
    } 

    @Test 
    public void firstTest() { 
     System.out.println("Executing first test"); 
    } 

    @Test 
    public void thirdTest() { 
     System.out.println("Executing third test"); 
    } 
} 

wyjściowa:

Executing first test 
Executing second test 
Executing third test 

referencyjny: http://howtodoinjava.com/2012/11/24/ordered-testcases-execution-in-junit-4/

-1

Nie ma problemu uruchamiania testów równolegle nawet jeśli masz warstwy danych w nim. Musisz jednak wykonać dodatkową pracę, aby utworzyć MOCK UP dla swoich danych, aby nie trafił do bazy danych. Możesz użyć różnych makiet, takich jak Mockito, EasyMock i Arquillian.

+0

Arquillian nie jest szyderczym ramieniem. zobacz http://arquillian.org/ –

Powiązane problemy