细讲测试覆盖率

试覆盖率

测试覆盖率一般被用来衡量测试的充分性和完整性,从广义的角度来说,测试覆盖率主要分为两大类,一类是面向项目的需求覆盖率,另外一类是更偏向技术的代码覆盖率。
html

需求覆盖率

需求覆盖率是指测试对需求的覆盖程度,一般的作法是将每一条分解后的软件需求和对应的测试创建一对多的映射关系,最终目标是保证测试能够覆盖每一个需求,以保证软件产品的质量。咱们一般采用 ALM,Doors 和 TestLink 等需求管理工具来创建需求和测试的对应关系,并以此计算测试覆盖率java

代码覆盖率是指,至少被执行了一次的条目数占整个条目数的百分比app

三种覆盖率指标


三种代码覆盖率指标maven

行覆盖率又称为语句覆盖率,指已经被执行到的语句占总可执行语句(不包含相似 C++ 的头文件声明、代码注释、空行等等)的百分比。这是最经常使用也是要求最低的覆盖率指标。实际项目中一般会结合断定覆盖率或者条件覆盖率一块儿使用。ide

断定覆盖又称分支覆盖,用以度量程序中每个断定的分支是否都被测试到了,即代码中每一个判断的取真分支和取假分支是否各被覆盖至少各一次。好比,对于 if(a>0 && b>0),就要求覆盖“a>0 && b>0”为 TURE 和 FALSE 各一次工具

条件覆盖是指,断定中的每一个条件的可能取值至少知足一次,度量断定中的每一个条件的结果 TRUE 和 FALSE 是否都被测试到了。好比,对于 if(a>0 && b>0),就要求“a>0”取 TRUE 和 FALSE 各一次,同时要求“b>0”取 TRUE 和 FALSE 各一次测试

统计代码覆盖率的根本目的是找出潜在的遗漏测试用例,并有针对性的进行补充,同时还能够识别出代码中那些因为需求变动等缘由形成的不可达的废弃代码。this

JaCoCo 是一款 Java 代码的主流开源覆盖率工具,能够很方便地嵌入到 Ant、Maven 中,而且和不少主流的持续集成工具以及代码静态检查工具,好比 Jekins 和 Sonar 等,都有很好的集成。spa

JaCoCo 的总体代码覆盖率统计报告(target/site/jacoco/index.html 给出了每一个 Java 代码文件的行覆盖率以及分支覆盖率统计,并给出了每一个 Java 代码文件的行数、方法数和类数等具体信息插件

每一个 Java 文件内部详细的代码覆盖率状况,绿色的行表示已经被覆盖,红色的行表示还没有被覆盖,黄色的行表示部分覆盖;左侧绿色菱形块表示该分支已经被彻底覆盖、黄色菱形块表示该分支仅被部分覆盖。(GCC Coverage、JSCoverage 和 Istanbul 等?

引入JACOCO实战


Maven Configuration

#引入maven pom文件中#In order to get up and running with JaCoCo, we need to declare this maven plugin in our pom.xml file:
<plugin>    <groupId>org.jacoco</groupId>    <artifactId>jacoco-maven-plugin</artifactId>    <version>0.7.7.201606060606</version>    <executions>        <execution>            <goals>                <goal>prepare-agent</goal>            </goals>        </execution>        <execution>            <id>report</id>            <phase>prepare-package</phase>            <goals>                <goal>report</goal>            </goals>        </execution>    </executions></plugin>#The link provided here-before will always lead you to the latest version of the plugin in the maven central repository.
public boolean isPalindrome(String inputString) {    if (inputString.length() == 0) {        return true;    } else {        char firstChar = inputString.charAt(0);        char lastChar = inputString.charAt(inputString.length() - 1);        String mid = inputString.substring(1, inputString.length() - 1);        return (firstChar == lastChar) && isPalindrome(mid);    }}
@Testpublic void whenEmptyString_thenAccept() {    Palindrome palindromeTester = new Palindrome();    assertTrue(palindromeTester.isPalindrome(""));}

使用JUnit运行测试将自动启动JaCoCo代理,所以,它将在目标目录target / jacoco.exec中以二进制格式建立覆盖报告。

显然,咱们没法单手解释输出,可是其余工具和插件能够–例如Sonar Qube

好消息是,咱们可使用jacoco:report目标来生成多种格式的可读代码覆盖率报告,例如HTML,CSV和XML。

如今,咱们能够在target / site / jacoco / index.html页面上查看示例,以查看生成的报告是什么样的:

图片

经过报告中提供的连接– Palindrome.java,咱们能够深刻了解每一个Java类的详细视图

图片

报告分析咱们的报告显示21%的指令覆盖率,17%的分支覆盖率,3/5的圈复杂度等等。


JaCoCo在报告中显示的38条指令是与普通Java代码指令相反的字节码指令。

JaCoCo报告可经过使用菱形,分支颜色和背景色做为行来帮助您直观地分析代码覆盖率:

  • 红色菱形表示在测试阶段未行使任何分支。

  • 黄色菱形表示该代码已被部分掩盖–某些分支还没有行使。

  • 绿色菱形表示在测试过程当中全部分支均已行使。

相同的颜色代码适用于背景色,但适用于线条覆盖率。

JaCoCo主要提供三个重要指标:

  • 行覆盖率反映了根据测试调用的Java字节代码指令的数量执行的代码量。

  • 分支覆盖率显示了代码中已执行分支的百分比-一般与if / else和switch语句相关。

  • 循环复杂度经过线性组合给出覆盖代码中全部可能路径所需的路径数,从而反映了代码的复杂度。

举一个简单的例子,若是代码中没有if或switch语句,则循环复杂度将为1,由于咱们只须要一条执行路径便可覆盖整个代码。

一般,圈复杂度反映了咱们为了覆盖整个代码而须要实现的测试用例的数量。

参考连接https://www.baeldung.com/jacoco

##PS:今天宝宝作三维照相,第一次看到宝宝,so happy,感受什么都是值得的。

相关文章
相关标签/搜索