一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
1) 被测原代码
import java.util.Scanner;public class Triangle{ public static void main(String[] args) { while(true){ System.out.println("请输入三角形的三条边:"); try { int a,b,c; Scanner input=new Scanner(System.in); a=input.nextInt(); b=input.nextInt(); c=input.nextInt(); String str=triangle(a,b,c); System.out.println(str); } catch (Exception e) { // TODO: handle exception System.out.println("请确保输入的边为整数!"); } } } public static String triangle(int a,int b,int c){ String result; if ((a>=1&&a<=100)&&(b>=1&&b<=100)&&(c>=1&&c<=100)) { if ((a+b>c)&&(a+c>b)&&(b+c>a)) { if (a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) { if (a==b||a==c||b==c) { result="该三角形为等腰直角三角形."; } else { result="该三角形为直角三角形."; } } else if (a==b&&b==c&&a==c) { result="该三角形为等边三角形."; } else if (a==b||a==c||b==c) { result="该三角形为等腰三角形."; } else { result="该三角形为一般三角形."; } } else { result="不能构成三角形."; } } else { result="不能构成三角形."; } return result; }}
2)依据覆盖技术,测试用例列表:
程序图 DD-路径图
DD-路径(只压缩链路经)
程序图节点 | DD-路径 |
1 | A |
2 | B |
3 | C |
4 | D |
5 | E |
6 | F |
7 | G |
8 | H |
9 | I |
(I)语句覆盖:
A-B-D-I
A-B-C-F-I
A-B-C-E-I
A-B-C-E-G-I
A-B-C-E-G-H-I
测试用例:
用例ID | 输入值 | 执行路径 | 预期输出 | ||
A | B | X | X | ||
1 | 101 | 101 | 101 | A-B-D-I | 边的值不在范围内 |
2 | 3 | 1 | 2 | A-B-C-F-I | 不能构成三角形 |
3 | 3 | 4 | 5 | A-B-C-E-I | 该三角形为直角三角形 |
4 | 6 | 6 | 6 | A-B-C-E-G-I | 该三角形为等边三角形 |
5 | 5 | 5 | 6 | A-B-C-E-G-H-I | 该三角形为等腰三角形 |
6 | 3 | 5 | 6 | A-B-C-E-G-H-I | 该三角形为一般三角形 |
(II)分支覆盖(判断覆盖):
A-B-C-F-I
A-B-C-E-G-H-I
测试用例:
用例ID | 输入值 | 执行路径 | 预期输出 | ||
A | B | X | X | ||
1 | 1 | 0 | 3 | A-B-C-F-I | 不能构成三角形 |
2 | 3 | 4 | 3 | A-B-C-E-G-H-I | 该三角形为等腰三角形 |
(III)路径覆盖:
A-B-D-I
A-B-C-F-I
A-B-C-E-I
A-B-C-E-G-I
A-B-C-E-G-H-I
用例ID | 输入值 | 执行路径 | 预期输出 | ||
A | B | X | X | ||
1 | 101 | 101 | 101 | A-B-D-I | 边的值不在范围内 |
2 | 3 | 1 | 2 | A-B-C-F-I | 不能构成三角形 |
3 | 3 | 4 | 5 | A-B-C-E-I | 该三角形为直角三角形 |
4 | 6 | 6 | 6 | A-B-C-E-G-I | 该三角形为等边三角形 |
5 | 5 | 5 | 6 | A-B-C-E-G-H-I | 该三角形为等腰三角形 |
6 | 3 | 5 | 6 | A-B-C-E-G-H-I | 该三角形为一般三角形 |
(IV)条件覆盖:各个条件取真或假的可能至少执行一次
编号 | (a>=1&&a<=100)&&(b>=1&&b<=100)&&(c>=1&&c<=100) | (a+b>c)&&(a+c>b)&&(b+c>a)
| a*a+b*b==c*c||a*a+c*c==b*b ||b*b+c*c==a*a
| a==b&&b==c&&a==c
| a==b||a==c||b==c
| 覆盖路径 |
1 | T | T | T | T | T | A-B-C-E-G-H-I |
2 | T | T | T | T | F | A-B-C-E-G-H-I |
3 | T | T | T | F |
| A-B-C-E-G-I |
4 | T | T | F |
|
| A-B-C-E-I |
5 | T | F |
|
|
| A-B-C-F-I |
6 | F |
|
|
|
| A-B-D-I |
测试用例:
用例ID | 输入值 | 执行路径 | 覆盖条件 | 预期输出 | ||
1 | 101 | 101 | 101 | A-B-D-I | 1,2 | 边的值不在范围内 |
2 | 1 | 1 | 2 | A-B-C-F-I | 1,2,3 | 不能构成三角形 |
3 | 3 | 4 | 5 | A-B-C-E-I | 1,2,3,5 | 该三角形为直角三角形 |
4 | 5 | 5 | 5 | A-B-C-E-G-I | 1,2,3,5,7 | 该三角形为等边三角形 |
5 | 3 | 5 | 3 | A-B-C-E-G-H-I | 1,2,3,5,7,8 | 该三角形为等腰三角形 |
6 | 3 | 5 | 7 | A-B-C-E-G-H-I | 1,2,3,5,7,8 | 该三角形为一般三角形 |
3)相应Junit测试脚本、执行结果
Junit测试脚本:
import static org.junit.Assert.assertEquals;import org.junit.Before;import org.junit.Test;public class TrangleTest { private static Triangle trangle = new Triangle(); @Before public void setUp() throws Exception { } @Test public void testTriangle01() { assertEquals("该三角形为直角三角形.", Triangle.triangle(3, 4, 5));//1 } @Test public void testTriangle02() { assertEquals("该三角形为等边三角形.", Triangle.triangle(6, 6, 6));//2 } @Test public void testTriangle03() { assertEquals("边的值不在范围内!", Triangle.triangle(150, 150, 200));//3 } @Test public void testTriangle04() { assertEquals("不能构成三角形.", Triangle.triangle(3, 1, 2));//4 } @Test public void testTriangle05() { assertEquals("该三角形为一般三角形.", Triangle.triangle(3, 5, 6));//5 } @Test public void testTriangle06() { assertEquals("该三角形为等腰三角形.", Triangle.triangle(5, 5, 6));//6 } }
测试结果:
4)给出测试参数化和打包测试的脚本,并生成执行结果
import org.junit.Before;import org.junit.runner.RunWith;import org.junit.runners.Suite;@RunWith(Suite.class)@Suite.SuiteClasses({ TrangleTest.class})public class Test { @Before public void setUp() throws Exception { }}
测试结果:
4、测试小结:
- 测试找到的缺陷清单
- 对源代码的修改建议
- 测试总结与心得体会
测试用例都成功通过。
修改建议:应先判断等腰再判断等边三角形,这样逻辑更顺畅;应在代码关键处添加注释。
总结与心得:在我们平常的项目开发中,测试是显得越来越重要。我们很多的时候,必须得测试与开发同步,测试代码和工作代码应同步编译和更新。而junit可以大大减少代码量和文件量,为测试提供了很大的灵活性。所以不要认为压力大,就不写测试代码。相反编写测试代码会使压力逐渐减轻,因为通过编写测试代码地编写出有效率的工作代码。在编写测试用例时要充分覆盖各个路径,以确保每个判断条件都能被执行。