##什么是Emma?
EMMA 是一个用于检测和报告 JAVA 代码覆盖率的开源工具。它不但能很好的用于小型项目,很方便得得出覆盖率报告,而且适用于大型企业级别的项目。
本篇教程写给不愿意看emma userguide文档的兔子们,主要目标是给没有接触过emma的人一个可以成功运行的实例,傻瓜式教程。
##准备工作
- 下载emma文件 【下载地址】
- 解压下载下来的文件 将lib/文件夹下的emma.jar放到你电脑的jre文件夹的/lib/ext/文件夹下,也可能是jdk文件夹的jre/lib/ext文件夹下,取决于你的电脑使用的是jre还是jdk。也可以每次运行的时候把emma.jar的路径加到命令中,不过太繁琐了。
##Emma on-the-fly模式
Emma 有两种运行模式,一种是on-the-fly模式,一种是offline模式。
On the fly 模式往加载的类中加入字节码,相当于用 EMMA 实现的 application class loader 替代原来的 application class loader。
Offline 模式在类被加载前,加入字节码
|
|
用户手册上的这个命令会报错,emma有好几年没有更新了,因此当java7出来后有一些新的特性,emma没有能够及时支持,使用下面的命令可以成功运行,具体可以看【StackOverflow上的解释】,下文中也有些命令需要这个参数
完成上一步后应该可以看到如下结果:
##Emma offline模式
在offline模式下,emma的功能分成了几个子命令:instr,merge和report
###1.插装
instrument在测试中是插装的意思。
当你运行一段代码时,你如何判断哪些语句、条件、分支、路径执行过了?如果这个都不能判断,那覆盖率无从谈起。
代码插装就是在要测的代码中插入你写的一些代码,可以是(但不限于)打印语句等。知道了代码中哪些部分已经执行过了,那我们就可以有的放矢,针对没有覆盖到的语句、条件、分支、条件分支、路径等补充用例以达到更充分的覆盖。
12345678910 <!-- 和上面一样,用终端cd到下载下来的emma文件夹的examples文件目录 为了保险起见,将插装后生成的.class文件放在另一个文件中-->$ mkdir out$ javac -d out -g src/*.java src/search/*.java src/search/*.java$ mkdir outinstr$ java emma instr -d outinstr -ip outEMMA: processing instrumentation path ...EMMA: instrumentation path processed in 116 msEMMA: [3 class(es) instrumented, 0 resource(s) copied]EMMA: metadata merged into [...coverage.em] {in 31 ms}
此步骤完成后,会生成coverage.em文件,教程中讲是dump出来的类的元数据(metadata)。
###2.执行
运行插装后的程序
此步骤完成后,会生成coverage.ec文件,当JVM退出时,EMMA将运行时覆盖轮廓(runtime coverage profile),写进该文件中。
注意此命令中的classpath:outinstr;out,插装的类必须放在第一个,因为instr命令时没有复制无法执行的东西,如接口和资源,因此原始的out文件夹应该放在outinstr文件夹后。
###3.生成报告
此步骤将类的原数据和运行时的覆盖轮廓结合起来生成一个txt形式的报告和一个html形式的报告。
###可选操作:合并
可以将生成的文件合并成一个。
###运行结果
运行完以上命令后可以查看生成的html覆盖率结果分析如下:
#参考文献