白盒测试之语句分支条件覆盖
本文预览
语句覆盖
基本概念:这是最常用也是最常见的一种覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了。不包括注释、空行。
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