白盒测试之语句分支条件覆盖

白盒测试之语句分支条件覆盖

本文预览

在这里插入图片描述

语句覆盖

基本概念:这是最常用也是最常见的一种覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了。不包括注释、空行。

  public static void main(String[] args) {
       1 Scanner scanner = new Scanner(System.in);
       2 while (scanner.hasNextInt()){
            3 int i = scanner.nextInt();
            4 if(i>=0){
                5 i+=1;
            }else{
                6 i-=1;
            }
            7 System.out.println(i);
        }
    }

在遇到复杂的结构时,先画出程序流程图,再画出数据流图,进行分析。

在这里插入图片描述

测试用例:
在这里插入图片描述

注意,这里我分别用红色和黑色对覆盖语句进行了标注,红色是我原先的理解,相信很多人都认为既然是语句覆盖,那每一行都是一条语句,所以不应该是我用红色去标注的形式吗?但其实,根据网上查找的并且结合老师给出的答案,我原先的理解是错误的。
相对正确的理解应该是:if-else语句算作一整条语句,所以我们可以忽略if-else所在行,另外,怎样才能算作覆盖了if-else语句呢,在语句覆盖这个范畴,只需覆盖一个分支内的语句就算覆盖了if-else语句。

分支覆盖

基本概念:分支覆盖,又称判定覆盖,是指使得程序中每个判断的取真分支和取假分支至少经历一次,即判断的真假均曾被满足。
继续用上个小程序进行分析。

在这里插入图片描述

注意,覆盖的分支率一定不可以约分。1/2怎么的来的呢?1代表当前覆盖了一条语句,2代表这个程序一共有两个分支。

条件覆盖

条件覆盖是指设计足够多的测试用例,运行被测程序,使得每一判定语句中每个逻辑条件的可能取值至少满足一次。
条件覆盖率=被评价到的条件取值的数量/条件取值的总数*100%

 public static void main(String[] args) {
        1 System.out.println("请输入你的用户名");
        2 Scanner scanner = new Scanner(System.in);
        3 String username = scanner.nextLine();
        4 System.out.println("请输入你的密码");
        5 String password = scanner.nextLine();
        6 if(username.equals("Dennis")&&password.equals("1")){
        7     System.out.println("登陆成功");
        8 }else{
        9     System.out.println("登录失败");
        10 }
    }

分析这个程序,其实不像计算语句覆盖那样复杂,条件覆盖只需要找到条件语句即可,然后分析一共会产生几个条件,比如if语句应该能产生四个条件,username为Dennis,username不为Dennis,password为1,password不为1时这四个条件,所以设计条件覆盖测试用例也应该从这四个出发。

在这里插入图片描述

这里注意第3条测试用例的条件覆盖率,发现出什么不同?

这条数据的特点在于由于是&&所以如果第一个判断条件值为false那么之后无论输入什么都是没有意义的,直接输出登录失败,因此,这条数据只覆盖了username不为Dennis这一个条件,总条件数为4,因此,条件覆盖率为1/4。懂了吗?这也是我上课不明白的地方。另外4不是语句数,而是总条件数。

练习:

public static void main(String[] args) {
        1 System.out.println("请输入第一个整数");
        2 Scanner scanner = new Scanner(System.in);
        3 int first = scanner.nextInt();
        4 System.out.println("请输入第二个整数");
        5 int second = scanner.nextInt();
        6 if((first>5)&&(second<5)){
        7     System.out.println("first>5 and second<5");
        8 }else if((first==5)||(second<10)){
        9     System.out.println("first=5 or second<10");
        10 }else{
        11     System.out.println("first!=5 and second >= 10");
        12 }
    }
语句覆盖

在这里插入图片描述

这个是结合了语句的正确理解做出的语句覆盖的测试用例。大家一定注意到了我标注灰色的部分,这个如果加上之后就成为了冗余数据,因为它和2的效果是一样的。它虽然覆盖了第9条语句,但是不是会发现第2条测试用例和灰色的测试用例原因是不同的呢?(虽然结果一样)

我想,这就是语句覆盖的局限性。你的测试用例并没有涵盖各种情况,只是在表面上覆盖了整个语句。另外一个局限性在于你只要覆盖了if-else的其中一种情况,就算覆盖了整个if-else语句,如下图也是一个语句覆盖用例。

在这里插入图片描述

想问为什么?因为语句覆盖了if-else啊,所以明白了它的局限性了吧?

分支覆盖

其实,我们已经做完了分支覆盖的工作,在哪儿呢,不就是语句覆盖的第一个图吗,只不过,我真的搞混了,语句覆盖和分支覆盖,其实他俩的唯一区别在于,分支覆盖在语句覆盖的基础上把每个分支的可能性都算上了,上图,你就会理解了。
在这里插入图片描述

条件覆盖

这个程序中,一共有8个条件,因此我们在设计测试用例的时候,要完全考虑这些条件。
在这里插入图片描述

这个左边是将所有的语句进行分类,右边是对重复的条件进行简化,我们使用右边的这些条件。
在这里插入图片描述

覆盖条件是为了方便读者看的,实际可以不加,这是我想到的所有的条件覆盖测试用例,可能不全。我也在思考怎样想能够全一些,所以这可能是条件覆盖的一个缺点,测试用例不像语句 分支那样好写,但任何条件情况都覆盖到了。

条件分支覆盖

用登录的程序进行演示:
条件分支覆盖率的计算方法:分支覆盖与条件覆盖的分母分子分别相加,得到的分数不约分。
在这里插入图片描述

引用
https://www.cnblogs.com/ITGirl00/p/3858357.html

https://blog.csdn.net/zzzmmmkkk/article/details/4288980

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值