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

news/2024/11/24 13:31:34/

一、需求

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

  • 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>

三、指定测试类

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

3.1 mvn test

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

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

其中:

  • 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

测试结果:

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

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

mvn -Dtest=MavenDemo1Test,MavenDemo2Test test

测试结果:

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

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

$ mvn -Dtest=MavenDemo*Test test

测试结果:

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

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

$ mvn -Dtest=MavenDemo*Test,MavenPackageDemoTest test

测试结果:

四、指定测试方法

4.1 mvn -Dtest=TestCircle#mytest test

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

$ mvn -Dtest=MavenDemo1Test#test2 test

测试结果:

4.2 mvn -Dtest=TestCircle#test* test

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

$ mvn -Dtest=MavenPackageDemoTest#*Test test

测试结果:

4.3 mvn -Dtest=TestCircle#testOne+testTwo 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 中指定默认执行

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

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

七、写在最后

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

  • 使用很复杂的格式匹配

  • 控制在不同级别上的多线程和多进程执行

后续将慢慢研究补充,有兴趣也可直接参考官网学习。


http://www.ppmy.cn/news/11359.html

相关文章

java 数组看这一篇文章就够了

第一章 数组概述 数组介绍1 2 3 41. 数组是多个相同类型数据的组合 2. 数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型 3. 数组属引用类型,数组中的每个元素相当于该对象的成员变量 4. 数组中的数据是有序的,可以通过序号(索引或者下标)获取,索引从0开始数组…

米筐量化终端是什么?

米筐量化终端大家应该也能想象到是应用的终端&#xff0c;是系统执行的终端环节&#xff0c;如果是用在量化方面&#xff0c;那它就是策略定制的终端&#xff0c;是方便投资者输入量化策略执行出来发最终优质目的&#xff0c;精确到细分股票的账户成交量&#xff0c;股价以及融…

刚当上leader,我让组员去开会,他非说有更重要的会

☆ 职场上经常有那么一种情况就是组长喊组员开会&#xff0c;开周会&#xff0c;开晨会&#xff0c;开各种会&#xff0c;而更有一种常见的情况呢就是组长缺失威严&#xff0c;喊组员开会&#xff0c;组员不听话&#xff0c;说有更重要的会议&#xff0c;不想参加。 ☆ 本文将以…

Kettle的安装以及简单使用

Kettle是一款开源免费的ETL工具&#xff0c;ETL全称 Extract - Transform - Load 意味着数据抽取&#xff0c;转换&#xff0c;装载的过程。 ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程&#xff0c;目的是将企业中的分散、零乱、标准不统一的数据整合到…

多线程案例

1.阻塞队列1.1阻塞队列的工作原理阻塞队列本质上还是一个队列&#xff0c;但是在队列的基础上加入了阻塞功能&#xff0c;并且线程安全。那么它的阻塞功能体现在两方面1.当队列为空时&#xff0c;进行出队列操作&#xff0c;就进入阻塞状态2.当队列满了时&#xff0c;进行入队列…

Flink多流转换(Flink Stream Unoin、Flink Stream Connect、Flink Stream Window Join)

文章目录多流转换1、分流操作1.1、在flink 1.13版本中已弃用.split()进行分流1.2、使用&#xff08;process function&#xff09;的侧输出流&#xff08;side output&#xff09;进行分流2、基本合流操作2.1、联合&#xff08;Flink Stream Union&#xff09;2.2、连接&#x…

1.5万字总结 Redis 常见面试题知识点

以下内容来源于于我开源的 JavaGuide (Java学习&&面试指南,Github 130k star,370人共同参与爱完善), 万字总结,质量有保障! Redis 基础 什么是 Redis? Redis 是一个基于 C 语言开发的开源数据库(BSD 许可),与传统数据库不同的是 Redis 的数据是存在内存中的…

【Javascript】高阶函数,JSON,forEach,map,filter,reduce函数

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录高阶函数箭头函数apply函数JSONfilter函数map函数总结reduce函数find/findIndex函数every/some函…