SpringBoot 单元测试不执行:maven-surefire-plugin 版本问题
SpringBoot 单元测试不执行:maven-surefire-plugin 版本问题
问题现象
Spring Boot 项目,在编写单元测试时,使用了 JUnit 4.13.2 以上的版本。
为了让 Maven 能自动运行单元测试,需要引入 Maven Surefire 或 Maven Failsafe 插件。
项目中使用的 maven-surefire-plugin 版本号为 2.22.2,在通过 mvn clean package
打包编译时,没有执行单元测试。
在经过一系列的测试后,发现只有 2.21 及以下版本的 maven-surefire-plugin 可以正常运行单元测试。
解决方法
根据上面的分析,最直观的解决方法就是降低 maven-surefire-plugin 的版本号。
但作为一个程序开发人员,怎么能止步于此呢?
去看看 maven-surefire-plugin 插件的作用原理,它默认是按照如下逻辑去寻找 JUnit 并执行测试用例的:
if the JUnit version in the project >= 4.7 and the parallel attribute has ANY value
use junit47 provider
if JUnit >= 4.0 is present
use junit4 provider
else
use junit3.8.1
如果不使用默认方式去查找 JUnit 的包,我们可以通过手动置顶内置的依赖,比如:
1、如果是 JUnit4.7 及以上版本,可以明确声明:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit4</artifactId>
<version>2.22.2</version>
</dependency>
<configuration>
<skip>false</skip>
<includes>
<include>Sample.java</include>
</includes>
</configuration>
</dependencies> </plugin>
***同时必须引用 junit4.12以上版本***
<dependency>
<groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
2、JUnit 4.0 (含) 到 JUnit4 .7 (不含) 的版本,这样声明:
org.apache.maven.plugins maven-surefire-plugin 2.22.2 org.apache.maven.surefire surefire-junit4 2.22.2 ```3、JUnit 3.8 (含) 到 JUnit 4.0 (不含) 的版本,这样声明:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit3</artifactId>
<version>2.22.2</version>
</dependency>
</dependencies>
</plugin>
4、JUnit 3.8 以下的版本,啊哦,surefire 已经不支持这么低版本的 JUnit 了,赶紧升级下 JUnit 的版本吧。
参考资料:
学习Maven之Maven Surefire Plugin(JUnit篇)
_____________________________________________________________________________________________________________________________
***Maven2插件surefire配置心得
博客分类:https://www.iteye.com/blog/zk1878-1425260
1、不运行junit测试。<project>[...]<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><skip>true</skip></configuration></plugin></plugins></build>[...]</project>2、指定要运行的junit测试。默认时,只要是符合以下三种命名规则的junit测试都要运行:(1)命名以Test字符开头的类(2)命名以Test字符结尾的类(3)命名以TestCase字符结尾的类如果我们只要运行其中的一个或者一组测试代码,需要按照以下方式配置:<project>[...]<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><includes><include>Sample.java</include></includes></configuration></plugin></plugins></build>[...]</project>3、指定不运行的junit测试。<project>[...]<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><excludes><exclude>**/TestCircle.java</exclude><exclude>**/TestSquare.java</exclude></excludes></configuration></plugin></plugins></build>[...]</project>一、junit运行结果不影响package或者install。maven2打包前会运行junit,但是,有时我们希望即使出现了错误,也要打包。maven2的设计者已经考虑到这种情况了。pom.xml文件配置内容如下:<project>[...]<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><testFailureIgnore>true</testFailureIgnore></configuration></plugin></plugins></build>[...]</project>本文所有的说明均对surefire2.3版本。在pom.xml文件中配置Maven SureFire Plugin插件:<project>[...]<build><plugins><plugging><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration>……</configuration></plugin></plugins></build>[...]</project>可以在<configuration>……</configuration>中配置surefire插件的参数。本文以下内容均对configuration结点进行说明。一、 必须的参数:
basedir
project路径。在测试用例中,可以用System.getProperty(“basedir”)获取basedir值。testClassesDirectory
保存测试用例编译后的文件的路径。默认值:target/test-classestestSourceDirectory
保存测试用例源代码的路径。默认值:src/test/java二、 可选的参数
disableXmlReport
标识是否不生成xml格式的测试报告。默认值:falseexcludedGroups
要排除的测试组。任何在这里列出的测试组都不执行。forkMode
可设置值有:never, once or always。默认:once.groups
如果指定了,只有在组中的用例才会执行。jvm
指定可运行的java虚拟机(或者指定可运行的java)。默认:使用和maven相同的虚拟机。printSummary
执行出错时是否打印错误信息。默认:truereportFormat
选择要生成的测试报告的格式。可设置值有:brief ,plain。默认:brief.reportsDirectory
测试报告生成路径skipExec
设置为true时,测试用例被编译,但是不会执行。threadCount
执行时,指定可分配的线程数量。只和参数parallel配合使用有效。默认:5.trimStackTrace
是在测试报告中调整堆栈跟踪信息的行数,还是显示所有的跟踪信息。默认:trueuseFile
生成测试报告还是只输出到控制台。默认:true.
1、不运行junit测试。
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>
2、指定要运行的junit测试。
默认时,只要是符合以下三种命名规则的junit测试都要运行:
(1)命名以Test字符开头的类
(2)命名以Test字符结尾的类
(3)命名以TestCase字符结尾的类
如果我们只要运行其中的一个或者一组测试代码,需要按照以下方式配置:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>Sample.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>
3、指定不运行的junit测试。
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/TestCircle.java</exclude>
<exclude>**/TestSquare.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>