如何计算单元测试的覆盖率

一、概念

单元测试的覆盖率有:语句覆盖率(即行覆盖率)、分支覆盖率、条件覆盖率、分支条件覆盖率、路径覆盖率等。

  • 语句覆盖率
    所谓语句就是那些非分支、非判断的语句。
    计算公式:程序执行到的语句总数 / 全部语句的总数

  • 分支覆盖率
    有判定语句的地方都会出现2个分支。
    计算公式:程序执行到的分支总数 / 全部分支总数

  • 条件覆盖率
    分支覆盖率与条件覆盖率有细微差别,条件覆盖率在判定语句的组合上有更细的划分。判定结果为True 或 False即为一个条件,例如: a = 1,依据判定的结果(True 或 False)可作为2个条件。再举个例子,代码如下:

    	public void demo(int aa, int bb) {
    		int a = aa;
    		int b = bb;
    		if (a == 1 && b = 1) {
    			...
    		}
    	}
    

    以上代码中总共有多少个条件呢?a == 1有 True 或 Fasle 2 个条件,b == 1 同样有 True 或 False 2个条件,所以,总共有 4 个条件。

    计算公式:程序执行到的条件总数 / 全部条件总数

  • 分支条件覆盖率
    分支条件覆盖率是根据分支覆盖率和条件覆盖率得出的。
    计算公式:分支覆盖率分子/分母 + 条件覆盖率分子/分母,如:1/4 + 2/6 = 1+2 / 4+6 = 3/10

  • 路径覆盖率
    程序从开始到结束的过程为路径
    计算公式:程序执行的路径数 / 全部路径数

二、计算覆盖率

我们来基于下边的代码段来进行详细的说明,如下:

    public void demo(int aa, int bb) {
        int a = aa; // 语句1
        int b = bb; // 语句2
        
        if (a == 0 && b == 0) {
            System.out.println("a = 0 and b = 0"); // 语句3
        } else if (a == 1 || b == 1) {
            System.out.println("a = 1 or b = 1"); // 语句4
        } else {
            System.out.println("a = " + a+ ", b = " + b); // 语句5
        }
    }

让我们来分别计算下以上的代码段中的语句总数、分支总数、条件总数、路径总数。

  • 语句总数

    总共有 5 条语句

    序号描述
    语句1int a = aa
    语句2int b = bb
    语句3System.out.println(“a = 0 and b = 0”)
    语句4System.out.println(“a = 1 or b = 1”)
    语句5System.out.println("a = " + a+ ", b = " + b)
  • 分支总数

    总共有 4 条分支

    序号描述
    分支1a == 0 && b == 0 判定结果为 True
    分支2a == 0 && b == 0 判定结果为 False
    分支3a == 1 || b == 1 判定结果为 True
    分支4a == 1 || b == 1 判定结果为 False
  • 条件总数

    总共有 8 个条件

    序号描述
    条件1a == 0 判定结果为 True
    条件2a == 0 判定结果为 False
    条件3b == 0 判定结果为 True
    条件4b == 0 判定结果为 False
    条件5a == 1 判定结果为 True
    条件6a == 1 判定结果为 False
    条件7b == 1 判定结果为 True
    条件8b == 1 判定结果为 False
  • 路径总数

    总共有 3 条路径

    序号描述
    路径1a == 0 && b == 0 判定结果为 True
    路径2a == 0 && b == 0 判定结果为 False,a == 1 || b == 1 判定结果为 True
    路径3a == 0 && b == 0 判定结果为 False,a == 1 || b == 1 判定结果为 False

总数都已经统计好了,下边通过两张图例(也是两种情况)来说明,如果计算各个覆盖率。

  1. 入参为 aa = 0、bb = 0
    在这里插入图片描述
    (这里需要纠正一下图中一个错误:路径覆盖率应该是1/3,而不是1/8)
  2. 入参为 aa = 1、bb = 0
    在这里插入图片描述
    (这里需要纠正一下图中一个错误:路径覆盖率应该是1/3,而不是1/8)
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cab5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值