专栏首页Aloys的开发之路20分钟理清Maven构建中的测试相关工具的关系

20分钟理清Maven构建中的测试相关工具的关系

如果你用Maven进行系统构建,同时还要同步编写测试用例,获取用例成功与否以及用例覆盖率的相关报告,那么这些工具你肯定接触过不少:

  • JUnit
  • TestNG
  • maven-surefire-plugin
  • maven-surefire-report-plugin
  • emma-maven-plugin
  • jacoco-maven-plugin
  • cobertura-maven-plugin
  • maven-project-info-reports-plugin
  • maven-site-plugin

是不是已经有些头晕了?没关系,我之前担任过很长时间的CI构建系统维护者,同时还是这里面几个Maven插件的Maintainer,我将尽最大努力帮你在最短的时间里理清他们的关系,帮助大家在实际项目中充分发挥这些工具的作用,提升产品质量。首先我们先大体分几个类别,让大家有个大概的印象。

  • JUnit/TestNG是单元测试工具,可以帮你更方便的编写测试用例。
  • maven-surefire-plugin是一个Maven插件,帮你在通过Maven构建项目的时候自动执行之前编写的测试用例。它的输出文件是txt或者xml格式的测试报告。
  • maven-surefire-report-plugin是一个Maven插件,帮你将maven-surefire-plugin生成的测试报告转换为html格式,方便查看。
  • emma-maven-plugin/jacoco-maven-plugin/cobertura-maven-plugin这些是帮助生成测试覆盖率报告的Maven插件,他们的输出文件也是html格式。
  • maven-project-info-reports-plugin是一个Maven插件,他可以把maven-surefire-report-plugin/emma-maven-plugin/jacoco-maven-plugin/cobertura-maven-plugin这些插件生成的html格式文件进行汇总,帮助大家以更好的方式呈现。
  • maven-site-plugin是一个Maven插件,帮你自动生成、部署、启动你的站点,站点里面可以有很多东西,其中最重要的部分就是你使用maven-project-info-reports-plugin生成的项目报告。

接下来我们根据之前的分类详细了解下他们:

JUnit/TestNG

JUnit是老牌单元测试工具了,从3.X,4.X到最新的5.X版本,一直有广泛的群众基础。TestNG和JUnit一样,也是为了方便编写单元测试用例的Java类库,诞生之初就宣称是JUnit的下一代产品,事实也确实如此,在功能和易用性方面,TestNG都要强过于4.X及其更早版本的JUnit,网上有很多两者的对比文章,其中比较有名的一篇如下,感兴趣的话大家可以仔细阅读下:

JUnit面对市场份额被TestNG不断蚕食的情况,研发了更加强大的JUnit 5版本,补齐了能力差距,易用性方面也有了更大的提升。因此大家如果可以选择的话,我个人推荐大家直接使用JUnit 5,功能和易用性丝毫不逊色,还有广大的群众基础,出现问题也方便更快的搜索到解决方案。那你用JUnit或者TestNG工具写完了单元测试用例,怎么执行呢?你可以在各种IDE(比如Eclipse或者IntelliJ IDEA)使用对应的插件来帮助运行这些测试用例,当然你甚至都可以不用IDE,配置好依赖,直接命令行运行这些测试用例。

但是如何在Maven项目中自动执行这些步骤呢?这就是maven-surefire-plugin所做的事情了。

maven-surefire-plugin

maven-surefire-plugin是Maven内嵌的一个插件,会帮助你在执行mvn test的时候自动执行用JUnit/TestNG编写的测试用例。

除了将用例执行结果打印到屏幕上之外,还会在target\surefire-reports目录下生成两种形式的用例执行结果:

但是xml和txt格式的报告文件不太方便查看,要是能以html格式展示就好,所以你需要maven-surefire-report-plugin

maven-surefire-report-plugin

maven-surefire-report-plugin的输入就是maven-surefire-plugin所产生的的xml后者txt格式的用例执行报告,输出就是html格式的用例执行报告。当你执行surefire-report:report时,你就会获得一个html格式的文件:

内容如下:

是不是感觉很丑?没有关系,我们可以利用maven-project-info-reports-plugin让他变得漂亮些。

maven-site-plugin/maven-project-info-reports-plugin

maven-site-plugin主要作用是帮你迅速生成(site:site)一个站点,并完成站点的部署(site:deploy)和启动(site:run)。当你执行site:site时,maven会同时调用maven-project-info-reports-plugin(所以如非定制要求,你可以不在pom.xml中配置maven-project-info-reports-plugin的依赖),生成一个项目框架结构,类似这种:

其实maven-project-info-reports-plugin还能根据你在pom.xml中配置的<project><reporting><plugins>配置的report插件,生成各种各样的项目报告,比如刚才说的maven-surefire-plugin生成的用例执行报告,和马上要说的用例覆盖报告。是不是感觉这里面展示的报告样式比直接打开surefire-report.html好多了?

[Emma/emma-maven-plugin][Jacoco/jacoco-maven-plugin][Cobertura/cobertura-maven-plugin]

这坨东西可以分为两类,一类就是检查Java用例覆盖情况的工具,另一类就是为了方便maven项目使用,开发出来的对应maven插件。其中Emma和emma-maven-plugin都很长时间没人维护了,所以我fork了这两个项目,并打算继续维护,目前为止已经解决了一些常见问题:

JaCoCo/jacoco-maven-plugin是同一个团队(EclEmma)在维护,EclEmma原本是一个Emma在Eclipse上的插件,但是在插件开发过程中越来越发现Emma在框架结构上的缺陷无法彻底解决,于是另起炉灶开发了JaCoCo,也就是说EclEmma现在除了名字外已经和Emma没有关系了。

三类用例覆盖工具中JaCoCo是最新的,也是对Java 8+新标准支持最好的,但是另外两个工具也有其特长,大家工作中根据实际情况选择即可。

远不止这些

前面介绍了测试用例执行情况和用例覆盖情况的报告,其实为了提升项目质量,可以提供很多种报告供大家使用,比如静态检查的findbugs、PMD等,我之前写过一个更加全面的工具汇总文章,大家可以参考: https://www.cnblogs.com/jiangxinnju/p/10010177.html

理论说了一大堆,大家有没有一种冲动,把这些工具引用到自己的项目中去?这边有个例子供大家参考:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Eclipse+Spark搭建源码分析环境问题分析

    Scala IDE complains about ‘... is cross-compiled with an incompatible version of...

    用户1221057
  • [Maven][maven-site-plugin]告警[WARNING] No project URL defined - decoration links will not be relativi

    执行mvn clean package site时报错[WARNING] No project URL defined - decoration links w...

    用户1221057
  • javadoc相关问题

    src源代码生成html格式文档:http://www.cnblogs.com/shenliang123/archive/2012/04/23/2466483....

    用户1221057
  • maven常用插件

    http://maven.apache.org/plugins/maven-assembly-plugin/

    2Simple
  • Mysql thread 与 OS thread

    本文作为 Mysql插入2.6亿条垃圾数据后会发生什么? 、手工重现Mysql插入的”2.6亿”垃圾数据 的续篇,初始目的是想看看kill掉执行中的事务对应的o...

    码代码的陈同学
  • Maven系列第10篇:设计你自己的maven插件【高手必备】

    整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。

    路人甲Java
  • 如何实现系统的可扩展性和高可用性

    概述 可扩展性,高可用性和性能 可扩展性,高可用性,性能和关键任务这些术语对不同组织或组织内的不同部门来说意味着不同的事情。它们经常被互换,造成混乱,导致管理...

    用户1263954
  • 高分辨率图像建筑物提取数据集制作

    # data:2020-01-04 # user:dean # desc:批量将json文件转为 label import os dir = r"I:\人工智能...

    Dean0731
  • 腾讯要建超级大脑,用三张网实现AI in All万物互联

    在广州腾讯云服务峰会的主题演讲中,马化腾介绍了公司新推出的超级大脑平台以及包含“物联网”,“人联网”和“智联网” 的三网概念。

    AiTechYun
  • 直播预告 | 用AI激活参与感:品牌粉丝“颜值”如何刷爆朋友圈

    随着高新技术的快速发展,AI被运用到各种不同的领域中。在工业、医疗、无人驾驶,乃至家居生活中,我们都能看见AI的身影。除此之外,AI也被广泛应用于动漫、音乐、影...

    优图实验室

扫码关注云+社区

领取腾讯云代金券