test coverate-03-测试覆盖率 EMMA 一款免费的Java代码覆盖工具 emma 和 jacoco 对比

发布时间:2024年01月05日

拓展阅读

test 系统学习-04-test converate 测试覆盖率 jacoco 原理介绍

test 系统学习-05-test jacoco 测试覆盖率与 idea 插件

test 系统学习-06-test jacoco

EMMA:一款免费的Java代码覆盖工具

免费的代码覆盖:一项基本自由?

直到最近,Java开发领域一直受到一个荒谬的不一致困扰:Java开发者拥有优秀的免费集成开发环境、免费编译器、免费测试框架,但却不得不依赖那些收费昂贵的代码覆盖工具。

作为一名Java专业人士,我希望能够在工作中进行大型商业项目或在家中进行小型娱乐项目时,都能使用相同的免费覆盖工具。我创建了EMMA就是为了成为那个工具。

EMMA是一个用于测量和报告Java代码覆盖的开源工具包。

EMMA通过追求一种独特的特性组合来区别于其他工具:支持大规模企业软件开发,同时保持个别开发者的工作快速而迭代。

现在,你团队中的每个开发者都可以免费获取代码覆盖,而且获取速度很快!

很有可能,你来到这里时已经知道覆盖是怎么回事,实际上,你可能正在想EMMA提供了什么,以及为什么值得一试。

请浏览本站的其余部分,了解更多信息。

EMMA功能一览:

  • EMMA可以为覆盖而仪器化类,可以是离线(在加载之前)或即时(使用仪器化的应用程序类加载器)。
  • 支持的覆盖类型:类、方法、行、基本块。EMMA可以检测单个源代码行是否仅部分覆盖。
  • 覆盖统计数据在方法、类、包和“所有类”级别进行聚合。
  • 输出报告类型:纯文本、HTML、XML。所有报告类型都支持下钻,可以由用户控制详细深度。HTML报告支持源代码链接。
  • 输出报告可以突出显示覆盖水平低于用户提供的阈值的项目。
  • 可以合并在不同仪器化或测试运行中获取的覆盖数据。

v2.1中的新功能:

从版本2.1.5320开始,可以远程转储或重置覆盖数据而无需JVM退出。

  • EMMA不需要访问源代码,并且随着输入类中可用的调试信息减少,它会优雅地降级。
  • EMMA可以仪器化单个 .class 文件或整个 .jars(如果需要,可以原地)。还支持高效的覆盖子集过滤。
  • Makefile和ANT构建集成在平等的基础上得到支持。
  • EMMA速度相当快:添加仪器化的运行时开销很小(5-20%),字节码仪器本身非常快(主要受文件I/O速度限制)。内存开销每个Java类几百字节。
  • EMMA是100%纯Java,没有外部库依赖,并在任何Java 2 JVM(甚至是1.2.x)中运行。

更多关于EMMA功能的信息可以在FAQ中找到。

EMMA:快速入门

本页面展示了使用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报告

嗯,在纯文本文件中尝试显示分层和列式数据只能有限地进行。

接下来,尝试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 对比,二者在设计等方面有哪些差异?

Emma和JaCoCo都是用于Java代码覆盖率分析的工具,它们在设计和功能上有一些差异。

以下是Emma和JaCoCo之间的一些主要差异:

设计和实现差异:

  1. 插桩方式:

    • Emma: 使用基于源代码的插桩方式。它在编译阶段生成插桩后的源代码,然后进行编译。这样的插桩方式可能会导致一些源代码变化,因为它会在源代码中添加一些注释和其他标记。
    • JaCoCo: 使用基于字节码的插桩方式。它在字节码层面插入探针代码,避免了对源代码的修改。这种方式通常更为灵活,不会引入源代码变更。
  2. 支持的覆盖率度量:

    • Emma: 提供基本的行覆盖率和决策覆盖率。决策覆盖率关注的是代码中的条件分支覆盖。
    • JaCoCo: 提供行覆盖率、分支覆盖率、方法覆盖率、类覆盖率等多种度量。它支持更全面的代码覆盖率度量指标。

功能差异:

  1. 报告生成:

    • Emma: 生成报告的功能相对较简单,主要包括文本报告和HTML报告。报告的可视化程度相对较低。
    • JaCoCo: 提供丰富的报告生成功能,支持HTML、XML、CSV等多种格式的报告。HTML报告通常具有更高的可视化效果,能够直观地展示代码覆盖情况。
  2. 工具集成:

    • Emma: 集成较为简单,支持与Ant、Maven等构建工具和JUnit测试框架的集成。
    • JaCoCo: 在构建工具中的集成更为广泛,支持Maven、Gradle、Ant等,并且可以与不同的测试框架集成。
  3. 支持状态:

    • Emma: 在过去曾经是比较流行的工具,但自2016年以来就没有维护更新,因此一些团队可能更倾向于使用更新的工具。
    • JaCoCo: 是一个较为活跃维护的工具,持续地更新和添加新功能,因此更适合在当前项目中使用。

性能差异:

  1. 性能开销:

    • Emma: 由于使用源代码插桩,可能引入更大的性能开销,尤其是对于大型项目。它的性能相对较低。
    • JaCoCo: 使用字节码插桩,通常具有较低的性能开销,对于大型项目也有更好的性能表现。
  2. 运行时性能:

    • Emma: 在应用程序运行时可能会有一定的性能影响,特别是对于大规模的应用。
    • JaCoCo: 优化了运行时性能,对应用程序的影响相对较小。
文章来源:https://blog.csdn.net/ryo1060732496/article/details/135410185
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。