2016-08-22 11 views
6

Jak wykonać wszystkie testy Suite przy pomocy JUnit 5 w IntelliJ IDEA v2016.2.2?JUnit 5 - Pusty zestaw testów w IntelliJ IDEA przy użyciu JUnit Jupiter engine

uzyskać Empty Test Suite działa ten kod:

import org.junit.platform.runner.IncludeEngines; 
import org.junit.platform.runner.JUnitPlatform; 
import org.junit.platform.runner.SelectPackages; 
import org.junit.runner.RunWith; 

@RunWith(JUnitPlatform.class) 
@IncludeEngines("junit-jupiter") 
@SelectPackages("<eu...package>") //I confirm that <eu...package> is ok. 
public class AllTests { 
} 

otrzymuję:

INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage] 
Empty test suite. 
Empty test suite. 

[root] 
JUnit Jupiter 
JUnit Vintage 

LUB

import eu.....services.ServiceTest; 
import eu.....repository.DAOTest; 
import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 

@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
     ServiceTest.class, 
     DAOTest.class 
}) 
public class AllTests { 
} 

otrzymuję:

INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage] 
Empty test suite. 

[root] 
|+--JUnit Vintage 
| +--eu.....AllTests 
|+--JUnit Jupiter 

udało mi się uruchomić pakiet z JUnit 4, ale to nie działa z JUnit 5.

+0

Aby prawidłowo ocenić, dlaczego zestaw testów jest pusty, musielibyśmy zobaczyć kod źródłowy co najmniej jednej z klas testowych w pakiecie ''. Musimy na przykład zobaczyć, że używasz poprawnych adnotacji i że metody testowania są prawidłowo adnotowane/zadeklarowane. –

+0

@SamBrannen, metody są obecnie opisywane za pomocą 'org.junit.jupiter.api.Test'. Jeśli wstawię "org.junit.Test" niż rocznik "Vintage", to działa, jeśli wstawię Suite.class, ale jest to Vintage. Poprosiłem o wykonanie pakietu z JUnit5 (Jupiter). Jako potwierdzenie, zestaw testów jest pusty również w twojej bibliotece, kiedy wykonujesz testową klasę 'SpringExtensionTestSuite'. – Davidea

+0

Jeśli "git clone [email protected]: sbrannen/spring-test-junit5.git", 'cd spring-test-junit5', uruchom' gradlew eclipse' i zaimportuj projekt do Eclipse, obiecuję ci, że ' SpringExtensionTestSuite' wykonuje się poprawnie i nie jest pusty. –

Odpowiedz

10

krótka odpowiedź

Jeśli używasz IntelliJ IDEA 2016.2, w tej chwili nie można wykonać klasę testową opatrzone komentarzem z @RunWith(JUnitPlatform.class) w IDE.

długa odpowiedź

podstawie zachowań ty donosi, po pewnym żmudnej pracy dochodzeniowej, wierzę, mam odpowiedź na swoje pytanie ...

Jeśli używasz IntelliJ IDEA 2016.2, który ma wbudowane wsparcie dla JUnit 5, to co się dzieje.

  1. IDEA uruchamia Platformę JUnit poprzez Launcher API, wybierając klasę testową uwagami z @RunWith(JUnitPlatform.class) (nazwijmy go TestSuite).
  2. Obiekt Launcher wykrywa zarówno implementacje junit-jupiter i TestEngine.
  3. Silnik JUnit Jupiter ignoruje TestSuite, ponieważ technicznie nie jest to klasa testowa JUnit Jupiter.
  4. Silnik JUnit Vintage również ignoruje TestSuite, ponieważ jest opatrzony komentarzem @RunWith(JUnitPlatform.class).
  5. Wynik końcowy jest taki, że żaden zarejestrowany silnik testowy nie twierdzi, że może uruchomić klasę TestSuite.

Non-intuicyjne jest to, że silnik rocznik JUnit ignoruje TestSuite, kiedy to w rzeczywistości wygląda JUnit 4 w oparciu o klasy testowej ponieważ jest opatrzone @RunWith().Przyczyną tego, że jest ignorowany jest uniknięcie nieskończonej rekurencji, która opisana jest w kodzie źródłowym dla DefensiveAllDefaultPossibilitiesBuilder:

if ("org.junit.platform.runner.JUnitPlatform".equals(runnerClass.getName())) { 
    return null; 
} 

Fakt, że powyższy kod zwraca null w takich wyników scenariuszy w pustym apartamencie.

Oczywiście na pewno byłoby lepiej, gdyby użytkownik został poinformowany o takich scenariuszach - na przykład za pomocą oświadczenia dziennika. W związku z tym otworzyłem problemy zarówno dla JUnit 5 i IntelliJ, aby poprawić użyteczność w takich scenariuszach.

Po stronie dodatniej, ponieważ korzystasz z IntelliJ IDEA 2016.2, nie musisz używać zestawu testów. Zamiast tego można po prostu kliknąć prawym przyciskiem myszy na src/test/java w widoku projektu w IDEA i wybrać Run 'All Tests', a to spowoduje uruchomienie wszystkich testów.

Pozdrawiam,

Sam (JUnit 5 rdzeń committer)

+0

OK, w końcu dowiedziałeś się, dlaczego. Nie mogłem sobie wyobrazić, że to było IDE. Dobra robota Sam. Wykonam wtedy wszystkie testy z tego folderu. – Davidea

0

Według junit oficial website:

Wystarczy upewnić się, że artefakt JUnit-vintage-maszyna znajduje się w ścieżce uruchomieniowej testu. W takim przypadku JUnit 3 i JUnit 4 testy będą automatycznie odbierane przez wyrzutni JUnit Platform
+0

to nie działa twoje rozwiązanie. Na metodach klas testowych mam 'org.junit.jupiter.api.Test' i jeśli wykonuję testy dla tej klasy tylko działa pod silnikiem Jupiter. Również, jeśli wstawię "org.junit".Test', oznacza to, że Vintage, a nawet wykonanie Suite wykonywane jest w Vintage! Ale tego nie wszyscy chcemy. Zapytałem JUnit5, tak z Jupiter silnika, myślę, że to oczywiste, w przeciwnym razie dlaczego uaktualnić do JUnit5? Mam na myśli [4.4.4. Test Suite] w oficjalnej dokumentacji witryny. – Davidea

0

dodatkowy do Sam Brannen's answer. Potrzebowałem TestSuit do ustawienia backendu przed uruchomieniem wszystkich klas testowych w pakiecie. Prawdopodobnie nie jest to możliwe poprzez Run 'All Tests'.

Ale myślę, że znalazłem dobre obejście tego. Wpadłem na to:

import org.junit.jupiter.api.BeforeAll; 
import org.junit.jupiter.api.Nested; 
import your.other.package.test.classes.*; 

public class TestSuit { 
    @BeforeAll 
    public static void setup(){} 

    @Nested 
    public class TestExtender extends MyTestClass {} 
} 

Można przedłużyć każdą klasę testową z innym opakowaniu i dodać @Nested adnotacji do niego. To nie jest najlepsze rozwiązanie, ale jest to obejście problemu, dopóki IDEA lub JUnit 5 nie znajdą innego rozwiązania dla tych przypadków.

Powiązane problemy