Surefire nie odbiera testów Junit 5

113

Napisałem prostą metodę testową z JUnit 5:

public class SimlpeTest {
    @Test
    @DisplayName("Some description")
    void methodName() {
        // Testing logic for subject under test
    }
}

Ale kiedy biegam mvn test, mam:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running SimlpeTest
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

Jakimś cudem na pewno nie rozpoznał tej klasy testowej. Mój pom.xmlwygląd wygląda tak:

<properties>
    <java.version>1.8</java.version>
    <junit.version>5.0.0-SNAPSHOT</junit.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.junit</groupId>
        <artifactId>junit5-api</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>snapshots-repo</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <updatePolicy>always</updatePolicy>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Masz pomysł, jak to działa?

Ali Dehghani
źródło
1
W tej chwili musisz użyć specjalnej implementacji wtyczki surefire. Sprawdź przykłady zespołu junit tutaj
jah
1
Pytanie dotyczy nieaktualnej wersji, ale ta odpowiedź opiera się na aktualnej (stan na grudzień 2016 r.).
Nicolai
@Nicolai Dzięki za aktualizację odpowiedzi. W każdym razie byłbym wdzięczny za twoją zmianę na pytanie, jeśli masz czas.
Ali Dehghani,
1
Ten błąd już się tak nie pojawia. Najbardziej prawdopodobny przypadek braku wykonania testu jest objęty tym pytaniem .
Nicolai
Upewnij się, że pliki testowe znajdują się we właściwym miejscu. Domyślnie test powinien być rodzeństwem dla main w folderze src.
Joe Bowbeer

Odpowiedzi:

115

Na maven-surefire-plugindzień dzisiejszy nie ma pełnego wsparcia JUnit 5 . Istnieje otwarty problem dotyczący dodania tej obsługi w SUREFIRE-1206 .

W związku z tym musisz użyć niestandardowego dostawcy . Jeden został już opracowany przez zespół JUnit; z przewodnika użytkownika , musisz dodać junit-platform-surefire-providerdostawcę i TestEngineimplementację dla nowego API:

<build>
  <plugins>        
    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <!-- latest version (2.20.1) does not work well with JUnit5 -->
      <version>2.19.1</version>
      <dependencies>
        <dependency>
          <groupId>org.junit.platform</groupId>
          <artifactId>junit-platform-surefire-provider</artifactId>
          <version>1.0.3</version>
        </dependency>
        <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-engine</artifactId>
          <version>5.0.3</version>
        </dependency>
      </dependencies>
    </plugin>
  </plugins>
</build>

Pamiętaj też, aby zadeklarować junit-jupiter-apizależność z zakresem test:

<dependencies>
  <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.0.3</version>
    <scope>test</scope>
  </dependency>
</dependencies>
Tunaki
źródło
25
Warto zauważyć, że w tej chwili surefire 2.20.1 nie działa z dostawcą junit 5, więc 2.19.1 użyty w próbce jest nadal ważny pomimo minionego roku.
splatch
1
surefire 2.21.0 też nie działa, muszę przywrócić 2.19.1
valodzka
@valodzka Dla mnie działa z 2.21.0 i nowszymi wersjami wtyczki i junit5. Zobacz junit.org/junit5/docs/current/user-guide/…
Thirler
Zweryfikowano: maven-surefire-plugin v2.21.0działa dobrze z junit-jupiter-engine v5.2.0i junit-platform-surefire-provider v1.2.0
povis
2
Ta konfiguracja nie powiedzie się z Surefire 2.22.0 lub nowszym. Musisz wykluczyć Junit deps z konfiguracji Surefire. Napisałem o tym krótki post tutaj - springframework.guru/…
John Thompson
51

Zaktualizuj 2

Problem został rozwiązany w wersji 2.22.0 Maven Surefire Plugin

Nowa wersja jest dostępna w Maven Central Repository.

Maven

<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.0</version>
</dependency>

Gradle

compile group: 'org.apache.maven.plugins', name: 'maven-surefire-plugin', version: '2.22.0'

Aktualizacja

Jak zauważył Marian , najnowsza wersja JUnit 5 Platform Surefire Provider (1.2.0) obsługuje najnowszą wersję wtyczki Maven Surefire (2.21.0) :

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.21.0</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>1.2.0</version>
                </dependency>
            </dependencies>
        </plugin>



Przykład

pom.xml

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.2.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.21.0</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>1.2.0</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

TestScenario.java

package test;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class TestScenario {

    @Test
    @DisplayName("Test 2 + 2 = 4")
    public void test() {
        Assertions.assertEquals(4, 2 + 2);
    }
}

Wyjście (mvn clean install)

...
[INFO] --- maven-surefire-plugin: 2.21.0 : test (default-test) @ test --- [INFO]
[INFO] -------------- -----------------------------------------
[INFO] TESTY
[INFO] - -------------------------------------------------- ---
[INFO] Trwa test.TestScenario
[INFO] Uruchomione testy: 1, niepowodzenia: 0, błędy: 0, pominięte: 0, czas, który upłynął: 0,005 s - w teście.TestScenario
[INFO]
[INFO] Wyniki:
[INFO] ]
[INFO] Uruchomione testy: 1 , niepowodzenia: 0, błędy: 0, pominięte: 0
...


Najprostszy sposób do dziś:

    <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.19.1</version>
        <dependencies>
            <dependency>
                <groupId>org.junit.platform</groupId>
                <artifactId>junit-platform-surefire-provider</artifactId>
                <version>1.1.0</version>
            </dependency>
        </dependencies>
    </plugin>
Michaił Kholodkow
źródło
1
Działa to tylko z powodu Test w nazwie klasy. Zmień nazwę klasy na ExampleScenario - nie zostanie ona odkryta. (Surefire 2.22.0)
Alexei Vinogradov
@AlexeiVinogradov Yes. To oczekiwane zachowanie. Więcej informacji można znaleźć tutaj: stackoverflow.com/a/6178629/3523579
Mikhail Kholodkov
bevare, wersja silnika junit vs. wersja nadrzędna ze sprężyną rozruchową. Po prostu określ zależność junit-jupiter-engine: 5.1 nie działa tam, gdzie działają nowsze wersje. W systemie Spring Boot nadal wstępnie skonfigurowano JUnit4 <junit.version> 4.13.
Wooff
20

Z dokumentacji JUnit 5 :

Począwszy od wersji 2.22.0, Maven Surefire zapewnia natywne wsparcie dla wykonywania testów na platformie JUnit.

Dodatkowo w maven-surefire-plugindokumentacji możesz przeczytać :

Korzystanie z platformy JUnit 5

Aby rozpocząć korzystanie z platformy JUnit, musisz dodać co najmniej jedną TestEngineimplementację do swojego projektu. Na przykład, jeśli chcesz pisać testy z Jowiszem, dodaj artefakt testu junit-jupiter-engine do zależności w POM

To wystarczy, aby uruchomić testy JUnit 5:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>davidxxx</groupId>
    <artifactId>minimal-pom-junit5</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <junit-jupiter.version>5.2.0</junit-jupiter.version> 
        <!--optional below but good practice to specify our java version-->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>

        <!--optional below -->
        <!-- add any JUnit extension you need such as -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>
        </plugins>
    </build>

</project>

Na mojej przestrzeni GitHub dodałem działający przykładowy projekt maven, który możesz przeglądać / klonować.
URL: https://github.com/ebundy/junit5-minimal-maven-project

davidxxx
źródło
9

Natknąłem się na ten problem z JUnit5 i Mavenem, ale zauważyłem również, że nawet jeśli jako zależność dodany zostanie tylko silnik junit-jupiter-engine, testy będą działać na niektórych projektach, a nie na innych . I widzę ten sam wzór w komentarzach tutaj: W komentarzu @Alex powyżej widać, że nie ma żadnego problemu, nawet z wcześniejszymi wersjami surefire / junit / platform.

Po pewnym czasie drapania się po głowie zdałem sobie sprawę, że te projekty, w których testy nie zostałyby wykonane, to te, w których nazwa metody testów nie zawiera słowa „test”. Chociaż nie jest to wymagane przez http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html

Innymi słowy: tylko z

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.2.0</version>
        <scope>test</scope>
    </dependency>

to

@Test
public void something() {
    assertTrue(true);
}

NIE zostanie uruchomiony, natomiast

@Test
public void testSomething() {
    assertTrue(true);
}

BĘDZIE biegać!

Ten problem rozwija się jako rosyjska lalka ...

W każdym razie +1 dla @Mikhail Kholodkov, którego zaktualizowana odpowiedź rozwiązuje wszystkie problemy naraz!

Fabien M
źródło
Właśnie napotkałem problem z mvn 3.5.0, jdk 1.8.0_101, gdzie nazwa mojej klasy nie miała wpisu „Test”, a test nie został odebrany. Pomogło mi to znaleźć!
dann.dev
Tak, rzeczywiście, powinieneś przestrzegać maven.apache.org/surefire/maven-surefire-plugin/examples/… Ale ja mówiłem o czymś innym.
Fabien M
Tak, okazało się, że miałem dwa problemy, pierwszy to nie pamiętanie podstawowych zasad testu Maven. Drugim nie było wykonanie projektu aktualizacji Maven> dla Eclipse, aby odebrać wyrzutnię junit 5.
dann.dev
Dodam, że klasa i metody muszą być publiczne.
Jónás Balázs
6

Napotkałem ten sam problem w sierpniu 2019 r., O który tutaj zapytałem: Maven po cichu nie znajduje testów JUnit do uruchomienia . Te odpowiedzi poprowadziły mnie we właściwym kierunku, ale stwierdziłem, że możesz rozwiązać problem jeszcze bardziej zwięźle. Skopiowałem moje rozwiązanie z przykładowego projektu Maven JUnit5 .

Począwszy od JUnit 5.5.1 i maven-surefire-plugin2.22.2, nie musisz dodawać junit-platform-surefire-providerzależności. Wystarczy mieć tę jedną zależność i jedną wtyczkę określoną w pom.xml:

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.5.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
    </plugins>
</build>
workerjoe
źródło
To jest poprawne i zwięzłe podejście. Działa z OpenJDK 11 i JUnit 5.6.2.
srebrny
5

Dla uzupełnienia, działa również pewna wersja 2.22.0 + junit 5.2.0 + platforma 1.2.0. W załączeniu roboczy pompon dla Twojej referencji:

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.jjhome.junit5</groupId>
    <artifactId>junit5-hone</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <name>junit5-home</name>

    <properties>
        <maven.compiler.source>1.6</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit5.version>5.2.0</junit5.version>
        <platform.version>1.2.0</platform.version>
        <surefire.version>2.22.0</surefire.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>${platform.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-runner</artifactId>
            <version>${platform.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire.version}</version>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>${platform.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>${junit5.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
schnell18
źródło
Mój problem polegał na tym, że nie miałem junit-vintage-enginejako zależności, a wszystkie moje testy zostały napisane dla JUnit 4.
Mark
połączenie określonych wersji junit, platform i surefire działało dla mnie. dzięki !
CoderTR
4

W moim przypadku było to spowodowane TestNG w ścieżce klas ( SUREFIRE-1527 ). Groovy 2.5.5 POM przywiózł go z groovy-testngmodułem.

Ręcznie określony dostawca platformy testowej (jak opisano na https://maven.apache.org/surefire/maven-surefire-plugin/examples/providers.html ) rozwiązał problem:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>

    <dependency>
        <groupId>org.apache.maven.surefire</groupId>
        <artifactId>surefire-junit-platform</artifactId>
        <version>2.22.1</version>
    </dependency>
Lu55
źródło
Powinieneś opakować <dependency>w <dependencies>przykładowy kod.
user1053510
1

Miałem podobny problem, który powodował, że Surefire rozpoznawał testy zerowe.

Mój problem okazał się związany z następującym (z dokumentacji JUnit 5.1.0 / maven ):

Ze względu na wyciek pamięci w Surefire 2.20 i problemy z działaniem w Javie 9, junit-platform-surefire-provider obecnie działa tylko z Surefire 2.19.1.

Próbowałem użyć najnowszych wersji Surefire (2.21.0) i junit-platform-surefire-provider (1.1.0) i nie działało (ani w Javie 8, ani w 9)

Powrót do Surefire 2.19.1 rozwiązał mój problem.

Zgodnie z tym problemem poprawka zostanie uwzględniona w wersji 1.2.0 junit-platform-surefire-provider (obecnie dostępna tylko jako SNAPSHOT).

avandeursen
źródło
1
Wypróbowałem SNAPSHOT i wszystko działa (z Surefire 2.21.0). Miejmy nadzieję, że w momencie premiery nadal działa.
user7610
1

Zauważyłem jedną rzecz, że udało mi się to uruchomić:

  • Maven ClinicCalendarShouldnie wybiera nazwy mojej klasy testowej
  • Nazwanie mojej klasy testowej ClinicCalendarTestMUSI zostać odebrane przez mavena

Tak więc, jeśli nie brakuje mi jakiejś konfiguracji, parametru lub czegokolwiek w wtyczce surefire, domyślnie musisz nazwać swoje klasy testowe XXXTest.

jkilgrow
źródło
0

Aktualizacja w celu maven-surefire-plugin:2.20uruchomienia testów Junit5 bez problemu.

Ale używam M6wersji na Junit5.

LazerBanana
źródło
Nie takie proste (przynajmniej w tej chwili). Zobacz Podręcznik użytkownika JUnit 5
FrVaBe
@FrVaBe dziwne, że działa dobrze na mojej z wersją m6.
LazerBanana
2
Zmęczyłem pewnie-2.20.1 + junit-5.0.2 i nie zadziałało. Próbowałem też surefire-2.20.1 + junit-5.1.0-M6 i to nie działało
Eric
0

W moim przypadku pewna wtyczka nie otrzymała poprawnej wersji z jupiter-engine / api. I to nawet jeśli uruchomiono Maven 3.6.1 und surefireplugin w wersji 2.22.2!

Teraz moja konfiguracja pewnej wtyczki wygląda następująco:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                    <version>5.5.2</version>
                </dependency>
            </dependencies>
        </plugin>

        ...
    </plugins>
</pluginManagement>

Co więcej, musiałem wymusić te wersje:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-engine</artifactId>
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-commons</artifactId>
            <version>1.5.2</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Wygląda na to, że 5.5.2 został połączony z niewłaściwą wersją platformy 1.3.2 zamiast 1.5.2 w moim przypadku.

Wszystkie testy JUnit5 są dostępne teraz. Nawet z 2.22.0 pewnej wtyczki tak się nie stało!

Mam nadzieję, że to pomoże ...

Sztylet
źródło
0

Miałem do czynienia z tym samym problemem junit5i maven-surefiretesty kończyły się niepowodzeniem. Jednak junit4działał dobrze. Poniższa kombinacja zadziałała u mnie, nie dodam wersjonowania. Służy junit-bomdo zarządzania zależnościami. Za pomocąspring-boot 2.1.4

   <dependencyManagement>
    <dependencies>
            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>junit-bom</artifactId>
                <version>5.6.1</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <scope>test</scope>
        </dependency>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Upewnij się, że dokonałeś aktualizacji do najnowszej wersji eclipse

garg10may
źródło