Surefire는 Junit 5 테스트를 선택하지 않습니다.


113

JUnit 5로 간단한 테스트 방법을 작성했습니다.

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

하지만 실행 mvn test하면 다음을 얻었습니다.

-------------------------------------------------------
 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

어쨋든, 확실한 테스트 클래스는 인식하지 못했습니다. 내 pom.xml모습 :

<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>

이 작업을 수행하는 방법을 아십니까?


1
지금 당장은 surefire-plugin의 특별한 구현을 사용해야합니다. 여기
jah

1
질문은 오래된 버전을 기반으로하지만 이 답변 은 현재 버전 (2016 년 12 월 기준)을 기반으로합니다.
Nicolai

@Nicolai 답변을 업데이트 해 주셔서 감사합니다. 어쨌든 시간이 있다면 질문에 대한 편집을 부탁드립니다.
알리 데 가니

1
이 오류는 더 이상 발생하지 않습니다. 테스트 실행이 부족할 가능성이 가장 높은 경우는 이 질문에서 다룹니다 .
Nicolai

테스트 파일이 올바른 위치에 있는지 확인하십시오. 기본적으로 test는 src 폴더에서 main의 형제 여야합니다.
Joe Bowbeer 19 년

답변:


115

maven-surefire-plugin, 오늘로, 않습니다 JUnit을 5의 전체를 지원하지 . SUREFIRE-1206 에이 지원을 추가하는 것에 대한 미해결 문제가 있습니다.

따라서 사용자 지정 공급자 를 사용해야합니다 . 하나는 이미 JUnit 팀에 의해 개발되었습니다. 으로부터 사용자 가이드 , 당신은 추가 할 필요가 junit-platform-surefire-provider제공하고 TestEngine새로운 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>

또한 다음 junit-jupiter-api과 같은 범위로 종속성 을 선언해야합니다 test.

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

25
현재 확실하게 2.20.1은 junit 5 공급자와 작동하지 않으므로 샘플에 사용 된 2.19.1은 1 년이 지났음에도 여전히 유효합니다.
splatch

1
확실한 2.21.0도 작동하지 않습니다. 2.19.1로 롤백해야합니다.
valodzka

@valodzka 나를 위해 그것은 2.21.0 이상 버전의 플러그인과 junit5에서 작동합니다. junit.org/junit5/docs/current/user-guide/…
Thirler

검증 : maven-surefire-plugin v2.21.0함께 잘 작동 junit-jupiter-engine v5.2.0하고 junit-platform-surefire-provider v1.2.0
POVIS

2
이 구성은 Surefire 2.22.0 이상에서 실패합니다. Surefire 구성에서 Junit deps를 제외해야합니다. 나는 그것에 대한 빠른 포스트를 여기에 썼다 -springframework.guru/…
John Thompson

51

업데이트 2

Maven Surefire Plugin v2.22.0에서 문제 가 수정되었습니다.

Maven Central Repository에서 새 버전 을 사용할 수 있습니다.

메이븐

<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'

최신 정보

으로 마리아는 지적, 최신 버전 의 JUnit 5 플랫폼 확실한 공급자 (1.2.0) 의 최신 버전을 지원 메이븐 확실한 플러그인 (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>



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);
    }
}

출력 (mvn 새로 설치)

...
[정보] --- maven-surefire-plugin : 2.21.0 : test (default-test) @ test --- [정보]
[정보] -------------- -----------------------------------------
[정보] 테스트
[정보]- -------------------------------------------------- ---
[INFO] Running test.TestScenario
[INFO] 테스트 실행 : 1, 실패 : 0, 오류 : 0, 건너 뜀 : 0, 경과 시간 : 0.005 초-in test.TestScenario
[INFO]
[INFO] 결과 :
[INFO ]
[정보] 테스트 실행 : 1 , 실패 : 0, 오류 : 0, 건너 뛰기 : 0
...


오늘까지 가장 간단한 방법 :

    <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>

1
이것은 클래스 이름의 Test 때문에 작동합니다 . 클래스 이름을 ExampleScenario로 변경하면 검색되지 않습니다. (Surefire 2.22.0)
Alexei Vinogradov

@AlexeiVinogradov 예. 예상되는 동작입니다. 자세한 정보는 여기에서 확인할 수 있습니다. stackoverflow.com/a/6178629/3523579
Mikhail Kholodkov

bevare, junit 엔진 버전 대 스프링 부트 부모 버전. 종속성을 지정하기 만하면 junit-jupiter-engine : 5.1은 최신 버전이 작동하지 않습니다. 스프링 부트는 여전히 JUnit4 <junit.version> 4.13을 미리 구성했습니다.
Wooff

20

보내는 사람 의 JUnit 5 문서 :

버전부터 2.22.0Maven Surefire는 JUnit 플랫폼에서 테스트를 실행하기위한 기본 지원을 제공합니다.

또한 maven-surefire-plugin문서 에서 읽을 수 있습니다 .

JUnit 5 플랫폼 사용

JUnit Platform을 시작하려면 TestEngine프로젝트에 하나 이상의 구현을 추가해야합니다 . 예를 들어 Jupiter로 테스트를 작성 junit-jupiter-engine 하려면 POM의 종속성에 테스트 아티팩트 를 추가하십시오.

따라서 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>

내 GitHub 공간에서 탐색 / 복제 할 수있는 작동하는 샘플 Maven 프로젝트를 추가했습니다.
URL : https://github.com/ebundy/junit5-minimal-maven-project


9

JUnit5와 Maven에서이 문제에 부딪 혔지만 junit-jupiter-engine 종속성으로 추가 된 경우에도 테스트가 다른 프로젝트가 아닌 일부 프로젝트에서 실행 된다는 사실을 발견 했습니다. . 그리고 저는 여기 주석에서 동일한 패턴을 봅니다. 위의 @Alex 주석에서 그는 이전 버전의 surefire / junit / platform에서도 문제가 없음을 알 수 있습니다.

몇 시간 동안 내 머리를 긁적 후 나는 테스트가 실행되지 않을 것입니다 해당 프로젝트가 시험의 경우 그했다 실현 방법의 이름은 DIT 없는 단어 "테스트"를 포함합니다. http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html 에 의해 의무화되지는 않지만

즉, 그냥

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

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

실행되지 않는 반면

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

실행됩니다!

이번 호는 러시아 인형으로 전개된다 ...

어쨌든 업데이트 된 답변이 모든 문제를 한 번에 해결하는 @Mikhail Kholodkov에게는 +1!


나는 또한 mvn 3.5.0, jdk 1.8.0_101에서 내 클래스 이름에 'Test'가없고 테스트가 선택되지 않은 문제를 경험했습니다.
dann.dev

예, 실제로 maven.apache.org/surefire/maven-surefire-plugin/examples/…를 준수해야합니다. 하지만 저는 다른 것에 대해 이야기하고있었습니다.
Fabien M

네, 두 가지 문제가있는 것으로 나타났습니다. 첫 번째는 기본 메이븐 확실한 테스트 규칙을 기억하지 못했습니다. 두 번째는 eclipse가 junit 5 런처를 선택하기 위해 Maven> 업데이트 프로젝트를 수행하지 않았습니다.
dann.dev

클래스와 메서드가 공개되어야한다고 추가하고 싶습니다.
Jónás Balázs

6

2019 년 8 월에 여기에서 물었던 동일한 문제가 발생했습니다. Maven이 .NET을 실행할 JUnit 테스트를 자동으로 찾지 못했습니다 . 이 대답은 저를 올바른 방향으로 이끌었지만 문제를 더 간결하게 해결할 수 있다는 것을 알았습니다. JUnit5 샘플 Maven 프로젝트 에서 내 솔루션을 복사 했습니다. .

JUnit 5.5.1 및 maven-surefire-plugin2.22.2부터는 junit-platform-surefire-provider종속성 을 추가 할 필요가 없습니다 . 이 하나의 종속성과 하나의 플러그인을 지정하면 충분합니다 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>

이것은 정확하고 간결한 접근 방식입니다. OpenJDK 11 및 JUnit 5.6.2에서 작동합니다.
은색

5

보완하기 위해 surefire 2.22.0 + junit 5.2.0 + platform 1.2.0도 작동합니다. 첨부 파일은 귀하의 추천에 대한 작업 pom입니다.

    <?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>

내 문제는 내가 junit-vintage-engine의존성 이 없다는 것이 었고 모든 테스트는 JUnit 4 용으로 작성되었습니다.
Mark

지정된 junit, 플랫폼 및 확실한 버전의 조합이 저에게 효과적이었습니다. 감사 !
CoderTR

4

제 경우에는 클래스 경로 ( SUREFIRE-1527 ) 의 TestNG 때문이었습니다 . Groovy 2.5.5 POM은groovy-testng 모듈 .

수동으로 지정된 테스트 프레임 워크 공급자 ( https://maven.apache.org/surefire/maven-surefire-plugin/examples/providers.html에 설명되어 있음 )가 문제를 해결했습니다.

<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>

당신은 포장한다 <dependency><dependencies>코드 샘플에서.
user1053510


1

비슷한 문제가있어 Surefire가 제로 테스트를 인식합니다.

내 문제는 다음과 관련된 것으로 판명되었습니다 ( JUnit 5.1.0 / maven 문서에서).

Surefire 2.20의 메모리 누수 및 Java 9에서 실행되는 문제로 인해 junit-platform-surefire-provider는 현재 Surefire 2.19.1에서만 작동합니다.

최신 버전의 Surefire (2.21.0) 및 junit-platform-surefire-provider (1.1.0)를 사용하려고했지만 작동하지 않았습니다 (Java 8 또는 9 모두에서)

Surefire 2.19.1로 다시 전환하면 문제가 해결되었습니다.

에 따르면 이 문제 수정이 (만 스냅 샷으로 현재 사용 가능)의 JUnit - 플랫폼 - 확실한 - 공급자의 버전 1.2.0에 포함됩니다.


1
SNAPSHOT을 사용해 보았고 모든 것이 작동합니다 (Surefire 2.21.0 사용). 출시 당시에도 여전히 작동하기를 바랍니다.
user7610

1

내가 그것을 작동시킬 수 있다는 것을 알아 차린 한 가지는 :

  • 내 테스트 클래스 이름 지정 ClinicCalendarShould은 maven에서 선택하지 않습니다.
  • 내 테스트 클래스 이름을 지정 ClinicCalendarTest하면 maven이 선택합니다.

따라서 어떤 종류의 구성이나 매개 변수 또는 확실한 플러그인이 누락되지 않는 한 기본적으로 테스트 클래스의 이름을 XXXTest로 지정해야합니다.


0

maven-surefire-plugin:2.20문제없이 Junit5 테스트 를 실행하도록 업데이트합니다 .

하지만 M6Junit5 에서 버전을 사용하고 있습니다.


(적어도 현재로서는) 그렇게 간단하지 않습니다. 참조 JUnit을 5 사용 설명서
FrVaBe

@FrVaBe는 m6 버전에서 잘 작동합니다.
LazerBanana

2
나는 surefire-2.20.1 + junit-5.0.2를 지 쳤고 작동하지 않았습니다. 또한 확실한-2.20.1 + JUnit을-5.1.0-M6을 시도하고 작동하지 않았다
에릭

0

제 경우에는 surefire 플러그인이 jupiter-engine / api에서 올바른 버전을 얻지 못했습니다. Maven 3.6.1 및 surefireplugin 버전 2.22.2를 실행하는 경우에도 마찬가지입니다!

이제 내 확실한 플러그인 구성은 다음과 같습니다.

<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>

또한 다음 버전을 강제로 적용해야했습니다.

<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>

5.5.2가 내 경우 1.5.2 대신 잘못된 플랫폼 버전 1.3.2에 연결된 것 같습니다.

모든 JUnit5 테스트가 이제 선택됩니다. 2.22.0의 확실한 플러그인을 사용하더라도 이것은 나에게 해당되지 않았습니다!

도움이되는 희망 ...


0

나는 둘 다 같은 문제에 직면 junit5했고 maven-surefire테스트가 실패했습니다. 그러나 junit4잘 돌아가고 있었다. 아래 조합이 저에게 효과적이지만 버전 관리를 추가하지 않습니다. junit-bom종속성 관리에 사용 합니다. 사용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>

최신 버전의 Eclipse로 업그레이드하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.