任何人都可以在几分钟内轻松重现此问题。
quickstart
项目在IntelliJ 2018.3和Maven 3.6.0中,我使用Maven原型maven-archetype-quickstart
1.4版创建了一个全新项目。
在新项目的POM文件中,将maven.compiler.source
和maven.compiler.target
的属性从1.7更改为11,对于我当前正在使用的Java 11.0.2,将Zulu的属性从{ {3}}。
<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的Maven面板上,我运行clean
和install
生命周期事件。
作为install
的一部分,运行测试。这种quickstart
原型带有一个断言true
的测试。
结果显示在IntelliJ的Run
面板中。
[INFO]运行work.basil.example.AppTest
[INFO]运行测试:1,失败:0,错误:0,跳过:0,经过的时间:0.026 s-在work.basil.example.AppTest中
所以我知道测试已执行。
这一切都很好。现在,让我们升级到JUnit 5,以查看问题。
在POM中,我从中更改JUnit依赖项:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
…对此:
<dependencies>
<!--JUnit 5-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
</dependencies>
编译器抱怨我的AppTest.java
文件。因此,我在那里更改了import
语句以使用jupiter
包。我只想在新的greedfield项目中运行JUnit 5测试,而无需进行老式的JUnit 4测试。因此,进口从此变化:
import static org.junit.Assert.assertTrue;
import org.junit.Test;
…对此:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
然后我执行Maven
> Lifecycle
> clean
和install
。
…还有问题,问题:我们的测试未执行。在IntelliJ的Run
面板中看到的报告:
[INFO]运行work.basil.example.AppTest
[INFO]测试运行:0,失败:0,错误:0,跳过:0,经过时间:0.003 s-在work.basil.example.AppTest中
➥为什么JUnit 5不能运行JUnit 4愉快地运行的相同测试?
surefire
插件<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
…对此:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
</plugin>
另一个clean
和install
。但没有更好的选择,仍然运行0个测试。
[INFO]运行work.basil.example.AppTest
[INFO]测试运行:0,失败:0,错误:0,跳过:0,经过时间:0.004 s-在work.basil.example.AppTest中
这是我的整个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/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>
执行Maven clean
和install
之后,出现两个JUnit库:junit-jupiter-api
和junit-platform-commons
。
我以junit-jupiter-api
依赖项尝试了以下版本:
每次尝试时,我都运行了一个Maven clean
和install
。没有更好的。每个版本都报告了Tests run: 0
。
maven-archetype-quickstart
我实际上是在一个完全不同的项目中使用完全不同的Maven原型发现了这个问题。
要弄清这个有问题的JUnit 5行为,我使用非常简单的maven-archetype-quickstart
尝试了一个新的新项目。我发现了相同的行为:一切都能编译,测试工具正在运行,但是在JUnit 5下没有执行任何测试。
答案 0 :(得分:5)
对于JUnit 5 5.4.0-M1或更高版本,请在POM中指定新的单个Maven工件junit-jupiter
“ Aggregator”。
<!--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-jupiter-api
和junit-jupiter-engine
。
据我所知,JUnit 5已被重新架构为多种测试框架的轭。这些测试系统包括JUnit 4“老式”测试,新的JUnit 5测试(测试的新语法,带有新的注释和方法)以及诸如Specsy,Spek,Cucumber之类的其他测试系统。 ,Drools Scenario,jqwik和more that implement TestEngine
界面。
显然,junit-jupiter-api
工件只是外轭。您还必须指定一个或多个TestEngine
实现以实际运行测试。例如,要运行老式的JUnit 4测试,您需要VintageTestEngine
实现,或者要运行JUNit 5测试,您需要JupiterTestEngine
实现。
因此,要运行JUnit 5测试,必须在Maven POM中使用JupiterTestEngine
工件指定一个junit-jupiter-engine
实现。
请参阅JUnit 5手册,特别是Configuring Test Engines部分。
请参见Marc Philipp的this presentation,该图显示了JUnit 5是一个平台,该平台具有(A)IDE /构建工具的核心,以及(B)可插拔的测试编写框架,供程序员编写测试。
junit-jupiter-engine
如this sample所示,为JUNit Jupiter Engine添加第二个与JUnit相关的依赖关系。 documentation for this artifact简单地说:“ JUnit Jupiter测试引擎实现,仅在运行时需要。”。
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0-M1</version>
<scope>test</scope>
</dependency>
只需在问题中显示的项目中添加一个依赖项,即可运行测试。
[INFO]运行work.basil.example.AppTest
[INFO]运行测试:1,失败:0,错误:0,跳过:0,经过的时间:0.004 s-在work.basil.example.AppTest中
junit-jupiter-params
同一示例还显示了JUnit Jupiter Params的第三个JUnit依赖关系。虽然不需要进行示例测试运行,但它可以用于其他目的。显然与Parameterized Tests有关。
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.4.0-M1</version>
<scope>test</scope>
</dependency>
总共有3个JUnit依赖项。
<!--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依赖项。
<?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版本带来了一个新的Maven工件,junit-jupiter
名为 JUnit Jupiter(聚合器)。为了便于编程,“ aggregator *”一词显然是指将Maven中的一些常用JUnit 5构件捆绑在一起。
在您的POM中添加一个dependency
即可在您的项目中获得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>