代码覆盖测试
在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或90%。于是乎,测试人员费尽心思设计案例覆盖代码。用代码覆盖率来衡量,有利也有有弊。
1. 基本概念
代码覆盖率 = 代码的覆盖程度,一种度量方式。
1)语句覆盖(StatementCoverage): 又称行覆盖(LineCoverage),段覆盖(SegmentCoverage),基本块覆盖(BasicBlockCoverage),这是最常用也是最常见的一种覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了。
2)判定覆盖(DecisionCoverage): 又称分支覆盖(BranchCoverage),所有边界覆盖(All-EdgesCoverage),基本路径覆盖(BasicPathCoverage),判定路径覆盖(Decision-Decision-Path)。它度量 程序中每一个判定的分支是否都被测试到了。
3)条件覆盖(ConditionCoverage): 度量判定中的每个子表达式结果true和false是否被测试到了。
为了说明判定与条件覆盖的区别,假设被测试代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24int foo(int a, int b)
{
if (a < 10 || b < 10) // 判定
{
return 0; // 分支一
}
else
{
return 1; // 分支二
}
}
```
判定覆盖只需要考虑判断结果为true和false,设计案例如下:
``` java
TestCase1:a=5,b=任意值 //覆盖了分支一
TestCase1:a=15,b=15 //覆盖了分支二
```
条件覆盖只需要考虑每个条件表达式是否被覆盖到,设计案例如下:
``` java
TestCase1:a=5,b=5 //a < 10 = true || b < 10 = true
TestCase1:a=15,b=15 //a < 10 = false || b < 10 = false注:条件覆盖不是将判定中的每个条件表达式的结果进行排列组合,而是只要每个条件表达式的结果true和false测试到。
4)路径覆盖(PathCoverage):又称断言覆盖(PredicateCoverage)。度量是否函数的每一个分支都被执行了。
2. 代码覆盖测试工具
2.1 使用 EclEmma 统计单元测试覆盖率
1)安装EclEmma插件,可以在eclipse的market中进行搜索安装。
2)使用EclEmma测试java程序
鼠标放置在项目上,右键点击找到 Coverage As 选项,选择Junit Test;
执行完成后,可以查看覆盖率和测试结果
备注:可以参考使用 EclEmma 进行覆盖测试该片文件了解其他的一些使用方法。
EclEmma的官方使用手册:EclEmma–Java Code Coverage for Eclipse
2.2 使用 cobertura 统计单元测试覆盖率
cobertura可以很好的结合maven项目,生成html的统计页面。
1)在maven的pom.xml文件中添加cobertura-maven-plugin插件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30<!-- 构建项目站点报告插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.0</version>
<configuration>
<locales>zh_CN</locales> <!-- 配置站点国际化 -->
<outputEncoding>UTF-8</outputEncoding><!-- 输出编码 -->
</configuration>
</plugin>
<!-- 测试覆盖率的报告 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<configuration>
<formats>
<format>html</format>
<format>xml</format>
</formats>
</configuration>
<executions>
<execution>
<id>cobertura-report</id>
<goals>
<goal>cobertura</goal>
</goals>
<phase>test</phase>
</execution>
</executions>
</plugin>使用maven-site-plugin插件,生成的测试覆盖率报告文档会放在 target/site 目录下。
- 2)运行进行覆盖率统计
运行mvn coberura:coberura
运行成功后查看{project_dir}\target\site\coberura\index.html。
备注:cobertura-maven-plugin的相关参数的配置可参考Cobertura Plugin。