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 就是基于此实现的。但缺点也很…...
Nginx_4
Nginx负载均衡 负载均衡概述 早期的网站流量和业务功能都比较简单,单台服务器足以满足基本的需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也跟着越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,…...
linux Ubuntu KUbuntu 系统安装相关
系统安装 本来想快到中午的时候调试一下服务器上的http请求接收代码。我的电脑上装的是kali的U盘系统,然后我的U盘居然找不到了(然后之前安装的系统不知道是否是写入软件的原因,没办法解析DNS,我都用的转发的,这让我体验非常差。kali的系统工具很多&…...
个人信息保护认证
个人信息保护认证是证明个人信息处理者在认证范围内开展的个人信息收集、存储、使用、加工、传输、提供、公开、删除以及跨境等处理活动符合认证依据标准要求。适用范围 本规则依据《中华人民共和国认证认可条例》制定,规定了对个人信息处理者开展个人信息收集、存储…...
Negative Prompt in Stable Diffusion
必读链接:https://www.reddit.com/r/StableDiffusion/comments/z7salo/with_the_right_prompt_stable_diffusion_20_can_do/ A lot of people have noticed that Negative Prompt works wonders in 2.0, and works even better in 2.1. Negative hints are the op…...
MLX90316KGO-BDG-100-RE传感器 旋转位置 角度测量
介绍MLX90316是Tria⊗is旋转位置传感器,提供在设备表面旋转的小偶极磁铁(轴端磁铁)的绝对角位置。得益于其表面的集成磁集中器(IMC),单片设备以非接触式方式感知应用磁通量密度的水平分量。这种独特的传感原理应用于旋转位置传感器,可在机械(…...
Reflections反射包在springboot jar环境下扫描不到class排查过程
需求: 要实现指定pkg(如com.qiqitrue.test.pojo)扫描包下所有class类信息:使用代码如下 使用的版本:0.10.2(截至目前是最新版)发现只能在idea编译期间可以获取得到(也就是在开发阶段…...
黑马】后台项目171集
将近一个月没有练习了,找到之后果然打不开出了问题【问题】运行代码打开网页后,发现不能正常登录,一开始还以为是密码记错了,后来发现是数据库没有正常启动,phpstudy中的数据库一直是启动状态,关闭不了。【…...
Qt 5 架构和特点
Qt 5 模块构架: 模块:功能:Qt CoreQt 5 的核心类库,每个模块都建立在Core上Qt GUI图形用户界面开发的最基础的类库Qt Widgets提供c用户界面部件(是对Qt GUI的拓展)Qt SQL对数据库进行操作Qt Multimedia、…...
转换符说明使用方法(在printf函数中)
目录 一些常见的转换说明及打印结果: printf()的转换说明修饰符 printf()函数打印数据指令时要与代打印数据的类型相匹配才行。 如%d %c %ld......这些符号叫做转换说明。代表着数据转化成显示的形式。 一些常见的…...
针灸-基本任脉督脉
这里写自定义目录标题 丈量 同身丈下针深浅一般入穴的方法成人 幼儿 不同入穴方式现代常用针概念十二经 纳天干**天干**地支表里关系筋络任脉中脘穴:梅花灸巨阙穴廉泉穴督脉长强腰俞命门阳关悬枢脊中筋缩眼诊 癫痫至阳消渴...
大学生个人网站制作/长尾词优化外包
这一个月的业余时间主要是在忙这个重构的事情,将吉日嘎拉自带的文档管理、公司公告、留言板、通讯录、周任务、考勤,全部重新建表,重构代码和UI。 目前根据中小企业常用的日常办公需要,搞定了公告栏、任务中心(GTD&…...
网站设计构想/百度网站官网网址
自从毕业后,你多久没有进行过考试了?如果再给你一次重新考试的机会,你会怎么考?今天分享给大家的是python数据挖掘试题四十道,文末有答案,但希望你从接受挑战那一刻起,就像期末考试一样对待! 1.某超市研究销售纪录数…...
一个ip做几个网站/网站申请流程
背景 首先我是个菜鸡,工资也低的一笔。 刚毕业时候在一家国企上班干 app 开发,干了快两年的时候,跳槽到了一家伪大厂干安全。投了不少简历都没有回音,只有这加伪大厂要我就来了。当时说好了会接触一些底层的东西,然而…...
网站做cpa推广引流/链接制作软件
$ \lim \limits_{x \rightarrow \infty}x^{\frac{3}{2}}(\sqrt {2x}-2\sqrt{1x}\sqrt{x}) $ 已知$ a_{n1}(a_n1)1, a_00 $,证明数列的极限存在,并且求出极限值 f(x)三次连续可微,令$ u(x,y,z)f(xyz) $, 求 $ \phi(t)\dfrac{ \partial^3 u}{\partial x \p…...
跨境网站建设/搜索引擎付费推广
春节将至,这一年终于磕磕绊绊地过来了。借此机会,分享一首诗歌作品,与君共勉! 过去的一年,有收获、有失落、有悲伤、有喜悦,五味杂陈,正是人生的本来滋味。新的一年里,希望可以多发论…...
网站开发主流框架/百度官网推广
1、如果只增加集群的存储量,建议增加Hadoop datanode节点。 方法: 停掉集群包括hadoop和hbase,当然也可以不停掉,直接在hadoop namenode的配置文件Slave里添加新节点的host,别忘了在host文件里也要添加新添加的host名…...