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

本文主要是介绍test coverate-03-测试覆盖率 EMMA 一款免费的Java代码覆盖工具 emma 和 jacoco 对比,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

拓展阅读

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

这篇关于test coverate-03-测试覆盖率 EMMA 一款免费的Java代码覆盖工具 emma 和 jacoco 对比的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/573376

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面