테스트의 JUnit 4에서 실행하지만 JUnit을 5하지 - 컴파일 깨끗하지만 0 테스트 실행

바질 우르 큐 :

누구나 쉽게 몇 분 안에이 문제를 재현 할 수 있습니다.

기본 메이븐 quickstart프로젝트

IntelliJ에 2018.3 메이븐 3.6.0로, 나는 메이븐 아키 타입 사용하여 새로운 프로젝트를 만들 maven-archetype-quickstart버전 1.4.

여기에 이미지 설명을 입력

자바 (11)

새 프로젝트의 POM 파일에서, 나는 속성을 변경 maven.compiler.source하고 maven.compiler.target현재 사용하고있는 자바 11.0.2 I를 위해, 1.7에서 11 줄루어 에서 아줄 시스템 .

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>11</maven.compiler.source>
  <maven.compiler.target>11</maven.compiler.target>
</properties>

인 IntelliJ의 메이븐 패널에서, 나는 실행 cleaninstall라이프 사이클 이벤트를.

여기에 이미지 설명을 입력

의 JUnit 4 테스트 실행

As part of install, the tests are run. This quickstart archetype comes with one single test that asserts true.

여기에 이미지 설명을 입력

The results appear in the Run panel of IntelliJ.

[INFO] Running work.basil.example.AppTest

[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 s - in work.basil.example.AppTest

So I know the test executed.

JUnit 5, not 4

This is all good. Now let's upgrade to JUnit 5, to see the problem.

In the POM, I change the JUnit dependency from this:

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
</dependencies>

…to this:

<dependencies>
  <!--JUnit 5-->
  <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.3.2</version>
    <scope>test</scope>
  </dependency>
</dependencies>

Jupiter imports (no vintage tests)

The compiler complains about my AppTest.java file. So I change the import statements there to use the jupiter packages. I only want to run JUnit 5 tests in my new greedfield project, with no need for vintage JUnit 4 tests. So the imports change from this:

import static org.junit.Assert.assertTrue;
import org.junit.Test;

…to this:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;

Then I execute the Maven > Lifecycle > clean & install.

…and voilà, the problem: Our test is not executed. The report seen in the Run panel of IntelliJ:

[INFO] Running work.basil.example.AppTest

[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.003 s - in work.basil.example.AppTest

➥ Why does JUnit 5 fail to run the very same test that JUnit 4 happily ran?

Update surefire plugin

I suspect the Maven Surefire Plugin needs to be updated. So in the POM I change this:

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.22.1</version>
</plugin>

…to this:

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>3.0.0-M3</version>
</plugin>

Another clean & install. But no better, still runs 0 tests.

[INFO] Running work.basil.example.AppTest

[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 s - in work.basil.example.AppTest

Entire POM

Here is my entire POM file.

<?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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>work.basil.example</groupId>
  <artifactId>tester</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>tester</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <!--JUnit 5-->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.3.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>3.0.0-M3</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

JUnit libraries

After doing a Maven clean & install, two JUnit libraries appear: junit-jupiter-api and junit-platform-commons.

여기에 이미지 설명을 입력

Other versions of JUnit 5

I tried the following versions in my junit-jupiter-api dependency:

  • 5.0.0-M1
  • 5.1.1
  • 5.3.0
  • 5.3.2
  • 5.4.0-M1

On each attempt, I ran a Maven clean & install. No better. Each of those versions reported Tests run: 0.

Do not blame maven-archetype-quickstart

I actually discovered this problem in a much different project using an entirely different Maven archetype.

To nail down this buggy JUnit 5 behavior, I tried a new fresh project using the very simple maven-archetype-quickstart. I found the very same behavior: Everything compiles, the test harness in running, but no tests are executed under JUnit 5.

Basil Bourque :

tl;dr

For JUnit 5 version 5.4.0-M1 or later, specify the new single Maven artifact junit-jupiter “Aggregator” in your POM.

<!--JUnit 5-->
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.4.0-M1</version>
</dependency>

For earlier versions, specify at least these two artifacts: junit-jupiter-api & junit-jupiter-engine.

JUnit 5 yokes multiple testing frameworks

From what I can gather, JUnit 5 has been re-architected to be a yoke for multiple testing frameworks. These testing systems include JUnit 4 “vintage” tests, the new JUnit 5 tests (new syntax for tests, with new annotations & methods), and others such as Specsy, Spek, Cucumber, Drools Scenario, jqwik, and more that implement the TestEngine interface.

Apparently the junit-jupiter-api artifact is only the outer yoke. You must also specify one or more TestEngine implementations to actually run tests. For example, to run the vintage JUnit 4 tests, you need the VintageTestEngine implementations, or to run JUNit 5 tests you need the JupiterTestEngine implementation.

So to run your JUnit 5 tests, you must specify a JupiterTestEngine implementation in your Maven POM with the junit-jupiter-engine artifact.

See the JUnit 5 manual, specifically the section Configuring Test Engines.

See this presentation by Marc Philipp, with a diagram showing JUnit 5 as a platform having (A) a core for IDE/build tools with (B) pluggable test-writing frameworks for programmers authoring tests.

junit-jupiter-engine

As seen on this sample, add a second JUnit-related dependency for the JUNit Jupiter Engine. The documentation for this artifact says simply: “JUnit Jupiter test engine implementation, only required at runtime.”.

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

Simply adding that one dependency to the project shown in your Question will see your tests run.

[INFO] Running work.basil.example.AppTest

[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 s - in work.basil.example.AppTest


junit-jupiter-params

That same sample shows also a third JUnit dependency, for JUnit Jupiter Params. While not needed to make your example test run, it may serve other purposes. Apparently related to Parameterized Tests.

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.4.0-M1</version>
    <scope>test</scope>
</dependency>

That makes a total of 3 JUnit dependencies.

<!--JUnit 5-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.4.0-M1</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.4.0-M1</version>
    <scope>test</scope>
</dependency>

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

당신 같은 POM 파일은 이제 이들의 JUnit 종속성의 3으로 업데이트되었습니다.

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>work.basil.example</groupId>
    <artifactId>tester</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>tester</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>

        <!--JUnit 5-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.4.0-M1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.4.0-M1</version>
            <scope>test</scope>
        </dependency>

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

    </dependencies>

    <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>3.0.0-M3</version>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
                <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
                <plugin>
                    <artifactId>maven-site-plugin</artifactId>
                    <version>3.7.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-project-info-reports-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

junit-jupiter 인공물

JUnit을 5 버전 5.4.0은 새로운 메이븐 이슈, 제공 junit-jupiter이라는 제목 의 JUnit 목성 (어 그리 게이터를) . 단어 "애그리 게이터 (aggregator) *는 분명히 우리의 프로그래밍 편의를 위해, 5 개 유물 메이븐에서 일반적으로 사용되는 JUnit을 몇 번들을 의미합니다.

이 하나를 추가 dependency하여 POM에 당신에게 프로젝트에서 8 라이브러리를 가져옵니다.

<!--JUnit 5-->
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.4.0-M1</version>
</dependency>

<코드>의 JUnit - 목성 </ 코드>에 대한 단일 의존성이 프로젝트에 팔 라이브러리를 추가 프로젝트 구조 및 POM 파일 내용에 대한 인 IntelliJ 창의 스크린 샷, 당신은 JUnit을 5 테스트를 실행하는 데 필요한 모든.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    셀레늄의 모델 대화 상자에서 텍스트를 추출하는 방법은 무엇입니까?

  2. 2

    화살표와 테두리가있는 CSS 전용 툴팁

  3. 3

    Windows에서 Apache Kafka 오류-주 클래스 QuorumPeerMain을 찾거나로드 할 수 없습니다.

  4. 4

    Symfony 4 Validator-유효하지 않은 경우 자동 로그 아웃

  5. 5

    Zookeeper Cluster를 시작합니다. 오류 : 주 클래스 org.apache.zookeeper.server.quorum.QuorumPeerMain을 찾거나로드 할 수 없습니다.

  6. 6

    메모리 누수를 방지하기 위해 JDBC 드라이버가 강제로 등록 해제되었습니다

  7. 7

    PyCharm에서 프로젝트를 제거하는 방법은 무엇입니까?

  8. 8

    VSOMEIP-두 장치 (TCP / UDP) 간의 통신이 작동하지 않음

  9. 9

    Maven Groovy 및 Java + Lombok

  10. 10

    OpenCV로 여러 카메라 스트림을 캡처하는 방법은 무엇입니까?

  11. 11

    Gradle 프로젝트 종속성에서 META-INF를 어떻게 제외합니까?

  12. 12

    DbCommand.ExecuteNonQueryAsync ()> 0을 사용할 때 데이터베이스에서 쿼리가 실행되지 않습니다.

  13. 13

    wildfly에 배포하면 "15 초 후 잠금을 획득 할 수 없음"예외가 발생합니다.

  14. 14

    테스트의 JUnit 4에서 실행하지만 JUnit을 5하지 - 컴파일 깨끗하지만 0 테스트 실행

  15. 15

    Python을 사용하여 Windows 네트워크의 공유 폴더에 어떻게 액세스 할 수 있습니까?

  16. 16

    r의 24 시간 시계를 인식하도록 날짜 시간 열을 어떻게 분할합니까?

  17. 17

    오픈 JDK와 AdoptOpenJDK의 차이

  18. 18

    NVMe SSD의 GFortran 비 포맷 I / O 처리량

  19. 19

    div 사이의 여유 공간을 제거하는 방법

  20. 20

    스프링 부트 액추에이터 상태 엔드 포인트 + 동적 resilience4j 회로 차단기

  21. 21

    How do I make my own website able to be installed?

뜨겁다태그

보관