Maven知识点-插件-maven-surefire-plugin简介
Maven本身并不是一个单元测试框架,Java 世界中主流的单元测试框架为JUnit 和TestNG。
Maven 所做的只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUnit或者TestNG的测试用例。
这一插件就是maven-surefire-plugin,可以称之为测试运行器(Test Runner),它能很好地兼容JUnit 3JUnit4以及TestNG。
如果你懂的Maven的生命周期(不熟悉可以先看一下这里->Maven生命周期),那你应该知道生命周期阶段test被定义为“使用单元测试框架运行测试”。我们知道Maven生命周期阶段需要绑定到某个具体插件的目标才能完成真正的工作,test阶段就是和maven-surefire-plugin的test目标绑定了,这是Maven的内置绑定,具体自行百度查看。
在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认src/test/java)下所有符合一组命名模式的测试类,这组模式如下:
- */Test.java:任何子目录下所有命名以Test开头的Java类。
- **/*.Test.java:任何子目录下所有命名以Test结尾的Java类。
- **/*TestCase.java:任何子目录下所有命名以TestCase结尾的Java类。
只要将测试类按上述模式命名,Maven 就能自动运行它们,用户也就不再需要定义测试集合 (TestSuite)来聚合测试用例 (TestCase)。关于模式需要注意的是,以 Tests 结尾的测试类是不会得以自动执行的。
当然,为了能够运行测试,Maven 需要在项目中引人Junit测试框架的依赖,这里不再赘述。
1.跳过测试
日常工作中,软件开发人员总有很多理由来跳过单元测试,“我敢保证这次改动不会导致任何测试失败”,“测试运行太耗时了,暂时跳过一下”,“有持续集成服务跑所有测试呢,我本地就不执行啦”。
在大部分情况下,这些想法都是不对的,任何改动都要交给测试去验证,测试运行耗时过长应该考虑优化测试,更不要完全依赖持续集成服务来报告错误测试错误应该尽早在尽小范围内发现,并及时修复。
不管怎样我们总会要求Maven 跳过测试,这很简单在命令行加人参数skipTests就可以了。例如:
mvn clean install -DskipTests
Mave会告诉你它跳过了测试:
当然,也可以在POM中配置maven-surefire-plugin 插件来提供该属性。但这是不推荐的做法,如果配置 POM 让项目长时间地跳过测试,则还要测试代码做什么呢?
<build><pluginManagement><plugins><plugin><artifactId>maven-surefire-plugin</artifactId><configuration><!-- 跳过测试 --><skip>true</skip></configuration></plugin></plugins></pluginManagement></build>
有的时候,用户不只是仅仅跳过测试运行,还想临时地跳过测试代码的编译,Maven也允许你这么做,但这也是不推荐的!
mvn clean install -Dmaven.test.skip=true
参数”-Dmaven.test.skip=true“控制了maven-compiler-plugin和maven-surefire-plugin两个插件的行为,测试代码的编译跳过了,测试运行也跳过了。
对于maven命令行参数maven.test.skip=true的POM配置如下:
<build><pluginManagement><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><!-- -Dmaven.test.skip=true 提过测试代码的编译和运行 --><skip>true</skip></configuration></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><configuration><!-- -DskipTests 跳过测试代码的运行 --><skip>true</skip></configuration></plugin></plugins></pluginManagement></build>
两个插件的test目标都是制定了一个skip参数控制测试代码的编译或运行的跳过。
2.动态指定要运行的测试用例
反复运行单个测试用例是日常开发中很常见的行为。例如,项目代码中有一个失败的测试用例,开发人员就会想要再次运行这个测试以获得详细的错误报告,在修复该测试的过程中,开发人员也会反复运行它,以确认修复代码是正确的。如果仅仅为了一个失败的测试用例而反复运行所有测试,未免太浪费时间了,当项目中测试的数目比较大的时候这种浪费尤为明显。
maven-surefire-plugin提供了一个test参数让Maven 用户能够在命令行指定要运行的测试用例。例如,如果只想运行 StringTest测试类(我自己Demo项目中的),就可以使用如下命令:
mvn test -Dtest=StringTest
这里test参数的值是测试用例的类名,这行命令的效果就是只有 StringTest这一个测试类得到运行。
maven-surefire-plugin的test参数还支持高级一些的赋值方式,能让用户更灵活地指定需要运行的测试用例。例如:
mvn test -Dtest=String*Test
星号可以匹配零个或多个字符,上述命令会运行项目中所有类名以String开头、Test结尾的测试类。
除了星号匹配,还可以使用逗号指定多个测试用例:
mvn test -Dtest=StringTest,DoubleTest
该命令的 test参数值是两个测试类名,它们之间用号隔开,其效果就是告诉Maven只运行这两个测试类。
当然,也可以结合使用星号和逗号。例如:
mvn test -Dtest=String*Test,DoubleTest
需要注意的是,上述几种从命令行动态指定测试类的方法都应该只是临时使用,如果长时间只运行项目的某几个测试,那么测试就会慢慢失去其本来的意义。
test参数的值必须匹配一个或者多个测试类,如果maven-surefire-plugin 找不到任何匹配的测试类,就会报错并导致构建失败。例如下面的命令没有匹配任何测试类:
mvn test -Dtest
根据截图红框后面括号中的提示,可以加上参数 -DfailIfNoTests=false,告诉maven-surefire-plugin即使没有任何测试也不要报错
mvn test -Dtest -DfailIfNoTests=false
注意:-DfailIfNoTests=false 是 fail If No Tests,避免l(小写L)和I(大写i)的区别。
这样构建就能成功了。
3.包含与排除测试用例
文章开头说过,maven-surefire-plugin的test目标会自动执行测试源码路径下所有符合一组命名模式的测试类,其实除了Maven约定好的测试类命名规则外,插件还允许用户通过额外的配置来自定义包含一些其他的测试类,或者排除一些符合命名规则的测试类。
例如有的开发人员创建的测试类总是以Tests结尾,默认这是不符合maven-surefire-plugin的测试类命名规则的,因此不会自动执行,但是我们可以自定义让Tests也被Maven自动运行。
<plugins><plugin><artifactId>maven-surefire-plugin</artifactId><configuration><includes><!-- 不符合默认命名规则的测试类也被自动运行 --><include>**/*.Tests.java</include></includes></configuration></plugin></plugins>
**匹配任意路径,*匹配0个或多个字符。
类似的,可以使用<excludes>来配出一些符合默认命名模式的测试类,如下:
<plugins><plugin><artifactId>maven-surefire-plugin</artifactId><configuration><includes><!-- 不符合默认命名规则的测试类也被自动运行 --><include>**/*.Tests.java</include></includes><excludes><!-- 排除以Test开头的测试类, 排除StringTest类 --><exclude>**/Test*.java</exclude><exclude>**/StringTest.java</exclude></excludes></configuration></plugin></plugins>
<excludes>中配置的测试类,maven-surefire-plugin将不再自动运行他们。
4.测试报告
除了命令行的输出,我们还可以使用maven-surefire-plugin等插件以文件的形式生成丰富的测试报告。
默认情况下,maven-surefire-plugin会在target/surefire-reports目录下生成两种格式的错误报告:
- 简单的文本格式
- 与Junit兼容的XML格式
例如我自己的Demo项目中有一个StringTest测试类,运行了自己的Demo项目后,(取消跳过测试代码的编译和运行)
前者文件内容十分简单
这样的报告其实对于测试信息就足够了,而第二个文件xml的测试报告主要是为了支持工具的解析,例如Eclipse的JUnit插件可以直接打开xml的报告,由于这种xml的格式成为了java单元测试报告的标准,所以一些其他的测试工具也能使用xml文件。
这里我们只是运行了StringTest中的一个简单的测试,如果实际中失败了,测试报告文件中会说明哪个测试文件,哪个测试方法和哪个断言以及具体的堆栈信息。
5.测试覆盖率报告
测试覆盖率是衡量项目代码质量的一个重要的参考指标。Cobertura是一个优秀的开源测试覆盖率统计工具,Maven 通过 cobertura-maven-plugin插件与之集成,用户可以使用简单的命令为 Maven 项目生成测试覆盖率报告。例如,可以运行如下命令生成报告:
mvn cobertura:cobertura
接着打开项目目录target/site/cobertura下的index.html,就能看到测试覆盖率报告了,这里就不多赘述了。
6.重用测试代码
优秀的程序员会像对待产品代码一样细心维护测试代码,尤其是那些供具体测试类继承的抽象类,它们能够简化测试代码的编写。还有一些根据具体项目环境对测试框架的扩展,也会被大范围地重用。
在命令行运行mvn package的时候,Maven 会将项目的主代码及资源文件打包,将其安装或部署到仓库之后,这些代码就能为他人使用,从而实现 Maven 项目级别的重用。
默认的打包行为是不会包含测试代码的,因此在使用外部依赖的时候,其构件一般都不会包含测试代码。
然后,在项目内部重用某个模块的测试代码是很常见的需求,可能某个底层模块的测试代码中包含了一些常用的测试工具类,或者一些高质量的测试基类供继承。这个时候Maven用户就需要通过配置maven-jar-plugin将测试类打包,如下:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><executions><execution><goals><goal>test-jar</goal></goals></execution></executions>
</plugin>
maven-jar-plugin插件有两个目标,分别是jar和test-jar,jar通过Maven的内置绑定在default生命周期的package阶段,其行为就是对项目主代码进行打包,而test-jar并没有内置绑定,因此我们上面的配置就是显式的声明该目标来打包测试代码。
通过 mvn help:describe -Dplugin=jar -Ddetail可以知道,jar和test-jar的默认绑定周期阶段就是package阶段,所以我们这里的配置默认就是绑定到了package阶段,所以运行mvn clean package可以发现:
maven-jar-plugin插件的两个目标jar和test-jar都执行了,分别打包了项目的主代码和测试代码。
然后其他的Maven项目就可以引用测试代码的构建依赖了,例如
这里声明的依赖,有一个特殊的元素<type>,所有的测试包构件都是用特殊的test-jar打包类型。而且这一类型都是用test的scope。
相关文章:

Maven知识点-插件-maven-surefire-plugin简介
Maven本身并不是一个单元测试框架,Java 世界中主流的单元测试框架为JUnit 和TestNG。 Maven 所做的只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUnit或者TestNG的测试用例。 这一插件就是maven-surefire-plugin,可以称之为测试…...

如何借力Alluxio推动大数据产品性能提升与成本优化?
内容简介 随着数字化不断发展,各行各业数据呈现海量增长的趋势。存算分离将存储系统和计算框架拆分为独立的模块,Alluxio作为如今主流云数据编排软件之一,为计算型应用(如 Apache Spark、Presto)和存储系统࿰…...
linux shell脚本被包含是什么意思?.命令和source命令(在脚本中运行脚本,脚本中调用脚本)(脚本包含,父子脚本)
在 shell 编程中,当一个 shell 脚本被另一个 shell 脚本包含,即用 . 或 source 命令包含,则被包含的脚本在当前 shell 进程内执行,并且可以访问当前 shell 进程的环境变量和函数。 此时,$0 代表的是主脚本的名称&#…...

MySQL进阶篇之锁(lock)
05、锁 5.1、概述 1、介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据…...

TMDSEVM6657LS评估板恢复出厂默认状态
TMDSEVM6657LS评估板恢复出厂默认状态 前言 TMDSEVM6657LS评估板特别适用于DSP开发的初学者,但有时候拿到手的开发板几经流转,被别人修改过,也可能自己烧录过程出错,导致开发板的状态未知等原因,需要恢复到出厂默认状…...

聊一聊,我对DDD的关键理解
作者:闵大为 阿里业务平台解决方案团队 当我们在学习DDD的过程中,感觉学而不得的时候,可能会问:我们还要学么?这的确引人深思。本文基于工作经验,尝试谈谈对DDD的一些理解。 一、序 《阿甘正传》中…...
算法笔记(一)—— 认识复杂度和简单排序算法
时间复杂度是在一个算法流程中,常数操作的数量级指标。(最差情况下的算法表现) 比较两个算法的优劣,在足够的空间下,看时间复杂度指标,若相同,需要在大数据运行下来判断两个算法的“常数项指标…...

MQ消息中间件常见题及解决办法
目录儿常见MQRocketMQ2、RocketMQ测试可用MQ常见问题1、幂等性问题2、如何保证消息不丢失3、消息积压问题4、事务消息设计分析常见MQ RocketMQ RocketMQ又四部分组成 NameServer 同步Broker服务信息,给消费者和生产者提供可用Broker的服务信息。Broker 消息存储业…...

网关服务限流熔断降级分布式事务
目录一、网关服务限流熔断降级二、Seata--分布式事务1、分布式事务基础①事务②本地事物③分布式事务④分布式事务的场景2、分布式事务解决方案①全局事务②最大努力通知③TCC事务3、Seata介绍4、Seata实现分布式事务控制①案例基本代码(异常模拟)②启动…...

JVM——7JVM调优实战及常量池详解
Arthas工具的使用 阿里巴巴开源的java诊断工具 下载插件 上传至linux环境 在linux跑起来的java项目,可以用Arthas进行查看 项目上线前的时候没问题,上线了就出问题 ,用来查看线上代码 jad 项目名 :反编译线上正在运行的代码 用…...
子串分值【第十一届】【省赛】【A组】
问题描述 对于一个字符串 s,我们定义 s 的分值 f(s) 为 s 中恰好出现一次的字符个数。例如 f("aba")1,f("abc")3, f("aaa")0。 现在给定一个字符串 s[0..n−1](长度为 n),请你计算对于…...

SpringCloud 中 Config、Bus、Stream、Sleuth
文章目录🚏 第十三章 分布式配置中心🚬 一、Config 概述🚬 二、Config 快速入门🚭 config-server:🛹 1、使用gitee创建远程仓库,上传配置文件🛹 2、导入 config-server 依赖…...

Quantum 构建工具使用新的 TTP 投递 Agent Tesla
Zscaler 的研究人员发现暗网上正在出售名为 Quantum Builder 的构建工具,该工具可以投递 .NET 远控木马 Agent Tesla。与过去的攻击行动相比,本次攻击转向使用 LNK 文件。 Quantum Builder 能够创建恶意文件,如 LNK、HTA 与 PowerShell&…...

浏览器中的 JavaScript 执行机制
思维导图 本文为反复学习极客时间-《浏览器的工作原理与实践》-浏览器中的 JavaScript 执行机制章节中的一些思考与记录。 一些重要概念 变量提升 所谓的变量提升,是指在 JavaScript 代码执行过程中,JavaScript 引擎把变量的声明部分和函数的声明部分…...

kafka集群搭建及问题
一、zookeeper集群搭建 1、创建文件夹 cd /home mkdir zookeeper 2、下载 cd zookeeper wget https://downloads.apache.org/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz 解压到当前文件夹 tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz 文件夹重命…...

不要忽视web渗透测试在项目中起到的重要性
在当前数字化环境中,IT的一个里程碑式增长便是公司组织和企业数字化。为了扩大市场范围和方便业务,许多组织都在转向互联网。这导致了一股新的商业浪潮,它创造了网络空间中的商业环境。通过这种方式,公司和客户的官方或机密文件都…...

Early Stopping中基于测试集(而非验证集)上的表现选取模型的讨论
论文中一般都是用在验证集上效果最好的模型去预测测试集,多次预测的结果取平均计算准确率或者mAP值,而不是单纯的取一次验证集最好的结果作为论文的结果。如果你在写论文的过程中,把测试集当做验证集去验证的话,这其实是作假的&am…...

appium ios真机自动化环境搭建运行(送源码)
appium ios真机自动化环境搭建&运行(送源码) 目录:导读 (1)安装JDK,并配置环境变量,方法如下: (2)安装Xcode、Xcode commandline tools和iOS模拟器 &…...

米尔基于ARM嵌入式核心板的电池管理系统(BMS)
BMS全称是Battery Management System,电池管理系统。它是配合监控储能电池状态的设备,主要就是为了智能化管理及维护各个电池单元,防止电池出现过充电和过放电,延长电池的使用寿命,监控电池的状态。 图片摘自网络 电池…...

Java后端项目IDEA配置代码规范检查,使用checkStyle实现
最近的Java后端项目想实现代码的规范检查,调研了一圈,终于找到了简单的方式实现:以下是常见的几种方案: 1、在客户端做 git hook,主要是用 pre-commit 这个钩子。前端项目中常见的 husky 就是基于此实现的。但缺点也很…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...