代码覆盖率

1 概述

以下定义摘自百度百科

代码覆盖是软件测试的一种度量,描述程式中源代码被测试的比例和程度,所得比例称为代码覆盖率

代码覆盖率反映测试用例对代码的覆盖程度,一定程度上也反映出测试人员的工作进展

结合未覆盖的语句、条件判断等,可以反过来指导测试用例编写

不过要清楚,即使路径/条件覆盖率达到100%,也并不能说明程序质量是OK的,因为业务逻辑是否实现,以及如何实现,包括一些临界值、异常场景等都需要考量

2 POM配置

添加surefire插件,并配置几个参数即可


    
        org.apache.maven.plugins
        maven-surefire-plugin
        3.0.0-M1
        
            
                src/test/resources/testng.xml
            
            true
            -Dcoverage-metrics=all
        
    

3 实战

先看下覆盖率报告,着重看2个指标:

  • 行覆盖率
  • 路径覆盖率
代码覆盖率_第1张图片
1542181168550.png
代码覆盖率_第2张图片
1542181191392.png

测试代码如下:

public class App {
    final int DEV = 1;
    final int TES = 2;
    final int PM = 3;

    public String hello(int type) {
        if (type != DEV) {
            if (type != TES) {
                if (type != PM) {
                    throw new IllegalArgumentException();
                }
            }
        }

        switch (type) {
            case DEV:
                return "Hello developer";
            case TES:
                return "Hello tester";
            case PM:
                return "Hello product manager";
            default:
                return "Hello stranger";
        }
    }

    public List sayHellos(int[] types) {
        List result = new ArrayList<>();

        for(int type: types) {
            result.add(hello(type));
        }
        return result;
    }
}

public class App2 {
    public String say(String name) {
        return "Hello " + name;
    }
}
public class AppTest {
    private App app;

    @BeforeClass
    public void setup() {
        app = new App();
    }

    @Test
    public void testHello() {
        String actual = app.hello(2);
        Assert.assertEquals(actual, "Hello tester");
    }

    @Test
    public void testSayHellos() {
        int[] types = {2, 3, 1};
        List result = app.sayHellos(types);
        Assert.assertTrue(result.get(0).equals("Hello tester"));
        Assert.assertTrue(result.get(1).equals("Hello product manager"));
    }
}

4 补充

行覆盖率,指测试代码执行的行数 / 代码全部的行数,对于IF语句内的组合判断,会拆作单个条件的判断

路径覆盖率,主要针对IF语句,FOR语句也存在判断(是否在集合中);多处IF判断,将执行迪卡尔乘积,比如hello方法,IF的3个条件 * SWITCH的4个条件 + 一个异常 = 13,即可能的路径有13条

报告中,左侧黄色数字表示行执行次数,0表示该行未覆盖;绿色表示已覆盖,红色表示未覆盖;Path coverage显示路径覆盖比,点击每条路径,会以虚线形式圈出执行代码

你可能感兴趣的:(代码覆盖率)