软件测试 第六次作业
任务六:
1、Page70-73页;2、Page74-76拓展案例;
路径覆盖:
3、page78-81;4、拓展案例page81-83
01 使用逻辑覆盖方法设计测试用例
一、逻辑覆盖方法及其种类
- 语句覆盖(SC):设计足够的测试样例,使得被测程序中的每条语句至少执行一次即可。
- 判定覆盖(DC):设计足够的测试样例,使得被测程序中的每个判断的取真分支和取假分支至少经历一次即可。
- 条件覆盖(CC):设计足够的测试样例,使得被测程序中的每个判断中的每个条件的可能取值至少满足一次即可。
- 判断/条件覆盖(CDC):它在条件—判定覆盖的基础上,要求每个条件的true和false两种结果不仅要出现,还要将条件的结果进行排列组合式地出现。
- 条件组合覆盖(MCC):它在条件—判定覆盖的基础上,要求每个条件的true和false两种结果不仅要出现,还要将条件的结果进行排列组合式地出现。
二、流程图的绘制
有一段JAVA程序代码:
/*程序功能:输入两个两位数(10~99)整数,计算他们的和并输出*/
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
int a, b, c; // 定义三个整型变量
Scanner input = new Scanner(System.in); // 创建Scanner对象,用于数据输入
System.out.println("请输入一个10-99之间的整数:");
a = input.nextInt();
System.out.println("请再输入一个10-99之间的整数:");
b = input.nextInt();
if (a<10||a>99){ //变量取值范围判断
System.out.println("a 的值应该在10-99之间");
} else if (b<10||b>99) {
System.out.println("b 的值应该在10-99之间");
}else {
c=a+b;
System.out.println("两个数的和为"+c);
}
}
}
在程序流程图中,使用圆角矩形表示开始和结束,矩形表示数据处理,平行四边形表示数据的输入和输出,菱形表示判断,同时用带箭头的线段表示程序的流向。
流程图如下:
02 案例实现 Page70-73页
有一段java代码使用白盒测试的逻辑覆盖方法设计测试用例
if (a>1&&b==0){
x=x/a;
}
if (a==2||x>1){
x=x+1;
}
程序流程图
案例实现
1.语句覆盖测试用例
用例编号 | 输入数据 | 预期结果 | 备注(执行路径) |
1 | a=2,b=0,x=2 | x=2 | P1-P2-P3-P4-P5 |
2.判断覆盖测试用例
用例编号 | 输入数据 | 预期结果 | 备注(执行路径) |
001 | a=3,b=0,x=3 | x=1 | TF |
002 | a=2,b=1,x=1 | x=2 | FT |
3.条件覆盖测试用例
测试用例1:
测试用例2:
4.判断/条件覆盖测试用例
5.条件组合覆盖测试用例
03 Page74-76拓展案例
有一段java程序段,请使用白盒测试的逻辑覆盖方法为其设计测试用例。
if (x >= 80 && y >= 80) {
t = 1;
} else if (x + y >= 140 && (x >= 90 || y >= 90)) {
t = 2
} else {
t = 3
}
解答
程序流程图
案例实现
1.语句覆盖测试用例
用例编号 | 输入数据 | 预期结果 | 备注(执行路径) |
001 | x=90,y=90 | t=1 | P1-P2-P6 |
002 | x=90,y=70 | t=2 | P1-P3-P4-P6 |
003 | x=50,y=50 | t=3 | P1-P3-P5-P6 |
2.判断覆盖测试用例
用例编号 | 输入数据 | 预期结果 | 备注(执行路径) |
001 | x=90,y=90 | t=1 | T |
002 | x=50,y=100 | t=2 | FT |
003 | x=75,y=75 | t=3 | FF |
3.条件覆盖测试用例
4.判断/条件覆盖测试用例
5.条件组合覆盖测试用例
04 使用基本路径法设计测试用例 page78-81
基本路径法步骤
1.绘制控制流图
控制流图:只有圆圈和箭头两种图像符号。每一个圆圈成为节点,代表一条或多条无分支语句;箭头称为边或连接,代表控制流
包含条件的节点成为判定节点,由判定节点出发的边必须终止于某个节点,由边和节点所锁定的范围称为区域。
控制流基本符号示意图:
先将流程图转换为程序控制流图,例:
有程序流程图:
转换为程序流图为:
2.计算圈复杂度
圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。
有以下三种方法计算圈复杂度:
- 流图中封闭的区域数量+1个开放区域;
- 给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量;
- 给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点的数量。
本例中圈复杂度为4
3.写出独立路径
独立路径必须包含一条在定义之前不曾用到的边。程序圈复杂度等于该程序基本路径集合中的独立路径条数
可写出独立路径:
- ①-⑤
- ①-②-③-⑤
- ①-②-④-⑥-⑧-①-⑤
- ①-②-④-⑦-⑧-①-⑤
4.准备测试用例
05 案例实践 page79-81
案例描述
使用基本路径法设计出的测试用例能够保证程序的每一条可执行语句在测试过程中至少执行一次。以下代码由JAVA书写,请使用白盒测试的基本路径法为其设计测试用例。
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
int a, b, c,max,min; // 定义三个整型变量
Scanner input = new Scanner(System.in); // 创建Scanner对象,用于数据输入
System.out.println("请输入三个整数:");
a = input.nextInt();
b = input.nextInt();
c = input.nextInt();
System.out.println(a+"\t"+b+"\t"+c+"\t");
if (a >b) { //变量取值范围判断
max=a;
min=b;
} else {
max=b;
min=a;
}
if (max<c){
max=c;
}else if (min>c){
min=c;
}
System.out.println("max="+max+"\nmin="+min); // 输出最大值最小值
}
}
案例实现
1.绘制程序流程图和控制流图
程序流程图:
程序控制流图:
2.计算圈复杂度
V(G)=总区域数=(流图中的边数-节点数+2)=(流图中的判定节点数+1)=4
通过三种方法得知圈复杂度为4
3.写出独立路径
①:1-2-4-5-8
②:1-3-4-5-8
③:1-3-4-6-8
④:1-3-4-6-7-8
4.设计测试用例
用例编号 | 测试步骤 | 输入数据 | 期望结果 | 备注(执行路径) |
001 | 输入三个整数 | a=2,b=1,c=3 | max=3.min=1 | 1-2-4-5-8 |
002 | 输入三个整数 | a=1,b=2,c=3 | max=3.min=1 | 1-3-4-5-8 |
003 | 输入三个整数 | a=2,b=3,c=1 | max=3.min=1 | 1-3-4-6-8 |
004 | 输入三个整数 | a=1,b=3,c=2 | max=3.min=1 | 1-3-4-6-7-8 |
06 拓展案例page81-83
案例描述
使用基本路径法设计出的测试用例能够保证程序的每一条可执行语句在测试过程中至少执行一次。以下代码由JAVA书写,请使用白盒测试的基本路径法为其设计测试用例。
int isLeap(int year)
{
if(year %4 == 0){ //判断闰年的程序
if(year %100 = 0){
if(year %400 == 0)
leap = 1; //leap变量标记,1为闰年,0为平年
else
leap = 0;
}
else
leap = 1;
}
else
leap = 0;
return leap;
}
案例实现
1.绘制程序流程图和控制流图
程序流程图:
程序控制流图:
2.计算圈复杂度
V(G)=总区域数=(流图中的边数-节点数+2)=(流图中的判定节点数+1)=4
3.写出独立路径
① 1-2-3-4-8
② 1-2-3-5-8
③ 1-2-6-8
④ 1-7-8
4.设计测试用例
用例编号 | 输入数据 | 期望结果 | 备注(执行路径) |
001 | year=2000 | leap=1 | 1-2-3-4-8 |
002 | year=1900 | leap=0 | 1-2-3-5-8 |
003 | year=1004 | leap=1 | 1-2-6-8 |
004 | year=1001 | leap=0 | 1-7-8 |