拓展阅读

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

传递

chat

详细介绍一下 EMMA

Emma(也称为Emma Code Coverage)是一个用于Java应用程序的开源代码覆盖工具。

它提供了在测试过程中衡量代码覆盖率的能力,帮助开发人员了解他们的测试用例对源代码的覆盖程度。

以下是对Emma的详细介绍:

特点和功能:

  1. 支持多种覆盖率指标: Emma支持基本的行覆盖率(Line Coverage)和更高级的决策覆盖率(Decision Coverage),可以帮助开发人员更全面地了解代码覆盖情况。

  2. 易于集成: Emma可以与不同的构建工具和测试框架集成,包括Ant、Maven、JUnit等。它能够通过字节码插桩的方式嵌入到应用程序中,实现对代码的动态分析。

  3. 支持断点覆盖率分析: Emma不仅提供了基于测试用例的覆盖率信息,还支持通过在应用程序运行时启用断点覆盖率来手动观察代码覆盖情况。

  4. 报告生成: Emma生成详细的报告,包括文本报告和HTML报告,可视化地展示哪些代码被覆盖,哪些未被覆盖,以及覆盖率百分比等信息。

  5. 开源且可定制: Emma是开源的,这意味着开发人员可以查看其源代码,自行定制和扩展。这为团队提供了灵活性,使其能够根据具体项目需求进行适当的调整。

Emma的工作原理:

  1. 字节码插桩: Emma通过字节码插桩的方式在应用程序的字节码中插入探针代码,这些探针代码用于跟踪代码的执行情况。

  2. 运行时数据收集: 在应用程序运行期间,Emma收集被执行的代码信息,包括哪些行、分支、决策被执行,以及执行次数等。

  3. 报告生成: 收集到的覆盖率数据被用于生成覆盖率报告。Emma生成的报告提供了直观的信息,帮助开发人员理解测试用例对代码的覆盖程度。

Emma的不足之处:

  1. 维护状态: Emma在过去是一个流行的代码覆盖工具,但自2016年以来就没有活跃的维护。因此,一些团队可能更倾向于选择更新的工具,如JaCoCo。

  2. 功能相对有限: 相较于一些新一代的代码覆盖工具,Emma的功能可能相对有限。一些开发团队更喜欢使用支持更多高级特性的工具。

总体而言,Emma是一个曾经流行的代码覆盖工具,尤其在一些旧有项目中可能仍在使用。然而,考虑到维护状态和功能的发展,一些团队可能更愿意选择使用更新的工具来满足其代码覆盖分析的需求。

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: 优化了运行时性能,对应用程序的影响相对较小。

总体而言,JaCoCo在功能、性能和工具集成方面相对更为全面和灵活,而Emma则在一些旧有项目中可能仍在使用,但由于维护状态和功能发展,一些团队更倾向于选择使用JaCoCo。

选择工具应该根据具体项目的需求、团队的偏好和当前工具的维护状态来进行权衡。

emma 和 jacoco 哪个更加值得深入学习?为什么

选择深入学习Emma还是JaCoCo取决于多个因素,包括项目需求、工具特性、社区支持和个人偏好。以下是一些考虑因素,可以帮助你做出更明智的选择:

Emma 的优势和适用场景:

  1. 简单性: Emma相对较简单,适用于小型项目或初学者。如果你正在处理一个较小的项目,或者你是一个初学者,Emma可能更容易上手。

  2. 历史使用: 如果你的项目已经在使用Emma,并且没有出现问题,继续使用Emma可能是一个合理的选择。不过需要注意,由于Emma在维护状态上相对较差,如果项目需要长期支持,可以考虑迁移到更活跃维护的工具。

JaCoCo 的优势和适用场景:

  1. 全面性: JaCoCo提供了更丰富的覆盖率度量指标,支持更多的报告生成格式,以及更好的集成能力。如果你需要更全面、详细的代码覆盖分析,以及更灵活的报告生成功能,JaCoCo可能更适合你的需求。

  2. 性能: JaCoCo通常具有更好的性能,尤其在大型项目中。如果你关注代码覆盖分析对应用程序运行时性能的影响,JaCoCo可能是更优秀的选择。

  3. 活跃社区: JaCoCo拥有一个较为活跃的社区,持续更新和维护。这对于解决潜在的问题、获得支持和参与社区讨论是很重要的。

  4. 工具集成: JaCoCo在各种构建工具和测试框架中的集成更为广泛,这使得在不同项目和环境中更容易使用。

综合考虑因素:

  1. 项目需求: 考虑你的项目需求,是否需要更详细的覆盖率度量、更灵活的报告生成,或者是更低的性能开销。

  2. 团队经验: 如果团队已经对其中一个工具有较多经验,平稳迁移可能是一个考虑因素。

  3. 未来维护和发展: 考虑工具的维护状态和发展趋势。如果一个工具在维护和更新上更有活力,可能更适合长期的项目。

  4. 社区支持: 活跃的社区通常意味着更好的支持和问题解决能力。

  5. 个人偏好: 个人的喜好和习惯也是一个考虑因素。如果你更喜欢一种工具的使用方式,可能更容易深入学习并熟练掌握。

综合考虑上述因素,如果你正在从头开始或者面对大型项目,JaCoCo可能是一个更全面的选择。但如果项目已经在使用Emma,并且满足需求,没有紧急升级的需求,继续使用Emma也是可以考虑的。

如果让你深入学习 emma,你会问哪 10 个问题?为什么

深入学习Emma时,你可能会问以下10个问题,以便更好地了解该工具的设计、使用和定制能力:

  1. Emma是如何进行代码插桩的?

    理解Emma的插桩机制,包括如何在源代码或字节码中插入探针代码,以进行代码覆盖率分析。

  2. Emma支持哪些代码覆盖率度量指标?

    了解Emma支持的覆盖率度量,包括行覆盖率、决策覆盖率等,以及各指标的含义和适用场景。

  3. Emma是如何收集和存储覆盖率数据的?

    探究Emma在运行时如何收集覆盖率数据,并将这些数据存储起来,以便后续生成报告。

  4. Emma的报告生成原理是什么?

    了解Emma生成覆盖率报告的原理,包括报告的格式、内容,以及如何通过报告进行可视化分析。

  5. Emma的工具集成是如何进行的?

    探究Emma如何与构建工具(如Ant、Maven)和测试框架(如JUnit)进行集成,以实现在构建和测试过程中的代码覆盖率分析。

  6. Emma对于大型项目的性能影响是什么?

    了解在大型项目中使用Emma对应用程序运行时性能的影响,以及如何优化配置以减小性能损失。

  7. Emma的报告中如何排除不需要关注的代码?

    探讨Emma配置中如何排除第三方库、自动生成的代码等不需要关注的部分,以确保关注点集中在项目核心代码上。

  8. Emma是否支持对特定代码路径的定制化分析?

    了解Emma是否支持针对特定代码路径的自定义配置,以实现更精细的覆盖率分析。

  9. Emma在持续集成工具中的集成方式是什么?

    探究Emma如何与持续集成工具(如Jenkins)集成,以实现在每次构建中自动执行代码覆盖率检测和生成报告。

  10. Emma的社区支持和维护状态如何?

    了解Emma的社区活跃度、维护状态以及是否存在最新版本,以评估工具的长期可用性和是否值得投入深入学习。

这些问题可以帮助你全面了解Emma的工作原理、使用方式以及在实际项目中的应用。

深入了解这些方面将有助于你更有效地使用Emma进行代码覆盖率分析。

给出 emma 的学习资料,包含网址

Emma 的学习资料相对较少,因为 Emma 在过去的几年中没有得到积极的维护。

以下是一些可能对你学习 Emma 有帮助的资源:

  1. 官方网站(Archived):
    • Emma - SourceForge:Emma的官方 SourceForge 页面。请注意,这是存档的网站,Emma 目前已经不再积极维护。
  2. 文档(Archived):
    • Emma Documentation:Emma 的文档页面,提供了基本的使用说明和配置信息。注意,这是存档的文档。
  3. GitHub 存档:
    • Emma GitHub Repository:Emma 的 GitHub 存档,这是 JaCoCo 项目的一部分。虽然 JaCoCo 接管了 Emma 的维护,但 Emma 的具体信息可能会相对较少。

请注意,由于 Emma 的不再活跃维护,如果你正在考虑使用代码覆盖率工具,JaCoCo 是一个更为现代、活跃维护且广泛使用的替代方案。如果可以考虑迁移到 JaCoCo,它有更好的社区支持和更多的功能。JaCoCo 的学习资料相对丰富,你可以通过访问 JaCoCo 的官方网站和文档来获取更多信息:

参考资料

https://support.smartbear.com/testcomplete/docs/tutorials/getting-started/first-test/web/index.html