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

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>

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



답변

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>


답변

업데이트 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>


답변

보내는 사람 의 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


답변

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!


답변

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>


답변

보완하기 위해 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>


답변

제 경우에는 클래스 경로 ( 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>