当前位置: 首页 > news >正文

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目录下生成两种格式的错误报告:

  1. 简单的文本格式
  2. 与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本身并不是一个单元测试框架&#xff0c;Java 世界中主流的单元测试框架为JUnit 和TestNG。 Maven 所做的只是在构建执行到特定生命周期阶段的时候&#xff0c;通过插件来执行JUnit或者TestNG的测试用例。 这一插件就是maven-surefire-plugin&#xff0c;可以称之为测试…...

如何借力Alluxio推动大数据产品性能提升与成本优化?

内容简介 随着数字化不断发展&#xff0c;各行各业数据呈现海量增长的趋势。存算分离将存储系统和计算框架拆分为独立的模块&#xff0c;Alluxio作为如今主流云数据编排软件之一&#xff0c;为计算型应用&#xff08;如 Apache Spark、Presto&#xff09;和存储系统&#xff0…...

linux shell脚本被包含是什么意思?.命令和source命令(在脚本中运行脚本,脚本中调用脚本)(脚本包含,父子脚本)

在 shell 编程中&#xff0c;当一个 shell 脚本被另一个 shell 脚本包含&#xff0c;即用 . 或 source 命令包含&#xff0c;则被包含的脚本在当前 shell 进程内执行&#xff0c;并且可以访问当前 shell 进程的环境变量和函数。 此时&#xff0c;$0 代表的是主脚本的名称&#…...

MySQL进阶篇之锁(lock)

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

TMDSEVM6657LS评估板恢复出厂默认状态

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

聊一聊,我对DDD的关键理解

作者&#xff1a;闵大为 阿里业务平台解决方案团队 当我们在学习DDD的过程中&#xff0c;感觉学而不得的时候&#xff0c;可能会问&#xff1a;我们还要学么&#xff1f;这的确引人深思。本文基于工作经验&#xff0c;尝试谈谈对DDD的一些理解。 一、序 《阿甘正传》中&#xf…...

算法笔记(一)—— 认识复杂度和简单排序算法

时间复杂度是在一个算法流程中&#xff0c;常数操作的数量级指标。&#xff08;最差情况下的算法表现&#xff09; 比较两个算法的优劣&#xff0c;在足够的空间下&#xff0c;看时间复杂度指标&#xff0c;若相同&#xff0c;需要在大数据运行下来判断两个算法的“常数项指标…...

MQ消息中间件常见题及解决办法

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

网关服务限流熔断降级分布式事务

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

JVM——7JVM调优实战及常量池详解

Arthas工具的使用 阿里巴巴开源的java诊断工具 下载插件 上传至linux环境 在linux跑起来的java项目&#xff0c;可以用Arthas进行查看 项目上线前的时候没问题&#xff0c;上线了就出问题 &#xff0c;用来查看线上代码 jad 项目名 &#xff1a;反编译线上正在运行的代码 用…...

子串分值【第十一届】【省赛】【A组】

问题描述 对于一个字符串 s&#xff0c;我们定义 s 的分值 f(s) 为 s 中恰好出现一次的字符个数。例如 f("aba")1&#xff0c;f("abc")3, f("aaa")0。 现在给定一个字符串 s[0..n−1]&#xff08;长度为 n&#xff09;&#xff0c;请你计算对于…...

SpringCloud 中 Config、Bus、Stream、Sleuth

文章目录&#x1f68f; 第十三章 分布式配置中心&#x1f6ac; 一、Config 概述&#x1f6ac; 二、Config 快速入门&#x1f6ad; config-server&#xff1a;&#x1f6f9; 1、使用gitee创建远程仓库&#xff0c;上传配置文件&#x1f6f9; 2、导入 config-server 依赖&#x1…...

Quantum 构建工具使用新的 TTP 投递 Agent Tesla

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

浏览器中的 JavaScript 执行机制

思维导图 本文为反复学习极客时间-《浏览器的工作原理与实践》-浏览器中的 JavaScript 执行机制章节中的一些思考与记录。 一些重要概念 变量提升 所谓的变量提升&#xff0c;是指在 JavaScript 代码执行过程中&#xff0c;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渗透测试在项目中起到的重要性

在当前数字化环境中&#xff0c;IT的一个里程碑式增长便是公司组织和企业数字化。为了扩大市场范围和方便业务&#xff0c;许多组织都在转向互联网。这导致了一股新的商业浪潮&#xff0c;它创造了网络空间中的商业环境。通过这种方式&#xff0c;公司和客户的官方或机密文件都…...

Early Stopping中基于测试集(而非验证集)上的表现选取模型的讨论

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

appium ios真机自动化环境搭建运行(送源码)

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

米尔基于ARM嵌入式核心板的电池管理系统(BMS)

BMS全称是Battery Management System&#xff0c;电池管理系统。它是配合监控储能电池状态的设备&#xff0c;主要就是为了智能化管理及维护各个电池单元&#xff0c;防止电池出现过充电和过放电&#xff0c;延长电池的使用寿命&#xff0c;监控电池的状态。 图片摘自网络 电池…...

Java后端项目IDEA配置代码规范检查,使用checkStyle实现

最近的Java后端项目想实现代码的规范检查&#xff0c;调研了一圈&#xff0c;终于找到了简单的方式实现&#xff1a;以下是常见的几种方案&#xff1a; 1、在客户端做 git hook&#xff0c;主要是用 pre-commit 这个钩子。前端项目中常见的 husky 就是基于此实现的。但缺点也很…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...