本文为霍格沃兹测试学院优秀学员学习笔记。
在测试工作场景中,经常会遇到下面的问题:
这个时候就需要 Maven 登场了,利用 Maven 的Maven-Surefire-Plugin
插件可以帮助我们完成上述的目标!它可以通过命令行的形式来管理我们要执行的用例。
对于我们测试来说,常接触的几个用例管理框架都支持(这里指 Java 技术栈)
本文将以 Junit5 为例进行研究学习,所以下面的依赖添加也以 Junit5 为准。
常用到的 Junit5 相关依赖:
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.5.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
Maven-Surefire-Plugin:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
指定编译 JDK 版本:
<properties>
<aspectj.version>1.8.10</aspectj.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
使用 mvn test
命令可以一次性执行所有的用例,执行完之后可以看到控制台中的结果:
执行完之后我们打开 target
,所有 maven
执行完的结果都会在 target
目录下的 surefire-reports
下:
其中:
Jenkins
解析,文件与测试类对应,里面的内容代表了测试用例的执行情况。使用 mvn -Dtest=${TestClass}
命令可以指定运行测试类,例如
我这里要运行 MavenDemo1Test
下的用例,就可以使用 mvn -Dtest=MavenDemo1Test test
:
import org.junit.jupiter.api.Test; ¨K31K
执行测试:
$ mvn -Dtest=MavenDemo1Test test
我们还可以以 逗号
分隔指定多个测试类执行,例如这里我想执行 MavenDemo1Test
和 MavenDemo2Test
:
mvn -Dtest=MavenDemo1Test,MavenDemo2Test test
我们可以使用通配符来匹配要执行的测试类,例如这里我利用通配符同时指定测试类 MavenDemo1Test
和 MavenDemo2Test
:
$ mvn -Dtest=MavenDemo*Test test
当然,上述的测试方式组合起来也是可以的,例如这里利用通配符执行 MavenDemo1Test
和 MavenDemo2Test
,再精确指定执行 MavenPackageDemoTest
:
$ mvn -Dtest=MavenDemo*Test,MavenPackageDemoTest test
除了可以指定执行测试类,还可以指定测试方法,测试类
和 测试方法
之间用 #
隔开即可例如这个我想要指定执行 MavenDemo1Test
中的 test2
方法:
$ mvn -Dtest=MavenDemo1Test#test2 test
方法依然可以使用通配符,例如这里要执行 MavenPackageDemoTest
中的方法 MavenPackageTest
,可以匹配以 Test 结尾:
$ mvn -Dtest=MavenPackageDemoTest#*Test test
mvn 也可以指定某个测试类下面的多个方法,使用+
号分隔方法,例如指定 MavenDemo1Test
下的方法 test1()
和 test2()
。
$ mvn -Dtest=MavenDemo1Test#test1+test2 test
mvn 还提供了失败重试,设置失败重试的次数,当用例执行时直到用例成功或者失败次数达到上限,命令如下:
mvn -Dsurefire.rerunFailingTestsCount=2 test
可是遗憾的是,此功能只支持 Junit4,官网给出的说明如下:
在 Junit5 中,我们其实是可以利用 @RunWith(JUnitPlatform.class)
运行测试套件的,具体内容可参考文章:单元测试框架怎么搭?新版的Junit5有哪些神奇之处? 。
然而当我们使用mvn来执行套件时,
套件:
import MavenTestPackage1.MavenPackageDemoTest;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.SuiteDisplayName;
import org.junit.runner.RunWith;
@RunWith(JUnitPlatform.class)
@SuiteDisplayName("测试套件")
@SelectClasses({
MavenPackageDemoTest.class,MavenDemo1Test.class
}
)
public class TestSuite {
}
mvn 命令:
mvn -Dtest=TestSuite test
据说是因为 surefire 插件的版本问题,当切换到 2.19 版本的时候,套件执行成功了,可是 mvn test 命令又失败了,这显然不是我们想要的结果,于是乎开始了 Google 之路。。。
最终找到了一个相对合理的解释!抱歉,又要失望了,Google 到别人的解释如下(已翻译完成~):
简单的说就是 surefire
插件暂时还不支持在 Junit5
下执行继承至 Junit4
的 @RunWith
,所以还是需要有心人出来解决这个问题才行了~~
除了使用命令行,我们还可以在 pom 中指定我们默认需要执行的类或者不需要执行的类。
例如这里我默认只想执行 MavenPackageDemoTest
,而另外两个 MavenDemo
开头的测试类我都不想执行,这个时候可以在 pom
中做如下配置,在 surefire
插件下添加 configuration
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<includes>
<include>MavenPackageDemoTest.java</include>
</includes>
<excludes>
<exclude>MavenDemo*.java</exclude>
</excludes>
</configuration>
</plugin>
从结果中可以看到仅仅执行了我们默认指定的 MavenPackageDemoTest
中的 case
,其余以 MavenDemo
开头的测试类均未被执行。
这里介绍了 maven-surefire-plugin
插件在测试执行中的一些常见用法,还有很多其他的用法,例如: