掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测源代码:
1 public class GetData { 2 3 public static char triangle(int a, int b, int c) { 4 if(a<=b+c ||b<=a+c || c<=a+b) 5 { 6 if ((a==b)&& (b==c)&&(c==a)) { 7 return ‘1‘; 8 }else if ((a==b) || (b==c) || (a==c)) { 9 return ‘2‘; 10 }else if (a*a+b*b==c*c || b*b+c*c==a*a || a*a+c*c==b*b) { 11 return ‘3‘; 12 }else { 13 return ‘4‘; 14 } 15 }else 16 { 17 return ‘5‘; 18 } 19 } 20 } 21 22 23 import java.util.Scanner; 24 25 public class Main { 26 static String equaltrianger = "等边三角形"; 27 static String isotrianger = "等腰三角形"; 28 static String comtrianger = "一般三角形"; 29 static String rigtrianger = "直角三角形"; 30 static String sidewrong = "边值不存在"; 31 static String noconstruct = "不构成三角形"; 32 33 public static void main(String[] args) { 34 char resulet = ‘ ‘; 35 System.out.println(" 1 进行三角形判断操作"); 36 System.out.println(" x 退出程序"); 37 38 while(true) 39 { 40 Scanner sc = new Scanner(System.in); 41 String temp =sc.nextLine(); 42 43 switch (temp) 44 { 45 case "1":{ 46 System.out.println("请输入三角形的三条边:"); 47 try { 48 49 Scanner sca = new Scanner(System.in); 50 int a = sca.nextInt(); 51 Scanner scb = new Scanner(System.in); 52 int b = scb.nextInt(); 53 Scanner scc = new Scanner(System.in); 54 int c = scc.nextInt(); 55 if (a<1 || a>100 || b<1 || b>100 || c<1 || c>100) { 56 System.out.println("边值不存在!"); 57 }else { 58 resulet = GetData.triangle(a, b, c); 59 if (resulet == ‘1‘) { 60 System.out.println(equaltrianger); 61 }else if (resulet == ‘2‘) { 62 System.out.println(isotrianger); 63 }else if (resulet == ‘3‘) { 64 System.out.println(rigtrianger); 65 }else if (resulet == ‘4‘) { 66 System.out.println(comtrianger); 67 }else { 68 System.out.println(noconstruct); 69 } 70 } 71 72 System.out.println(" 1 进行三角形判断操作"); 73 System.out.println(" x 退出程序"); 74 break; 75 } catch (Exception e) { 76 System.out.println("请输入正确的边值!"); 77 System.out.println(" 1 进行三角形判断操作"); 78 System.out.println(" x 退出程序"); 79 break; 80 } 81 } 82 83 case "x": 84 System.exit(1); 85 default: 86 System.out.println("请选择正确的操作!") ; 87 } 88 } 89 } 90 }
2)依据覆盖技术,测试用例列表:

DD-路径(只压缩链路经)
| 程序图节点 | DD-路径 | 
| 4 | A | 
| 6 | B | 
| 17 | C | 
| 8 | D | 
| 7 | E | 
| 10 | F | 
| 9 | G | 
| 11 | H | 
| 13 | I | 
| 58 | J | 
(I)语句覆盖:
A-C-J
A-B-E-J
A-B-D-G-J
A-B-D-F-I-J
A-B-D-F-H-J
测试用例:
| 用例ID | 输入值 | 执行路径 | 预期输出 | ||
| a | b | c | result | ||
| 1 | 3 | 1 | 7 | A-C-J | 不构成三角形 | 
| 2 | 3 | 3 | 3 | A-B-E-J | 等边三角形 | 
| 3 | 3 | 1 | 3 | A-B-D-G-J | 等腰三角形 | 
| 4 | 3 | 7 | 5 | A-B-D-F-I-J | 一般三角形 | 
| 5 | 3 | 4 | 5 | A-B-D-F-H-J | 直角三角形 | 
(II)分支覆盖(判断覆盖):
A-C-J
A-B-E-J
A-B-D-G-J
A-B-D-F-I-J
A-B-D-F-H-J
测试用例同语句覆盖测试用例
(III)路径覆盖:
A-C-J
A-B-E-J
A-B-D-G-J
A-B-D-F-I-J
A-B-D-F-H-J
测试用例同语句覆盖测试用例
(IV)条件覆盖:各个条件取真或假的可能至少执行一次
A-B-E-J
A-C-J
A-B-D-G-J
A-B-D-F-H-J
A-B-D-F-I-J
| 编号 | a<=b+c 
 | b<=a+c 
 | c<=a+b 
 | a<=b+c ||b<=a+c || c<=a+b 
 | 覆盖路径 | 
| 1 | F | F | F | F | A-C | 
| 2 | F | F | T | T | A-B | 
| 3 | F | T | F | T | A-B | 
| 4 | F | T | T | T | A-B | 
| 5 | T | T | T | T | A-B | 
| 6 | T | T | F | T | A-B | 
| 7 | T | F | T | T | A-B | 
| 8 | T | F | F | T | A-B | 
| 编号 | a==b 
 | b==c 
 | c==a 
 | (a==b)&& (b==c)&&(c==a) 
 | 覆盖路径 | 
| 9 | F | F | F | F | A-C | 
| 10 | F | F | T | F | A-C | 
| 11 | F | T | F | F | A-C | 
| 12 | F | T | T | F | A-B | 
| 13 | T | T | T | T | A-B | 
| 14 | T | T | F | F | A-C | 
| 15 | T | F | T | F | A-C | 
| 16 | T | F | F | F | A-C | 
| 编号 | a==b 
 | b==c 
 | c==a 
 | (a==b) || (b==c) || (a==c) 
 
 | 覆盖路径 | 
| 17 | F | F | F | F | D-F | 
| 18 | F | F | T | T | D-G | 
| 19 | F | T | F | T | D-G | 
| 20 | F | T | T | T | D-G | 
| 21 | T | T | T | T | D-G | 
| 22 | T | T | F | T | D-G | 
| 23 | T | F | T | T | D-G | 
| 24 | T | F | F | T | D-G | 
| 编号 | a*a+b*b==c*c 
 | b*b+c*c==a*a 
 | a*a+c*c==b*b 
 | a*a+b*b==c*c || b*b+c*c==a*a || a*a+c*c==b*b 
 | 覆盖路径 | 
| 25 | F | F | F | F | F-I | 
| 26 | F | F | T | T | F-H | 
| 27 | F | T | F | T | F-H | 
| 28 | F | T | T | T | F-H | 
| 29 | T | T | T | T | F-H | 
| 30 | T | T | F | T | F-H | 
| 31 | T | F | T | T | F-H | 
| 32 | T | F | F | T | F-H | 
测试用例:
| 用例ID | 输入值 | 执行路径 | 覆盖条件 | 预期输出 | ||
| a | b | c | result | |||
| 1 | 3 | 1 | 7 | A-C-J 
 | 1,9-11,14-16 | 不构成三角形 | 
| 2 | 3 | 3 | 3 | A-B-E-J 
 | 2-8,12,13 | 等边三角形 | 
| 3 | 3 | 1 | 3 | A-B-D-G-J 
 | 2-8,12,13,18-24 | 等腰三角形 | 
| 4 | 3 | 4 | 5 | A-B-D-F-H-J 
 | 2-8,12,13,17,26-32 | 直角三角形 | 
| 5 | 3 | 7 | 5 | A-B-D-F-I-J 
 | 2-8,12,13,17,25 | 一般三角形 | 
3)相应Junit测试脚本、执行结果
package triangle01; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class GetDataTest { @Before public void setUp() throws Exception { } public String change(char c) { switch (c) { case ‘1‘: return "等边三角形"; case ‘2‘: return "等腰三角形"; case ‘3‘: return "直角三角形"; case ‘4‘: return "一般三角形"; case ‘5‘: return "不构成三角形"; default: break; } return null; } //语句覆盖、分支覆盖、路径覆盖 @Test public void test() { String s1 = change(GetData.triangle(3, 4, 5)); assertEquals("直角三角形", s1); String s2 = change(GetData.triangle(3, 7, 5)); assertEquals("一般三角形", s2); String s3 = change(GetData.triangle(3, 1, 7)); assertEquals("不构成三角形", s3); String s4 = change(GetData.triangle(3, 3, 3)); assertEquals("等边三角形", s4); String s5 = change(GetData.triangle(3, 1, 1)); assertEquals("等腰三角形", s5); } }

4)给出测试参数化和打包测试的脚本,并生成执行结果
参数化测试
package triangle01; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Collection; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class GetDataParamTest { private int param1; private int param2; private int param3; private String result; GetData triangle = new GetData(); //把被测代码所返回的字符类型转换为字符串类型 public String change(char c) { switch (c) { case ‘1‘: return "等边三角形"; case ‘2‘: return "等腰三角形"; case ‘3‘: return "直角三角形"; case ‘4‘: return "一般三角形"; case ‘5‘: return "不构成三角形"; default: break; } return null; } @Parameters public static Collection data(){ return Arrays.asList(new Object[][]{ {3, 1, 7,"不构成三角形"}, {3, 3, 3,"等边三角形"}, {3, 1, 3,"等腰三角形"}, {3, 4, 5,"直角三角形"}, {3, 7, 5,"一般三角形"} }); } public GetDataParamTest(int param1,int param2,int param3,String result){ this.param1 = param1; this.param2 = param2; this.param3 = param3; this.result = result; } @Test public void testParam(){ String rs = change(triangle.triangle(param1, param2, param3)); assertEquals(rs,result); } }

打包测试
package triangle01; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses( { GetDataTest.class, GetDataParamTest.class, }) public class AllTriangleTest { }

1、测试找到的缺陷清单:测试代码对“不构成三角形”的判断有错误。
2、修改建议:建议修改对“不构成三角形”的判断。
3、总结: 通过本次实验,我加深了对白盒测试的理解。学会了画控制流图,加深了对白盒测试的基本路径测试方法的理解,能够进一步设计出测试用例。同时,我还学会了Junit脚本的使用方法,包括测试参数化和打包测试。参数化测试,简化了测试,只写一个测试函数,把若干种情况作为参数传递进去,一次性地完成测试。打包测试,将所有需要运行的测试类集中起来,一次性地运行完毕,大大地方便了我们的测试工作。
原文:http://www.cnblogs.com/xwhisper/p/6704207.html