测试开发基础 mvn test | 利用 Maven Surefire Plugin 做测试用例基础执行管理

简介: 1. 执行自动化测试用例的时候,只想指定某个测试类,或者某个方法,又或者某一类用例等,怎么办? 2. 想要和 Jenkins 一起进行持续集成,可是用例又不可能在 IDE 里面执行,怎么办?这个时候就需要 Maven 登场了,利用 `Maven 的Maven-Surefire-Plugin`插件可以帮助我们完成上述的目标!它可以通过命令行的形式来管理我们要执行的用例。

本文为霍格沃兹测试学院优秀学员学习笔记。

一、需求

在测试工作场景中,经常会遇到下面的问题:

  1. 执行自动化测试用例的时候,只想指定某个测试类,或者某个方法,又或者某一类用例等,怎么办?
  2. 想要和 Jenkins 一起进行持续集成,可是用例又不可能在 IDE 里面执行,怎么办?

这个时候就需要 Maven 登场了,利用 Maven 的Maven-Surefire-Plugin插件可以帮助我们完成上述的目标!它可以通过命令行的形式来管理我们要执行的用例。

二、环境

2.1 环境要求

  • Maven 3.x +
  • JDK 1.7 +

2.2 支持框架

对于我们测试来说,常接触的几个用例管理框架都支持(这里指 Java 技术栈)

  • Using TestNG
  • Using JUnit 5 Platform
  • Using JUnit

2.3 相关依赖

本文将以 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>

三、指定测试类

现有如下结构的测试类,在此基础上进行演示:
image.png

3.1 mvn test

使用 mvn test 命令可以一次性执行所有的用例,执行完之后可以看到控制台中的结果:
image.png

执行完之后我们打开 target,所有 maven 执行完的结果都会在 target 目录下的 surefire-reports 下:
image.png

其中:

  • xml:可用于 Jenkins 解析,文件与测试类对应,里面的内容代表了测试用例的执行情况。
  • txt:测试结果的命令行输出。

3.2 mvn -Dtest=${TestClass} test

使用 mvn -Dtest=${TestClass} 命令可以指定运行测试类,例如

我这里要运行 MavenDemo1Test 下的用例,就可以使用 mvn -Dtest=MavenDemo1Test test

import org.junit.jupiter.api.Test; ¨K31K

执行测试:

$ mvn -Dtest=MavenDemo1Test test

测试结果:
image.png

3.3 mvn -Dtest= ${TestClass1} , ${TestClass2} test

我们还可以以 逗号 分隔指定多个测试类执行,例如这里我想执行 MavenDemo1TestMavenDemo2Test

mvn -Dtest=MavenDemo1Test,MavenDemo2Test test

测试结果:
image.png

3.4 mvn -Dtest=${TestCi*le} test

我们可以使用通配符来匹配要执行的测试类,例如这里我利用通配符同时指定测试类 MavenDemo1TestMavenDemo2Test

$ mvn -Dtest=MavenDemo*Test test

测试结果:
image.png

3.5 mvn -Dtest =$ {TestCi*le} , ${TestClass} test

当然,上述的测试方式组合起来也是可以的,例如这里利用通配符执行 MavenDemo1TestMavenDemo2Test,再精确指定执行 MavenPackageDemoTest:

$ mvn -Dtest=MavenDemo*Test,MavenPackageDemoTest test

测试结果:
image.png

四、指定测试方法

4.1 mvn -Dtest=TestCircle#mytest test

除了可以指定执行测试类,还可以指定测试方法,测试类测试方法 之间用 # 隔开即可例如这个我想要指定执行 MavenDemo1Test 中的 test2 方法:

$ mvn -Dtest=MavenDemo1Test#test2 test

测试结果:
image.png

4.2 mvn -Dtest=TestCircle#test* test

方法依然可以使用通配符,例如这里要执行 MavenPackageDemoTest 中的方法 MavenPackageTest,可以匹配以 Test 结尾:

$ mvn -Dtest=MavenPackageDemoTest#*Test test

测试结果:
image.png

4.3 mvn -Dtest=TestCircle#testOne+testTwo test

mvn 也可以指定某个测试类下面的多个方法,使用+号分隔方法,例如指定 MavenDemo1Test 下的方法 test1()test2()

$ mvn -Dtest=MavenDemo1Test#test1+test2 test

image.png

五、失败重试

mvn 还提供了失败重试,设置失败重试的次数,当用例执行时直到用例成功或者失败次数达到上限,命令如下:

mvn -Dsurefire.rerunFailingTestsCount=2 test

可是遗憾的是,此功能只支持 Junit4,官网给出的说明如下:
image.png

六、套件运行

在 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

会出现如下报错:
image.png

据说是因为 surefire 插件的版本问题,当切换到 2.19 版本的时候,套件执行成功了,可是 mvn test 命令又失败了,这显然不是我们想要的结果,于是乎开始了 Google 之路。。。

最终找到了一个相对合理的解释!抱歉,又要失望了,Google 到别人的解释如下(已翻译完成~):
image.png

简单的说就是 surefire 插件暂时还不支持在 Junit5 下执行继承至 Junit4@RunWith,所以还是需要有心人出来解决这个问题才行了~~

六、Pom 中指定默认执行

除了使用命令行,我们还可以在 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>

执行 mvn test ,查看结果:
image.png

从结果中可以看到仅仅执行了我们默认指定的 MavenPackageDemoTest 中的 case,其余以 MavenDemo 开头的测试类均未被执行。

七、写在最后

这里介绍了 maven-surefire-plugin 插件在测试执行中的一些常见用法,还有很多其他的用法,例如:

  • 使用很复杂的格式匹配
  • 控制在不同级别上的多线程和多进程执行
    后续将慢慢研究补充,有兴趣也可直接参考官网学习。

更多技术文章分享及测试资料

相关文章
|
10天前
|
Java 测试技术 Maven
maven 打jar包:mvn clean package
maven 打jar包:mvn clean package
37 7
|
10天前
|
安全 数据可视化 前端开发
【测试开发】用例篇 · 熟悉黑盒测试用例设计方法(2)· 正交表 · 场景设计 · 常见案例练习
【测试开发】用例篇 · 熟悉黑盒测试用例设计方法(2)· 正交表 · 场景设计 · 常见案例练习
31 0
|
9天前
|
Java Maven
SpringBoot项目的用maven插件打包报Test错误
SpringBoot项目的用maven插件打包报Test错误
|
10天前
|
测试技术 数据库连接 数据库
【测试开发】基础篇 · 专业术语 · 软件测试生命周期 · bug的描述 · bug的级别 · bug的生命周期 · 处理争执
【测试开发】基础篇 · 专业术语 · 软件测试生命周期 · bug的描述 · bug的级别 · bug的生命周期 · 处理争执
15 0
|
10天前
|
敏捷开发 前端开发 安全
【测试开发】概念篇 · 测试相关基础概念 · 常见开发模型 · 常见测试模型
【测试开发】概念篇 · 测试相关基础概念 · 常见开发模型 · 常见测试模型
20 0
【测试开发】概念篇 · 测试相关基础概念 · 常见开发模型 · 常见测试模型
|
10天前
|
机器学习/深度学习 数据采集 人工智能
【专栏】AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计
【4月更文挑战第27天】本文探讨了AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计。AI辅助工具利用机器学习、自然语言处理和图像识别提高效率,但面临数据质量、模型解释性、维护更新及安全性挑战。未来,AI将更注重用户体验,提升透明度,并在保护隐私的同时,通过联邦学习等技术共享知识。AI在软件测试领域的前景广阔,但需解决现有挑战。
|
10天前
|
测试技术
【测试】构建质量保证之路:编写测试用例的艺术
【测试】构建质量保证之路:编写测试用例的艺术
|
9天前
|
测试技术
如何管理测试用例?测试用例有什么管理工具?YesDev
该文档介绍了测试用例和测试用例库的管理。测试用例是描述软件测试方案的详细步骤,包括测试目标、环境、输入、步骤和预期结果。测试用例库用于组织和管理这些用例,强调简洁性、完整性和可维护性。管理者可以创建、删除、重命名用例库,搜索和管理用例,以及通过层级目录结构来组织用例。此外,还支持通过Excel导入和导出测试用例,以及使用脑图查看用例关系。后台管理允许配置全局别名,如用例状态、优先级和执行结果。
|
10天前
|
人工智能 测试技术 数据处理
【测试开发】用例篇 · 熟悉黑盒测试用例设计方法(1)等价类划分法、边界值法、判定表法
【测试开发】用例篇 · 熟悉黑盒测试用例设计方法(1)等价类划分法、边界值法、判定表法
10 0
|
10天前
|
架构师 安全 Java
【测试开发】答疑篇 · 什么是软件测试
【测试开发】答疑篇 · 什么是软件测试
9 0

推荐镜像

更多