被测代码:
一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测原代码
import java.util.Scanner; public class homeWork01 { public static String triangle(int a,int b,int c){ if(a>=1&&a<=100&&b>=1&&b<=100&&c>=1&&c<=100){ if((a<b+c)&&(b<a+c)&&(c<a+b)){ if(a==b&&b==c){ return "等边三角形"; } if(a==b||a==c||b==c){ return "等腰三角形"; } if(a*a==b*b+c*c||b*b==a*a+c*c||c*c==a*a+b*b){ return"直角三角形"; } return "一般三角形"; }else{ return"不构成三角形"; } }else{ return "边的值不在范围内"; } } public static void main(String []args){ System.out.println("请输入三角形的三条边:"); int s1=0; int s2=0; int s3=0; Scanner scan=new Scanner(System.in); s1=scan.nextInt(); s2=scan.nextInt(); s3=scan.nextInt(); System.out.println(triangle(s1,s2,s3)); } }
2)依据覆盖技术,测试用例列表:
1.语句覆盖
路径:
A-B-D-M
A-B-C-F-M
A-B-C-E-H-M
A-B-C-R-G-J-M
A-B-C-E-G-I-L-M
A-B-C-E-G-I-K-M
测试用例:
编号 | 输入值 | 执行路径 | 预期输出 | 实际输出 | ||
a | b | c | ||||
1 | 0 | 3 | 4 | A-B-D-M | 边的值不在范围内 | 边的值不在范围内 |
2 | 1 | 2 | 1 | A-B-C-F-M | 不构成三角形 | 不构成三角形 |
3 | 6 | 6 | 6 | A-B-C-E-H-M | 等边三角形 | 等边三角形 |
4 | 3 | 3 | 4 | A-B-C-R-G-J-M | 等腰三角形 | 等腰三角形 |
5 | 3 | 4 | 5 | A-B-C-E-G-I-L-M | 直角三角形 | 直角三角形 |
6 | 5 | 6 | 7 | A-B-C-E-G-I-K-M | 一般三角形 | 一般三角形 |
2.分支覆盖:
路径:
A-B-D-M
A-B-C-F-M
A-B-C-E-H-M
A-B-C-R-G-J-M
A-B-C-E-G-I-L-M
A-B-C-E-G-I-K-M
测试用例:
编号 | 输入值 | 执行路径 | 预期输出 | 实际输出 | ||
a | b | c | ||||
1 | 0 | 3 | 4 | A-B-D-M | 边的值不在范围内 | 边的值不在范围内 |
2 | 1 | 2 | 1 | A-B-C-F-M | 不构成三角形 | 不构成三角形 |
3 | 6 | 6 | 6 | A-B-C-E-H-M | 等边三角形 | 等边三角形 |
4 | 3 | 3 | 4 | A-B-C-R-G-J-M | 等腰三角形 | 等腰三角形 |
5 | 3 | 4 | 5 | A-B-C-E-G-I-L-M | 直角三角形 | 直角三角形 |
6 | 5 | 6 | 7 | A-B-C-E-G-I-K-M | 一般三角形 | 一般三角形 |
3.路径覆盖:
路径:
A-B-D-M
A-B-C-F-M
A-B-C-E-H-M
A-B-C-R-G-J-M
A-B-C-E-G-I-L-M
A-B-C-E-G-I-K-M
测试用例:
编号 | 输入值 | 执行路径 | 预期输出 | 实际输出 | ||
a | b | c | ||||
1 | 0 | 3 | 4 | A-B-D-M | 边的值不在范围内 | 边的值不在范围内 |
2 | 1 | 2 | 1 | A-B-C-F-M | 不构成三角形 | 不构成三角形 |
3 | 6 | 6 | 6 | A-B-C-E-H-M | 等边三角形 | 等边三角形 |
4 | 3 | 3 | 4 | A-B-C-R-G-J-M | 等腰三角形 | 等腰三角形 |
5 | 3 | 4 | 5 | A-B-C-E-G-I-L-M | 直角三角形 | 直角三角形 |
6 | 5 | 6 | 7 | A-B-C-E-G-I-K-M | 一般三角形 | 一般三角形 |
条件覆盖:
编号 | 1<=a<=100 | 1<=b<=100 | 1<=c<=100 | 1<=a<=100&& 1<=b<=100&& 1<=c<=100 | 覆盖路径 |
1 | T | T | T | T | B-C |
2 | F | F | F | F | B-D-M |
3 | T | F | F | F | B-D-M |
4 | F | T | F | F | B-D-M |
5 | F | F | T | F | B-D-M |
6 | T | T | F | F | B-D-M |
7 | T | F | T | F | B-D-M |
8 | T | T | T | F | B-D-M |
编号 | a<b+c | b<a+c | c<a+b | a<b+c&& b<a+c&& c<a+b | 路径 |
1 | T | F | F | F | C-F-M |
2 | F | T | F | F | C-F-M |
3 | F | F | T | F | C-F-M |
4 | T | T | F | F | C-F-M |
5 | T | F | T | F | C-F-M |
6 | F | T | T | F | C-F-M |
7 | T | T | T | T | C-E |
8 | F | F | F | F | C-F-M |
编号 | a==b | b==c | a==b &&b==c | 覆盖路径 |
1 | F | F | F | E-G |
2 | F | T | F | E-G |
3 | T | F | F | E-G |
4 | T | T | T | E-H |
编号 | a==b | a==c | b==c | a==b || a==c||b==c | 路径 |
1 | T | F | F | T | G-J-M |
2 | F | T | F | T | G-J-M |
3 | F | F | T | T | G-J-M |
4 | T | T | F | T | G-J-M |
5 | T | F | T | T | G-J-M |
6 | F | T | T | T | G-J-M |
7 | T | T | T | T | G-J-M |
8 | F | F | F | F | G-I |
编号 | 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 | 覆盖路径 |
1 | T | F | F | T | I-L |
2 | T | T | F | T | I-L |
3 | T | T | T | T | I-L |
4 | T | F | T | T | I-L |
5 | F | F | F | F | I-K |
6 | F | T | F | T | I-L |
7 | F | F | T | T | I-L |
8 | F | T | T | T | I-L |
测试用例:
编号 | 输入值 | 执行路径 | 预期输出 | 实际输出 | ||
a | b | c | ||||
1 | 0 | 3 | 4 | A-B-D-M | 边的值不在范围内 | 边的值不在范围内 |
2 | 3 | 0 | 4 | A-B-D-M | 边的值不在范围内 | 边的值不在范围内 |
3 | 4 | 3 | 0 | A-B-D-M | 边的值不在范围内 | 边的值不在范围内 |
4 | 1 | 2 | 1 | A-B-C-F-M | 不构成三角形 | 不构成三角形 |
5 | 2 | 1 | 1 | A-B-C-F-M | 不构成三角形 | 不构成三角形 |
6 | 1 | 1 | 2 | A-B-C-F-M | 不构成三角形 | 不构成三角形 |
7 | 6 | 6 | 6 | A-B-C-E-H-M | 等边三角形 | 等边三角形 |
8 | 3 | 3 | 4 | A-B-C-R-G-J-M | 等腰三角形 | 等腰三角形 |
9 | 3 | 4 | 3 | A-B-C-R-G-J-M | 等腰三角形 | 等腰三角形 |
10 | 4 | 3 | 3 | A-B-C-R-G-J-M | 等腰三角形 | 等腰三角形 |
11 | 3 | 4 | 5 | A-B-C-E-G-I-L-M | 直角三角形 | 直角三角形 |
12 | 4 | 5 | 3 | A-B-C-E-G-I-L-M | 直角三角形 | 直角三角形 |
13 | 3 | 5 | 4 | A-B-C-E-G-I-L-M | 直角三角形 | 直角三角形 |
14 | 5 | 6 | 7 | A-B-C-E-G-I-K-M | 一般三角形 | 一般三角形 |
3)相应Junit测试脚本、执行结果
import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class TriangleTest { @Before public void setUp() throws Exception { } @Test public void NoValue() { assertEquals("边的值不在范围内", Triangle.triangle(0, 3, 4)); assertEquals("边的值不在范围内", Triangle.triangle(3, 0, 4)); assertEquals("边的值不在范围内", Triangle.triangle(4, 0, 3)); } @Test public void NoTriangle() { assertEquals("不构成三角形", Triangle.triangle(1, 2, 1)); assertEquals("不构成三角形", Triangle.triangle(2, 1, 1)); assertEquals("不构成三角形", Triangle.triangle(1, 1, 2)); } @Test public void EqualTriangle() { assertEquals("等边三角形", Triangle.triangle(6, 6, 6)); assertEquals("等边三角形", Triangle.triangle(5, 5, 5)); assertEquals("等边三角形", Triangle.triangle(4, 4, 4)); } @Test public void IsoscelesTriangle() { assertEquals("等腰三角形", Triangle.triangle(3, 3, 4)); assertEquals("等腰三角形", Triangle.triangle(3, 4, 3)); assertEquals("等腰三角形", Triangle.triangle(4, 3, 3)); } @Test public void RightAngle() { assertEquals("直角三角形", Triangle.triangle(3, 5, 4)); assertEquals("直角三角形", Triangle.triangle(3, 4, 5)); assertEquals("直角三角形", Triangle.triangle(4, 5, 3)); } @Test public void TheTriangle() { assertEquals("一般三角形", Triangle.triangle(5, 6, 7)); } }
4)给出测试参数化和打包测试的脚本,并生成执行结果
import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import java.util.Arrays; import java.util.Collection; @RunWith(Parameterized.class) public class ParameterTest { private static Triangle triangle = new Triangle(); private int a,b,c; private String Result; @Before public void setUp() throws Exception { } @Parameters public static Collection data(){ return Arrays.asList( new Object[][]{ {0,3,4,"边的值不在范围内"}, {3,0,4,"边的值不在范围内"}, {4,3,0,"边的值不在范围内"}, {6,6,6,"等边三角形"}, {5,4,3,"直角三角形"}, {3,4,5,"直角三角形"}, {4,5,3,"直角三角形"}, {3,3,4,"等腰三角形"}, {3,4,3,"等腰三角形"}, {4,3,3,"等腰三角形"}, {5,6,7,"一般三角形"}, } ); } //构造函数 public ParameterTest(int a,int b,int c,String Result) { this.a=a; this.b=b; this.c=c; this.Result=Result; } @Test public void test() { assertEquals(Result, Triangle.triangle(a, b, c)); } }
打包测试:
import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @Suite.SuiteClasses({ ParameterTest.class }) public class PakageTest { @Before public void setUp() throws Exception { } }
4、测试小结:
源代码目前没有缺陷
测试总结与心得体会:通过这次的学习,我明白了如何使用Junit中的方法来测试程序。发现适当的运行这些工具,可以更轻松,更好的发现程序中的问题。在运用参数化测试的方法中,发现不是很能理解,于是上网查找资料,资料总结了一下步骤。
Junit参数化步骤:
(1)为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized。
(2)为测试类声明几个变量,分别用于存放期望值和测试所用数据。
(3)为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。
(4)为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为 java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对。
(5)编写测试方法,使用定义的变量作为参数进行测试。