一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
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可以大大减少代码量和文件量,为测试提供了很大的灵活性。所以不要认为压力大,就不写测试代码。相反编写测试代码会使压力逐渐减轻,因为通过编写测试代码地编写出有效率的工作代码。在编写测试用例时要充分覆盖各个路径,以确保每个判断条件都能被执行。
时间: 2024-10-17 19:05:26