code-coverage - 单元测试代码覆盖率

代码覆盖测试

在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到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
    24
    	int foo(int a, int b)
    {

    if (a < 10 || b < 10) // 判定
    {
    return 0; // 分支一
    }
    else
    {
    return 1; // 分支二
    }
    }
    ```

    判定覆盖只需要考虑判断结果为truefalse,设计案例如下:
    ``` 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中进行搜索安装。

    安装EclEmma插件
  • 2)使用EclEmma测试java程序
    鼠标放置在项目上,右键点击找到 Coverage As 选项,选择Junit Test;

    右键点击找到 Coverage As 选项

执行完成后,可以查看覆盖率和测试结果
查看覆盖测试结果

备注:可以参考使用 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