类的覆盖率:类覆盖描熟了项目中多少类已被测试套件访问。
方法覆盖率:方法覆盖率是被访问的方法的百分比。
语句覆盖率:语句覆盖率追踪单条源代码语句的调用。
语句块覆盖率:语句快覆盖率将语句块作为基本的覆盖律单元。
分支覆盖率:分支覆盖率也被称为判断覆盖率。指标计算哪些代码分支被执行。
代码的覆盖深度:从覆盖源程序语句的详尽程度分析,逻辑覆盖标准包括以下不同的覆盖
标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖和修正判定条件覆
盖。 参考:http://bbs.51testing.com/thread-74208-1-1.html
·语句覆盖为了暴露程序中的错误,程序中的每条语句至少应该执行一次。因此语句覆
盖(Statement Coverage)的含义是:选择足够多的测试数据,使被测程序中每条语句至少执
行一次。语句覆盖是很弱的逻辑覆盖。
·判定覆盖 比语句覆盖稍强的覆盖标准是判定覆盖(Decision Coverage)。判定覆盖的
含义是:设计足够的测试用例,使得程序中的每个判定至少都获得一次“真值”或“假值”,
或者说使得程序中的每一个取“真”分支和取“假”分支至少经历一次,因此判定覆盖又称为
分支覆盖。
·条件覆盖在设计程序中,一个判定语句是由多个条件组合而成的复合判定。为了更彻
底地实现逻辑覆盖,可以采用条件覆盖(Condition Coverage)的标准。条件覆盖的含义是:
构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。
·多条件覆盖多条件覆盖也称条件组合覆盖,它的含义是:设计足够的测试用例,使得
每个判定中条件的各种可能组合都至少出现一次。显然满足多条件覆盖的测试用例是一定满足
判定覆盖、条件覆盖和条件判定组合覆盖的。
·修正条件判定覆盖修正条件判定覆盖是由欧美的航空/航天制造厂商和使用单位联合制
定的“航空运输和装备系统软件认证标准”,目前在国外的国防、航空航天领域应用广泛。这
个覆盖度量需要足够的测试用例来确定各个条件能够影响到包含的判定的结果。它要求满足两
个条件:首先,每一个程序模块的入口和出口点都要考虑至少要被调用一次,每个程序的判定
到所有可能的结果值要至少转换一次;其次,程序的判定被分解为通过逻辑操作符(and、
or)连接的布尔条件,每个条件对于判定的结果值是独立的。
特点/工具 | Cobertura | Emma | jacoco http://rensanning.iteye.com/blog/2002371 http://blog.csdn.net/smile0102/article/details/48688763 |
集成 | 一个与Junit集成的代码覆盖率测量工具 可以与Ant和Maven集成,也可以通过命令行调用 |
可以统计几种覆盖率:class,method,block, line。支持版本迭代的覆盖率统计 免费且开源的Java代码覆盖率测试工具,100%纯Java编写,不依赖与任何第三方库 |
(Java Code Coverage)是开源的Java代码覆盖率测试library 可以集成到ANT、Maven等build工具中。它采用标准的JVM Tool Interface。把JaCoCo agent 加入到JVM后启动,加载到JVM中的class具体被执行了哪些代码行将会被记录下来,JaCoCo搜集这些执行信息直到JVM结束后生成静态报告。 |
开源 | 免费、开源的 | 免费、开源的 | 免费、开源的 |
报告形式 | 可以生成HTML或XML格式的报告 可以按照不同的标准对HTML结果进行排序 |
提供了多种格式的报告,包括纯文本,HTML和XML,所有的报告都可以进行详细设置以获得定制报告 | |
覆盖率统计 | 为每个类、包以及整个项目计算所覆盖的代码行与代码分支的百分比例 | 支持对类,方法,代码行和基本的分支语句的覆盖率测试 使用EMMA时,不需要获得源代码就可进行覆盖率测试,此外,EMMA还支持对整个jar文件测试。 |
|
在Java测试覆盖率工具上,还有一个更加简单的工具:EclEmma(推荐,EclEmma是一个基于EMMA的Java代码覆盖工具) ,它可以很方便的与Eclipse集成,然后可以直接run,显示出代码覆盖率,其地址是:http://www.eclemma.org/
为覆盖率而设计是错误得的,有一点:有覆盖率统计,好过没有
大多数功能测试中,测试人员一般不能直接得到被测源代码,源代码也不是测试人员关心的重点。在具体的测试过程中,功能测试人员一般以一个有意义的功能模块作为测试关心的重点,而能够反映一定功能含义的类和方法的覆盖率在功能测试中更有价值。因此,在功能测试中,类覆盖率和方法覆盖率是测试人员关心的重点,行和块覆盖率则作为测试的参考。
测试覆盖率报告中包含了两个方面的内容,测试覆盖的部分和未被测试覆盖的部分。尽管百分之百的测试覆盖率不能代表被测对象完全没有问题,但是测试覆盖的部分以及覆盖比率可以增加测试者对测试工作的信心,指导测试执行以及测试的方向。另一方面,当测试用例执行出现异常时,针对每个测试用例的测试报告还可以提供可疑代码的范围,为代码纠错提供帮助。
测试覆盖率报告中未覆盖的部分也同样有价值:
在使用 EMMA 获得测试覆盖率过程中,类、方法等覆盖的百分比报告,可以方便测试人员更好的评估测试。测试人员通过对照覆盖率报告与测试用例设计文档,需求文档可以迅速找到测试的不足。通过与开发人员进行讨论,可以更好的评估测试力度,并指导进一步的测试。因此在功能测试中引入覆盖率信息,能够完善测试结果报告,确保测试质量和力度,保证测试按质、按量地完成。
EMMA基本是四步曲:插桩(instr),运行,收集(ctl),报告(report)
版本0:http://www.ibm.com/developerworks/cn/opensource/os-cn-emma/
EMMA 通过对被测组件进行插装来跟踪被测组件的执行过程。测试人员应首先和开发人员讨论,确定哪一部分包含了符合插装要求的文件( Java 文件),哪一部分需要考虑覆盖率信息,然后选择合适的方式进行插装。
在执行插装操作之前,首先应该扩展 Java 虚拟机,即将 emma.jar 放到被测组件运行使用的JRE 目录下面作为 JRE 的扩展,以便 EMMA 能够被调用。 emma.jar 包含了 EMMA 核心功能模块的实现和 EMMA 运行时所需的类文件,这些文件是使用 EMMA 所必需的。
由于示例被测组件运行在 Websphere Portal Server 中,并使用默认的 JRE 运行,因此将emma.jar 放到 “/opt/WebSphere/PortalServer/java/jre/lib/ext” 下面。在实际的测试中,将该路径进行相应的替换。
/opt/WebSphere/PortalServer/java/jre/bin/java emma instr -m overwrite -ip /opt/WebSphere/PortalServer/installedApps/NumberQuizWEB_10yggsru.ear/NumberQuizWEB.war/WEB -INF/classes -Dmetadata.out.file=/root/emma/Number_coverage.em
完成插装操作以后,在指定的路径下会产生一些名为 “*coverage.em” 的文件,这些文件保存了插装的元信息,这些信息主要是记录插装过程中的插装点在被测代码中的位置。如果在插装过程中,指定这些文件到同一文件的话, EMMA 默认将元数据进行合并。如果测试人员未指定路径,或者希望得到独立的元文件,这些文件将分别产生在默认或指定的目录下。测试人员还可以通过使用 “merge” 命令手动将这些元文件进行合并,保证生成的覆盖率报表的全面性。注意:合并操作不支持逆向操作。
/opt/WebSphere/PortalServer/java/jre/bin/java emma merge -input/coverage1.em, /coverage.em -out /coverage2.em
完成插装工作以后,测试人员可以按照测试计划运行测试用例。 EMMA 将在测试执行的过程中记录代码执行信息并将结果记录在内存中。每次当 JVM 停止时,内存中记录的执行信息将被清除并被保存到 “*.ec” 的文件中。但是在实际测试的过程中, JVM 的停止很难控制,因此测试人员可以定时手动将内存中执行信息写出。在这种情况下,内存中的记录被输出,但是内存中的内容不被清除。
/opt/WebSphere/PortalServer/java/jre/bin/java -cp emma.jar emma ctl -connect auscsdpfvtvm15.bto.ibm.com:47653 -command coverage.get,/root/emma/Number_coverage.ec EMMA: processing control command sequence EMMA: executing [coverage.get (/root/emma/Number_coverage.ec,true,true)] EMMA: coverage.get: local copy of coverage data merged into [/root/emma/Number_coverage.ec] {in 39 ms} EMMA: coverage.get: command completed in 79 ms EMMA: control command sequence complete
这样收集到的信息被保存在 “coverage.ec” 中, “coverage.ec” 是二进制格式的文件,因此很难被用来查看覆盖率结果。
/opt/WebSphere/PortalServer/java/jre/bin/java -cp emma.jar emma report -r html -in /root/emma/Number_coverage.em,/root/emma/Number_coverage.ec - Dreport.html.out.file=/root/emma/Number_coverage.html -Dreport.metrics=class:80 (,method:75)
在生成覆盖率报告的过程中,测试人员可以根据测试要求通过 “Dreport.metrics” 参数设定满意的覆盖率标准。在示例命令中设定了类覆盖率的满意度为80%。
测试报告可以以 HTML ,文本和 XML 三种格式输出。
完成所用的测试用例后,测试覆盖信息可以被合并在一起,得到整个测试的覆盖报告。覆盖率结果文件通过 “merge” 命令合并 “*.ec” 文件实现的。
另外,由于 EMMA 中测试覆盖率是通过与 “*.em” 文件关联获得代码信息的,因此当代码发生变化时,已经运行过的测试不必完全重复,只需将得到的 “*.ec” 文件合并(新得到的 “*.ec” 文件放在后面),然后关联最新的 “*.em” 文件即可得到代码变化后的覆盖率信息,这方便了 EMMA 支持版本变化的测试。在生成新的测试报告的时候,需要注意 “*.ec” 的时间一定要晚于 “*.em” 文件。
/opt/WebSphere/PortalServer/java/jre/bin/java emma merge –input coverage1.ec,coverage2.ec,coverage3.ec –output coverage.ec
如果在生成测试报告的时候,如果出现 “com.vladium.emma.EMMARuntimeException: [CLASS_STAMP_MISMATCH] runtime version of class in the coverage data is not consistent with the version of this class in the metadata, possibly because stale metadata is being used for report generation” 错误,说明在生成新的 “*.em” 前后代码曾经被修改过,并且被修改的代码所在的类文件在新的测试中没有被覆盖到,这就需要重新执行这部分测试,保证修改过的部分被重新执行。
4、运行功能测试用例
5、收集数据:java emma ctl -connect localhost:47653 -command coverage.get,/root/dingbs/tool/emma/vds.ec
6、转换结果:java -cp emma.jar emma report -r html -in /root/dingbs/tool/emma/vds.em,/root/dingbs/tool/emma/vds.ec -Dreport.html.out.file=/root/dinbs/tool/emma/vds.html
监控Java WEB程序
WEB程序部署到Tomcat或者SunOne后,都会将war文件进行解压缩,因此我们监控的为里面的class文件
1、启动emma[root@msspora tool]# java emma instr -m overwrite -ip /root/apache-tomcat-6.0.10/webapps/CMCC/WEB-INF/classes -Dmetadata.out.file=webcmcc.em
2、启动Tomcat,/root/apache-tomcat/bin/startup.sh
3、使用IE进行功能测试
4、收集数据:java emma ctl -connect localhost:47653 -command coverage.get,/root/dingbs/tool/emma/webcmcc.ec
5、转换结果:java -cp emma.jar emma report -r html -in /root/dingbs/tool/emma/webcmcc.em,/root/dingbs/tool/emma/webcmcc.ec -Dreport.html.out.file=/root/dinbs/tool/emma/webcmcc.html
版本3:http://blog.csdn.net/u012245006/article/details/50299337
打开jspxcms_coverage.html,覆盖率的报告是以包、类、方法三级单位组织的。其中红颜色代表该覆盖率未达到满意的覆盖率标准
版本4:
http://lishiguang.iteye.com/blog/1123641
可以怎么用EMMA
On-the-fly 模式
Offline 模式
使用emma基本步骤
1、插装字节码到想要测试覆盖率的文件-> 生成coverage.em 文件
插装操作可以面向 JAR 包、 WAR 包、 WAR 包、类文件和目录
2、按正常的工作流程启动服务器,测试程序。
3、收集覆盖率信息->生成coverage.ec文件
可以在本机收集,也可以从远程机器收集
4、生成覆盖率报告->通过coverage.em 和 coverage.ec文件
Android项目只能使用JaCoCo的离线插桩方式。
为什么?主要是因为Android覆盖率的特殊性:
一般运行在服务器java程序的插桩可以在加载class文件进行,运用java Agent的机制,可以理解成"实时插桩"。JaCoCo提供了自己的Agent,完成插桩的同时,还提供了丰富的dump输出机制,如File,Tcp Server,Tcp Client。覆盖率信息可以通过文件或是Tcp的形式输出。这样外部程序可很方便随时拿到被测程序的覆盖率。
但是Android系统破坏了JaCoCo这种便利性,原因有两个:
(1)Android虚拟机不同与服务器上的JVM,它所支持的字节码必须经过处理支持Android Dalvik等专用虚拟机,所以插桩必须在处理之前完成,即离线插桩模式。
(2)Android虚拟机没有配置JVM 配置项的机制,所以应用启动时没有机会直接配置dump输出方式
行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
类覆盖率:度量计算class类文件是否被执行。
分支覆盖率:度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。
方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
指令覆盖:计数单元是单个java二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全 独立源码格式。
圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。
执行jvm的时候,加上对应的参数javaagent参数,即开启了on-the-fly instrument 方式,在执行程序的时候记录执行的代码覆盖数据。针对于tomcat,我们只需要修改${tomcat.home}/bin/catalina.sh 中的:
To enable Jacoco in Jetty, we need to do the following steps:
Download the Jacoco agent.
The latest version of the Jacoco agent can be downloaded here. In the downloaded jar is another jar, the jacocoagent.jar, which is needed to do online instrumenting of classes.
Enable the Java agent in Jetty.
Once the Jacoco Agent has been downloaded, Jetty needs to be made aware of this. To do this, Jetty needs to be passed the -javaagent parameter. The easiest way to do this is by setting the MAVEN_OPTS environment variable in the following way:
-javaagent:lib/jacocoagent-0.6.3.jar
Alternatively, you can also pass parameters to the -javaagent setting, like this:
-javaagent:lib/jacocoagent-0.6.3.jar=destfile=target/jacoco.exec,append=false,includes=nl.*"