一、实验目的
1、掌握 Junit4.x 进行单元测试
2、掌握 Junit4.x 编写测试代码方法
3、结合三角形案例源代码,逻辑覆盖法进行动态白盒测试。
二、实验环境
操作系统:Windows 7 或 Win10
应用系统:Idea 以上版本或 MyEclipse
三、实验任务
1、根据问题描述,分析控制要求。
2、学习等价类划分方法,用等价类法设计测试用例。
四、实验步骤
1、被测函数源代码。
import java.util.Scanner;
public class Rjcs {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);//接受键盘输入a,b,c
System.out.println("请输入a的值");
int a = sc.nextInt();
System.out.println("请输入b的值");
int b = sc.nextInt();
System.out.println("请输入c的值");
int c = sc.nextInt();
if(a>=1 &&a<=200) {
if(b>=1 && b<=200) {
if(c>=1&&c<=200) {
test(a,b,c);
}else {
System.out.println("c的值不合规!");
}
}else {
System.out.println("b的值不合规!");
}
}else {
System.out.println("a的值不合规!");
}
}
//判断三角形类型
public static void test(int a,int b,int c){
boolean pd = false;
if((a+b>c)&&(a+c>b)&&(b+c>a)){
if((a==b)&&(b==c)) {
System.out.println("等边三角形");
}else if((a==b)||(b==c)||(a==c)) {
System.out.println("等腰三角形");
}else {
System.out.println("一般三角形");
}
}else {
System.out.println("不能构成三角形");
}
}
}
2、请根据函数源代码设计三角形问题的函数控制流程图。
(1)带注释的Main()控制流图
图 5.1 三角形问题函数 main () 的控制流程图
(2)带注释的test()控制流图
图 5.2三角形问题函 test () 的制流程图
3、三角形问题函数源代码共有多少个判定条件,请逐一列出
(1)两个函数流程图
图 5.3 main()和 test()函数的流程图
(2)列出判定条件
表 5.1 三角形判定条件
ID | 判定条件 | 备注 |
S-001 | 1<=a<=100 | a边长取值范围 |
S-002 | 1<=b<=100 | b边长取值范围 |
S-003 | 1<=c<=100 | c边长取值范围 |
S-004 | (a+b+c)&&(a+c>b)&&(b+c>a) | 三角形构成条件 |
S-005 | (a==b)&&(b==c) | 等边三角形 |
S-006 | (a==b)||(b==c)||(a==c) | 等腰三角形 |
S-007 | 其他情况(a≠b≠c) | 一般三角形 |
注释:三角形三边长分别为:a、b、c……
五、逻辑覆盖方法设计测试用例
1、语句覆盖法设计测试用例(main()函数)
表 5.2 main 函数语句覆盖法设计的测试用例
ID | 输入项 | 预期输出 | 通过路径 | 语句覆盖 | ||
a | b | c | A/B/C或X不合规 | L-abcd | xx% | |
LC-001 | 0 | 10 | 15 | A | M-L1 | 25% |
LC-002 | 10 | 0 | 15 | B | M-L2 | 25% |
LC-003 | 10 | 15 | 0 | C | M-L3 | 25% |
LC-004 | 10 | 15 | 20 | D | M-L4 | 25% |
注:预期输出/测试结果取值为:
A: a 值不合理;B: b 值不合理;c: c 值不合理;D:a,b,c 取值合理
2、语句覆盖法设计测试用例(test()函数)
表 5.3 test 函数语句覆盖法设计的测试用例
ID | 输入项 | 预期输出 | 通过路径 | 语句覆盖 | ||
a | b | c | A/B/C或X不合规 | T | xx% | |
LC-001 | 10 | 15 | 25 | D | T-L1 | 25% |
LC-002 | 10 | 10 | 10 | A | T-L2 | 25% |
LC-003 | 10 | 10 | 15 | B | T-L3 | 25% |
LC-004 | 10 | 15 | 20 | C | T-L4 | 25% |
注:预期输出/测试结果取值为:
A: 等边三角形:B:等腰三角形;c:一般三角形;D:不构成三角形:x:X 不合规定,如:a 不合规定。
3、判定覆盖法设计测试用例
(1) 针对 main () 函数进行判定覆盖法进行测试用例设计
(2) 由 main()函数可知有三个判定条件构成: T1: 1Sas100;T2: SbS100:T3: 1≤c<100:
表 5.3 main0函数的判定覆盖法设计测试用例
ID | 输入项 | 预期输出 | 判定覆盖 | 语句覆盖 | ||
a | b | c | A/B/C或X不合规 | xx% | xx% | |
PD-001 | 0 | 15 | 20 | A | 25% | 100% |
PD-002 | 10 | 0 | 20 | B | 25% | |
PD-003 | 10 | 15 | 0 | C | 25% | |
PD-004 | 10 | 15 | 20 | D | 25% | |
注:A: a 值不合理:B: b 值不合理;C:c 值不合理;D: a,b,c 取值合理。
3、main()函数条件覆盖设计测试用例,要求语句覆盖率 100%(白盒)
条件覆盖: 每个复合判定表达式中,每个简单判定条件的取真、取假情况至少执行一次1Sa≤100,包括两个邻域,所以a取[假,真,假》; 同理 b,c。
判定覆盖:程序中每个判定节点的取真和取假分支至少执行一次。同“条件覆盖”的道理,1≤a≤100 包括两个判定节点,所以一个节点包括两组判定覆盖,所以 a取(假,真,假).同理 b,c。
表 5.3 条件覆盖法设计的测试用例main()函数
ID | 输入项 | 预期输出 | 判断条件 | 通过路径 | 条件覆盖 | 判定覆盖 | ||||
a | b | c | A/B/C | T1 | T2 | T3 | M1... | XX% | XX% | |
TJ-01 | 45 | 50 | 60 | D | T | T | T | M_L4 | 100%: TJ-01 TJ-02 TJ-03 TJ-04 TJ-05 TJ-06 TJ-07 TJ-08 TJ-09 | 100%: TJ-01 TJ-02 TJ-03 TJ-04 TJ-05 TJ-06 TJ-07 TJ-08 TJ-09 |
TJ-02 | 0 | 50 | 60 | A | F | T | T | M_L1 | ||
TJ-03 | 101 | 50 | 60 | D | F | T | T | M_L1 | ||
TJ-04 | 50 | 45 | 60 | D | T | T | T | M_L4 | ||
TJ-05 | 50 | 0 | 60 | A | T | F | T | M_L2 | ||
TJ-06 | 50 | 101 | 60 | D | T | F | T | M_L2 | ||
TJ-07 | 50 | 60 | 45 | D | T | T | T | M_L4 | ||
TJ-08 | 50 | 60 | 0 | D | T | T | F | M_L3 | ||
TJ-09 | 50 | 60 | 101 | D | T | T | F | M_L3 | ||
TJ-10 | 5 | 50 | 60 | D | T | T | T | M_L4 | 冗余 | 冗余 |
TJ-11 | 50 | 5 | 60 | D | T | T | T | M_L4 | 冗余 | 冗余 |
TJ-12 | 50 | 60 | 0 | D | T | T | T | M_L4 | 冗余 | 冗余 |
注:
① A:a值不合规;B:b 值不合规,C: c 值不合规;D: 执行 Test ();
② T1: 1<a<100; T2: 1<b<100; T3: 1<c<100;
思考:
① TJ-01 与 TJ-10 能否在“条件覆盖”和“判定覆盖”的前提下互换? 同理,讨论TJ-11 与TJ-04:
答: main0函数只关注三个边长的取值范围,在互换的条件下,程序运行的路径不会发生变化,所以等够等价互换(互为冗余)
4、Test()函数条件覆盖设计测试用例,要求语句覆盖率 100% (白盒)
条件覆盖: 每个复合判定表达式中,每个简单判定条件的取真、取假情况至少执行一次a+b>c;a+c>b;b+c>a.
判定覆盖:程序中每个判定节点的取真和取假分支至少执行一次
表 5.4 条件覆盖法设计的测试用例(Test()函数)
ID | 输入项 | 预期输出 | 判断条件 | 通过路径 | 条件覆盖 | 判定覆盖 | ||||
a | b | c | T1 | T2 | T3 | M1... | XX% | XX% | ||
TJ-01 | 10 | 25 | 40 | D | N | Tx | Tx | T_L1 | 100% | 100% |
TJ-02 | 25 | 25 | 25 | A | Y | Y | Tx | T_L2 | ||
TJ-03 | 25 | 25 | 30 | B | Y | N | Y | T_L3 | ||
TJ-04 | 25 | 35 | 45 | C | Y | N | Y | T_L4 | ||
TJ-05 | ||||||||||
TJ-06 | 25 | 30 | 25 | B | Y | N | N | T_L3 | ||
TJ-07 | 30 | 25 | 25 | B | Y | N | Y | T_L3 | ||
TJ-08 | 25 | 10 | 40 | D | N | Tx | Tx | T_L1 | ||
TJ-09 | 25 | 40 | 10 | D | N | Tx | Tx | T_L1 |
注: 1、运行 Test() 的前提是 a,b,c 取值都在范围内
2、预期输出:A:等边三角形:B:等腰三角形:C:一般三角形:D:不构成三角形
3、判断条件如下;
① 构成三角形: T1: atb>c 且 atcb 且 c+b>a;
② 等边三角形:T2: a=b=c;
③ 等腰三角形: T3: a=b 或 a=c 或 b=c;
④ 一般三角形: T4: a头b≠c;
⑤ Tx:任意取值或取不到的值