基于三角形问题通过边界值分析和等价类划分进行黑盒测试
等价类划分
输 入 条 件
|
输入三个整数 |
有效等价类 |
无效等价类 |
1、 整数 2、 3个整数 3、 非0整数 4、 正数
|
13、一边为非整数 14、两边为非整数 15、三遍为非整数 16、数字个数小于3 17、数字个数大于3 18、一边为0 19、两边为0 20、三遍为0 21、一边小0 22、两边小于0 23、三边小于0 24、一边大于100 25、两边大于100 26、三边大于100
|
||
输 出 条 件 |
构成不等边三角形 |
5、 a+b>c 6、 a+c>b 7、 b+c>a |
27、a+b<=c 28、b+c<=a 29、c+a<=b |
构成等腰三角形 |
8、 a=b且满足5 9、 b=c且满足7 10、 c=a且满足6 |
|
|
构成等边三角形 |
11、a=b=c |
|
|
不构成三角形 |
12、不满足5,6,7中的一个 |
|
等价类划分测试用例
等价类划分测试用例 |
||||||
测试用例编号 |
等价类条件 |
测试用例 |
预期结果 |
|||
a |
b |
c |
d |
|||
1 |
1,2,3,4,5,6,7 |
2 |
3 |
4 |
|
普通三角形 |
2 |
1,2,3,4,5,6,7,8 |
2 |
2 |
3 |
|
等腰三角形 |
3 |
1,2,3,4,5,6,7,9 |
2 |
3 |
2 |
|
等腰三角形 |
4 |
1,2,3,4,5,6,7,10 |
3 |
2 |
2 |
|
等腰三角形 |
5 |
1,2,3,4,5,6,7,11 |
2 |
2 |
2 |
|
等边三角形 |
6 |
1,2,3,4,12 |
1 |
2 |
3 |
|
不构成三角形 |
7 |
1,2,3,4,5,6,7,13 |
2.1 |
3 |
4 |
|
不构成三角形(未测试) |
8 |
1,2,3,4,5,6,8,14 |
2.1 |
2.1 |
3 |
|
不构成三角形(未测试) |
9 |
1,2,3,4,5,6,9,15 |
2.1 |
2.1 |
2.1 |
|
不构成三角形(未测试) |
10 |
1,3,4,,16 |
2 |
3 |
null |
|
不构成三角形(未测试) |
11 |
1,2,3,17 |
2 |
3 |
4 |
3 |
不构成三角形(未测试) |
12 |
1,2,18 |
0 |
2 |
3 |
|
抛出异常 |
13 |
1,2,19 |
0 |
0 |
2 |
|
抛出异常 |
14 |
1,2,20 |
0 |
0 |
0 |
|
抛出异常 |
15 |
1,2,3,21 |
-1 |
2 |
2 |
|
抛出异常 |
16 |
1,2,3,22 |
-1 |
-2 |
2 |
|
抛出异常 |
17 |
1,2,3,23 |
-2 |
-2 |
-2 |
|
抛出异常 |
18 |
1,2,3,4,24 |
111 |
99 |
99 |
|
抛出异常 |
19 |
1,2,3,4,25 |
111 |
111 |
99 |
|
抛出异常 |
20 |
1,2,3,4,26 |
111 |
111 |
111 |
|
抛出异常 |
21 |
1,2,3,4,27 |
2 |
3 |
5 |
|
不构成三角形 |
22 |
1,2,3,4,28 |
5 |
2 |
3 |
|
不构成三角形 |
23 |
1,2,3,4,29 |
2 |
5 |
3 |
|
不构成三角形 |
一般边界值4n+1
仅考虑有效区间单个变量边界值(一般边界值):用最小值、略高于最小值、正常值、略低于最大值和最大值。
一般边界分析值测试用例 |
|||||
测试用例编号 |
数据列表 |
预期输出 |
|||
a |
b |
c |
|||
1 |
1 |
50 |
50 |
等腰三角形 |
|
2 |
2 |
50 |
50 |
等腰三角形 |
|
3 |
50 |
50 |
50 |
等边三角形 |
|
4 |
99 |
50 |
50 |
等腰三角形 |
|
5 |
100 |
50 |
50 |
不构成三角形 |
|
6 |
50 |
1 |
50 |
等腰三角形 |
|
7 |
50 |
2 |
50 |
等腰三角形 |
|
8 |
50 |
99 |
50 |
等腰三角形 |
|
9 |
50 |
100 |
50 |
不构成三角形 |
|
10 |
50 |
50 |
1 |
等腰三角形 |
|
11 |
50 |
50 |
2 |
等腰三角形 |
|
12 |
50 |
50 |
99 |
等腰三角形 |
|
13 |
50 |
50 |
100 |
不构成三角形 |
健壮边界值6n+1
同时考虑有效区间和无效区间单个变量边界值(健壮边界值):除了最小值、略高于最小值、正常值、略低于最大值、最大值,还要有略超过最大值和略小于最小值的值。
健壮边界分析值测试用例 |
|||||
测试用例编号 |
数据列表 |
预期输出 |
|||
a |
b |
c |
|||
1 |
0 |
50 |
50 |
抛出异常 |
|
2 |
1 |
50 |
50 |
等腰三角形 |
|
3 |
2 |
50 |
50 |
等腰三角形 |
|
4 |
50 |
50 |
50 |
等边三角形 |
|
5 |
99 |
50 |
50 |
等腰三角形 |
|
6 |
100 |
50 |
50 |
不构成三角形 |
|
7 |
101 |
50 |
50 |
抛出异常 |
|
8 |
50 |
0 |
50 |
抛出异常 |
|
9 |
50 |
1 |
50 |
等腰三角形 |
|
10 |
50 |
2 |
50 |
等腰三角形 |
|
11 |
50 |
99 |
50 |
等腰三角形 |
|
12 |
50 |
100 |
50 |
不构成三角形 |
|
13 |
50 |
101 |
50 |
抛出异常 |
|
14 |
50 |
50 |
0 |
抛出异常 |
|
15 |
50 |
50 |
1 |
等腰三角形 |
|
16 |
50 |
50 |
2 |
等腰三角形 |
|
17 |
50 |
50 |
99 |
等腰三角形 |
|
18 |
50 |
50 |
100 |
不构成三角形 |
|
19 |
50 |
50 |
101 |
抛出异常 |
被测试代码
被测试类TriangleProblem.class @Component public class TriangleProblem { public void determine(int a,int b,int c){ if(a<=0||b<=0||c<=0) { throw new IllegalArgumentException("请输入大于0的边长"); } else if (a>100||b>100||c>100) { throw new IllegalArgumentException("请输入小于101的边长"); } else if (a + b >c && a + c >b && b + c >a) {// 判断是否三角形 // 判断三角形类型 if (a == b && b == c && c == a) { System.out.println("等边三角形"); } else if (a == b || a == c || b == c) { System.out.println("等腰三角形"); }else{System.out.println("普通三角形");} } else { System.out.println("非三角形"); } } }
测试代码
测试类 public class TriangleProblemTest { static class TestCase{ int a, b, c; String t; Class<? extends Exception> e; public TestCase(int a,int b,int c,String t) { this.a = a; this.b = b; this.c = c; this.t = t; } TestCase(int a,int b,int c,Class<? extends Exception> e){ this.a = a; this.b = b; this.c = c; this.e = e; } } @ParameterizedTest @MethodSource("valid_equivalence_class") public void valid_equivalence_class(TestCase tc){ TriangleProblem problem = new TriangleProblem(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); System.setOut(new PrintStream(stream)); problem.determine(tc.a,tc.b,tc.c); assertEquals(tc.t , stream.toString().trim()); } static Stream<TestCase> valid_equivalence_class(){ return Stream.of( new TestCase(2,3,4,"普通三角形"), new TestCase(2,2,3,"等腰三角形"), new TestCase(2,3,2,"等腰三角形"), new TestCase(3,2,2,"等腰三角形"), new TestCase(2,2,2,"等边三角形"), new TestCase(1,2,3,"非三角形"), new TestCase(2,3,5,"非三角形"), new TestCase(5,2,3,"非三角形"), new TestCase(2,5,3,"非三角形") ); } @ParameterizedTest @MethodSource("invalid_equivalence_class") public void test_valid_equivalence_class(TestCase tc){ TriangleProblem problem = new TriangleProblem(); assertThrows(tc.e,()->problem.determine(tc.a,tc.b,tc.c)); } static Stream<TestCase> invalid_equivalence_class(){ return Stream.of( new TestCase(0,2,3,IllegalArgumentException.class), new TestCase(0,0,2,IllegalArgumentException.class), new TestCase(0,0,0,IllegalArgumentException.class), new TestCase(-1,2,2,IllegalArgumentException.class), new TestCase(-1,-2,2,IllegalArgumentException.class), new TestCase(-2,-2,2,IllegalArgumentException.class), new TestCase(111,99,99,IllegalArgumentException.class), new TestCase(111,111,99,IllegalArgumentException.class), new TestCase(111,111,111,IllegalArgumentException.class) ); } }