test 系统学习-04-test converate 测试覆盖率 jacoco 原理介绍
test 系统学习-05-test jacoco 测试覆盖率与 idea 插件
直到最近,Java开发领域一直受到一个荒谬的不一致困扰:Java开发者拥有优秀的免费集成开发环境、免费编译器、免费测试框架,但却不得不依赖那些收费昂贵的代码覆盖工具。
作为一名Java专业人士,我希望能够在工作中进行大型商业项目或在家中进行小型娱乐项目时,都能使用相同的免费覆盖工具。我创建了EMMA就是为了成为那个工具。
EMMA是一个用于测量和报告Java代码覆盖的开源工具包。
EMMA通过追求一种独特的特性组合来区别于其他工具:支持大规模企业软件开发,同时保持个别开发者的工作快速而迭代。
现在,你团队中的每个开发者都可以免费获取代码覆盖,而且获取速度很快!
很有可能,你来到这里时已经知道覆盖是怎么回事,实际上,你可能正在想EMMA提供了什么,以及为什么值得一试。
请浏览本站的其余部分,了解更多信息。
从版本2.1.5320开始,可以远程转储或重置覆盖数据而无需JVM退出。
更多关于EMMA功能的信息可以在FAQ中找到。
本页面展示了使用EMMA进行一些命令行运行的简易方法(如果你更愿意使用特别准备的示例或开始将现有的ANT构建转换为EMMA,那么你应该阅读用户指南)。
我将使用命令行的原因有几个:一是为了避免现在花时间设置ANT,二是因为EMMA命令行工具可以在现有的ANT构建的基础上使用,而无需更改它(例如,你可以使用单个命令为构建的输出进行仪器化)。
这里唯一的要求是要有emma.jar,你可以从完整版本或较小的 emma-<release>-lib.zip
下载中获取。
(所有EMMA工具都实现为类似bean的对象。命令行工具和ANT任务只是这些对象的前端驱动程序,因此你在命令行上可以做的一切都可以在ANT中完成,反之亦然。)
即时仪器化
这意味着使用EMMA仪器化应用程序运行器来运行现有应用程序。你可以尝试使用JDK附带的SwingSet2演示:
>java -cp emma.jar emmarun -jar .../jdk1.4.2/demo/jfc/SwingSet2/SwingSet2.jar
(正如你所看到的,通过EMMA运行演示基本上是在JVM和应用程序之间插入emmarun:这再也没有更简单的了!)稍微试玩一下Swing演示,然后关闭它。你将看到EMMA将一个纯文本覆盖报告(coverage.txt)写入当前目录。纯文本报告主要用于快速非正式测试。默认情况下,它仅显示总体和包级别的统计信息,大部分都是不言自明的:
总体覆盖概要:
[class, %] [method, %] [block, %] [line, %] [name]
98% (121/123)! 64% (312/489)! 81% (15500/19172) 77% (2633.6/3441)! 所有类
总体统计摘要:
总包数:1
总类数:123
总方法数:489
总可执行文件数:31
总可执行行数:3441
按包进行的覆盖率细分:
[class, %] [method, %] [block, %] [line, %] [name]
98% (121/123)! 64% (312/489)! 81% (15500/19172) 77% (2633.6/3441)! 默认包
对于每种覆盖类型,都显示了总体覆盖百分比,以及实际的百分比比例:后者对于知道哪些区域需要更多测试工作很重要(一个半覆盖的包含500个类的包需要比一个半覆盖的包含10个类的包更多的关注)。
某些列中的奇怪感叹号表示不符合默认覆盖标准的项目(例如,行覆盖率为80%,方法覆盖率为70%)。
嗯,在纯文本文件中尝试显示分层和列式数据只能有限地进行。
接下来,尝试HTML报告(从coverage/index.html开始转储):
>java -cp emma.jar emmarun -r html -jar .../jdk1.4.2/demo/jfc/SwingSet2/SwingSet2.jar
现在,这种类型的报告要容易得多(在这里查看一些样本)。如果通过添加 -sp …/jdk1.4.2/demo/jfc/SwingSet2/src 选项链接到演示源代码,你将在HTML中实际上看到嵌入在HTML中的源代码中的个别行覆盖。
此外,不必在应用程序退出时生成报告:可以将覆盖数据转储到二进制文件中,以供以后生成报告使用。我们可以给emmarun提供很多其他选项,但现在让我们尝试一些完全不同的东西。
离线仪器化
像我们上面所做的那样即时仪器化应用程序并非总是可能的。例如,J2EE容器可能会执行自己的独特类加载,这不容易插入。好吧,在这种情况下,EMMA的离线仪器就是解决方案。
为了尝试它,制作SwingSet2.jar的本地副本,并指示EMMA在原地对其进行仪器化:
>cp .../jdk1.4.2/demo/jfc/SwingSet2/SwingSet2.jar .
>java -cp emma.jar emma instr -m overwrite -cp SwingSet2.jar
EMMA将某些元数据信息写入coverage.em,而此时的jar将包含为覆盖而仪器化的类。(请注意,你可以使用现有构建中的自己的类和jar执行相同的操作,而不是Swing演示。)因为它们现在依赖于某些EMMA运行时类,所以我们需要将emma.jar添加到应用程序执行类路径:
>java -cp SwingSet2.jar:emma.jar SwingSet2
同样,稍微试玩一下Swing演示,然后关闭它。你将看到EMMA将一些运行时覆盖数据写入coverage.ec(两种类型的数据也可以放在同一个文件中,但这不是默认行为)。现在,要生成覆盖报告,只需在报告生成工具中将元数据与运行时覆盖数据结合起来:
>java -cp emma.jar emma report -r html -in coverage.em,coverage.ec
传递
Emma和JaCoCo都是用于Java代码覆盖率分析的工具,它们在设计和功能上有一些差异。
以下是Emma和JaCoCo之间的一些主要差异:
插桩方式:
支持的覆盖率度量:
报告生成:
工具集成:
支持状态:
性能开销:
运行时性能: