使用 EclEmma 进行覆盖测试
开源软件测试工具 EclEmma,它能够对由 Java 语言编写的程序进行覆盖测试,从而对程序运行的结果生成详尽的覆盖测试报告。
UT-Junit
安装 EclEmma 插件
安装 EclEmma 插件的过程和大部分 Eclipse 插件相同,我们既可以通过 Eclipse 标准的 Update 机制来远程安装 EclEmma 插件(图 1),也可以从站点(参阅 参考资源)下载 zip 文件并解压到 eclipse 所在的目录中。
图 1 添加 EclEmma 更新站点 
不管采用何种方式来安装 EclEmma,安装完成并重新启动 Eclipse 之后,工具栏上应该出现一个新的按钮:
图 2 新增的覆盖测试按钮
使用 EclEmma 测试 Java 程序
为了实验 EclEmma 的特性,我们首先在 Eclipse 的 Workspace 中建立一个名称为 test.emma 的新 Java 项目。接下来,我们在其中建立一个 HelloWorld 类,其代码如下所示:
清单 1 用于测试 EclEmma 的代码
package test.emma; |
接下来,我们通过 EclEmma 运行 HelloWorld.main() 函数。
图 3 对 Java 应用程序进行覆盖测试 
执行完毕之后,我们正在编辑 HelloWorld.java 的窗口将会变成如下所示:
图 4 进行覆盖测试的结果 
在 Java 编辑器中,EclEmma 用不同的色彩标示了源代码的测试情况。其中,绿色的行表示该行代码被完整的执行,红色部分表示该行代码根本没有被执行,而黄色的行表明该行代码部分被执行。黄色的行通常出现在单行代码包含分支的情况,例如 图 4 中的 16 行就显示为黄色。由于程序中有一个随机确定的分支,因此读者的窗口可能与这里稍有不同(11 行或者 14 行中有且只有一个红色的行)。
除了在源代码编辑窗口直接进行着色之外,EclEmma 还提供了一个单独的视图来统计程序的覆盖测试率。
图 5 察看程序的覆盖测试率 
EclEmma 提供的 Coverage 视图能够分层的显示代码的覆盖测试率,图 5 中的信息表明我们对 HelloWorld 的一次运行覆盖了大约 68.6% 的代码。
想在一次运行中覆盖所有的代码通常比较困难,如果能把多次测试的覆盖数据综合起来进行察看,那么我们就能更方便的掌握多次测试的测试效果。EclEmma 提供了这样的功能。现在,让我们重复数次对 HelloWorld 的覆盖测试。我们注意到 Coverage 视图总是显示最新完成的一次覆盖测试。事实上,EclEmma 为我们保存了所有的测试结果。接下来,我们将通过 Coverage 视图的工具按钮来结合多次覆盖测试的结果。
图 6 用于结合多次覆盖测试结果的工具栏按钮 
当我们多次运行 Coverage 之后,我们可以单击 图 6 所示工具栏按钮。之后,一个对话框将被弹出以供用户选择需要合并的覆盖测试。
图 7 选择需要合并的覆盖测试结果 
在合并完成之后,我们可以观察到 Java 编辑器和 Coverage 视图中都显示了合并之后的结果:
图 8 察看合并后的覆盖测试结果 
图 8 中,我们可以看到,通过多次运行覆盖测试,最终我们的代码达到了 91.4% 的测试覆盖率。有趣的是,图中第三行代码被标记为红色,而此行代码实际上是不可执行的。奥妙在于,我们没有生成任何 HelloWorld 类的实例,因此缺省构造函数没有被调用,而 EclEmma 将这个特殊代码的覆盖状态标记在类声明的第一行。
![]() |
|
EclEmma 的高级特性
如果 EclEmma 只能测试 Java Application 的测试覆盖率,那么它相对命令行版本的 Emma 来说,提供的增强就不多了。相反,EclEmma 提供了很多与 Eclipse 紧密结合的功能。它不仅能测试 Java Application,还能计算 JUnit 单元测试,对 Eclipse 插件测试的覆盖率。从 图 9 中我们可以看到 EclEmma 目前支持四种类型的程序。
图 9 EclEmma 的配置页面 
为了了解 EclEmma 是如何获得覆盖测试数据的,我们需要先对 Emma 有初步的了解。通常代码覆盖测试工具都需要对被执行的代码进行修改。而 Emma 提供了两种方式来完成这件事。
- 预插入模式:对程序进行测量之前,需要采用 Emma 提供的工具对 class 文件或者 jar 文件进行修改。修改完成之后的代码可以立刻被执行。覆盖测试的结果将会被存放到指定的文件中。
- 即时插入模式:即时插入模式不需要事先对代码进行修改。相反,对代码的修改是通过一个 Emma 定制的 Class loader(类载入器)进行的。这种方式的优点很明显,我们不需要对 class 或者 jar 文件进行任何修改。缺点是我们为了获得测试的结果,需要用 Emma 提供的命令 emmarun 来执行 Java 应用程序。
使用即时插入模式的优点很明显:class 文件和 jar 文件不会被修改。而预插入模式的应用范围更为广泛,对于某些需要嵌入到框架中运行的代码来说(例如 EJB),我们只能使用预插入模式。EclEmma 仅仅使用了 Emma 的预插入模式来工作,不过 EclEmma 缺省会在临时目录中创建 class 文件和 jar 文件的副本来进行修改,因此在 workspace 中 class 和 jar 文件仍然保持原样。虽然听上去很好,但是由于需要修改 classpath 来使用修改过的 class 和 jar 文件,对于不能修改 classpath 的应用(例如 Eclipse RCP 和 JUnit Plugin Test)来说,我们还是只能选择修改 workspace 中的 class 文件和 jar 文件。对于 Java Application 和 JUnit 类型的覆盖测试,我们可以在配置对话框中选中“In-place instrumentation”项来指定直接修改 Workspace 中的 .class 文件和 .jar 文件。
![]() |
|
结论
本文通过一个简单的例子介绍了使用 EclEmma 进行覆盖测试的基本过程。EclEmma 允许软件工程师方便的考察测试的覆盖率,并能将测试结果以直观、简洁的方式展现给开发人员。
参考资料
学习
- developerWorks 文章“使用 EMMA 测量测试覆盖率”:介绍了 EclEmma 的核心 Emma 的使用方法。
- developerWorks 文章“怎样使用 JUnit Framework 进行单元测试的编写”:一篇介绍 JUnit 的优秀文章。
- developerWorks 文章“TestNG 使 Java 单元测试轻而易举”:介绍了一个比 JUnit 更新的测试框架 TestNG。
- developerWorks 文章“追求代码质量: 不要被覆盖报告所迷惑”:覆盖测试也有其局限性,通过本文可以理解即使达到了 100% 的覆盖率,bug 也仍然可能出现。
- developerWorks 文章“持续测试: 将错误扼杀在摇篮之中”:介绍了一种更高效的进行单元测试的有趣技术。
使用 EclEmma 进行覆盖测试的更多相关文章
- EclEmma安装与使用
安装 EclEmma 插件的过程和大部分 Eclipse 插件相同,我们既可以通过 Eclipse 标准的 Update 机制来远程安装 EclEmma 插件(图 1),也可以从站点(参阅参考资源)下 ...
- intellij idea 13&14 插件推荐及快速上手建议
IntelliJIDEA插件安装 首页 > blog Tags : intellij IDEA插件安装 更新日期: 2015-04-29 IntelliJ IDEA插件下载地址: http:// ...
- Index
我主要在研究.NET/C# 实现 PC IMERP 和 Android IMERP ,目的在解决企业通信中遇到的各类自动化问题 分布式缓存框架: Microsoft Velocity:微软自家分布 ...
- GitHub上整理的一些工具
技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...
- GitHub上整理的一些工具[转载]
Source:http://segmentfault.com/q/1010000002404545 技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddi ...
- Java爬虫工程师技能列表
以下仅仅是自己一些粗浅认识.欢迎补充指正.欢迎进群交流! 掌握一半便能够熟练的开发爬虫玩了.自己正在努力中... 一.技能列表 1.掌握java.尤其编程网络部分:李刚的java基础至少看了三遍以上: ...
- GitHub 开源工具整理
技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...
- GitHub上整理的一些工具,求补充
http://segmentfault.com/q/1010000002404545 技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MS ...
- GitHub上整理的一些资料(转)
技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...
随机推荐
- C#用DataTable实现Group by数据统计
http://www.cnblogs.com/sydeveloper/archive/2013/03/29/2988669.html 1.用两层循环计算,前提条件是数据已经按分组的列排好序的. Dat ...
- JavaScript 内存相关知识
一.内存基本概念 1.1.生命周期 不管什么程序语言,内存生命周期基本是一致的: 分配你所需要的内存 var n = 123; // 给数值变量分配内存 var s = "azerty&qu ...
- SpringMVC 如何在页面中获取到ModelAndView绑定的值
springMVC中通过ModelAndView进行后台与页面的数据交互,那么如何在页面中获取ModelAndView绑定的值呢? 1.在JSP中通过EL表达式进行获取(比较常用) 后台:ModelA ...
- 第七章:Python基础のXML操作和面向对象(一)
本課主題 XML介绍与操作实战 shutil 模块介绍与操作实战 subprocess 模块介绍与操作实战 初探面向对象与操作实战 本周作业 XML介绍和操作实战 對於浏览器返回的字符串有以下幾種: ...
- 编码(ACSII unicod UTF-8)、QT输出中文乱码深入分析
总结: 1. qt输出中文乱码原因分析 qt的编程环境默认是utf-8编码格式(关于编码见下文知识要点一): cout << "中文" << endl; 程 ...
- 2017 年的 人生 hard 模式终于结束了,2018年回归初心
2017 年的 人生 hard 模式终于结束了,2018年回归初心 2017年对于我个人来讲, 毫不夸张的说 算是近十年来除了高考那一年,最最惊心动魄的一年了,没有之一. >>>开篇 ...
- (译)Web是如何工作的(2):客户端-服务器模型,以及Web应用程序的结构
原文地址:https://medium.freecodecamp.org/how-the-web-works-part-ii-client-server-model-the-structure-of- ...
- ActiveMQ进阶学习
本文主要讲述ActiveMQ与spring整合的方案.介绍知识点包括spring,jms,activemq基于配置文件模式管理消息,消息监听器类型,消息转换类介绍,spring对JMS事物管理. 1. ...
- 编码与模式------《Designing Data-Intensive Applications》读书笔记5
进入到第四章了,本篇主要聊的点是编码(也就是序列化)与代码升级的一些场景,来梳理存储之中涉及到的编解码的流程.目前主流的编解码便是来自Apache的Avro,来自Facebook的Thrift与Goo ...
- swiper插件的简单使用,实现图片轮播
移动端和p c端经常会遇到写轮播图的情况,这里只是简单的说一下swiper插件的简单用法(移动端为例). <!DOCTYPE html> <html lang="en&qu ...
