实验二+040+薛龚
一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测原代码:http://www.cnblogs.com/xwhisper/p/6629297.html
2)依据覆盖技术,测试用例列表
程序图
DD-路径图
DD-路径(只压缩链路经)
程序图节点 |
DD-路径 |
程序图节点 |
DD-路径 |
19 |
A |
49,55 |
J |
28 |
B |
56,57 |
K |
29,30 |
C |
60 |
L |
33 |
D |
61,62 |
M |
34,35 |
E |
65 |
N |
39 |
F |
67 |
O |
40,41 |
G |
68,69 |
P |
44 |
H |
71 |
Q |
45,46 |
I |
22 | R |
(I)语句覆盖:(判定覆盖、基本路径测试方法与语句覆盖相同)
A-B-C-R
A-B-D-E-R
A-B-D-F-G-R
A-B-D-F-H-I-R
A-B-D-F-H-J-K-O-P-Q-R
A-B-D-F-H-J-L-M-O-P-Q-R
A-B-D-F-H-J-L-N-O-P-Q-R
A-B-D-F-H-J-L-N-O-Q-R
测试用例
用例ID | 输入值 | 执行路径 | 预期输出 | ||
Y | M | D | |||
1 | 1914 | 1 | 1 | A-B-C-R | 年份超出范围 |
2 | 1915 | 13 | 1 | A-B-D-E-R | 月份超出范围 |
3 | 1915 | 2 | 30 | A-B-D-F-G-R | 日期超出范围 |
4 | 1915 | 4 | 31 | A-B-D-F-H-I-R | 日期超出范围 |
5 | 2000 | 2 | 29 | A-B-D-F-H-J-K-O-P-Q-R | 2000 3 1 |
6 | 2000 | 4 | 30 | A-B-D-F-H-J-L-M-O-P-Q-R | 2000 5 1 |
7 | 2000 | 4 | 25 | A-B-D-F-H-J-L-N-O-P-Q-R | 2000 4 26 |
8 | 2000 | 12 | 31 | A-B-D-F-H-J-L-N-O-Q-R | 2001 1 1 |
(II)条件覆盖:(判定/条件覆盖、组合覆盖、路径覆盖与条件覆盖相同)
(且以下条件覆盖测试用例同时满足上文中的语句覆盖)
编号 | y< 1915
|
y> 2050 |
y< 1915 ||y> 2050 |
覆盖路径 |
1 | F | F | F | B-D |
2 | F | T | T | B-C |
3 | T | F | T | B-C |
编号 | m<1 |
m>12 |
m< 1 ||m> 12 |
覆盖路径 |
4 | F | F | F | D-F |
5 | F | T | T | D-E |
6 | T | F | T | D-E |
编号 | (d< 1 ||d> 28 )&&m== 2 &&!(y% 4 == 0 &&y% 100 != 0 ||y% 400 == 0 ) |
(d< 1 ||d> 29 )&&m== 2 &&(y% 4 == 0 &&y% 100 != 0 ||y% 400 == 0 ) |
|
覆盖路径 |
7 | F | F | F | F-H |
8 | F | T | T | F-G |
9 | T | F | T | F-G |
编号 | (d< 1 ||d> 30 )&&(m== 4 ||m== 6 ||m== 9 ||m== 11 )) |
((d< 1 ||d> 31 )&&(m== 1 ||m== 3 ||m== 5 ||m== 7 ||m== 8 ||m== 10 ||m== 12 )) |
((d< 1 ||d> 30 )&&(m== 4 ||m== 6 ||m== 9 ||m== 11 ))||((d< 1 ||d> 31 )&&(m== 1 ||m== 3 ||m== 5 ||m== 7 ||m== 8 ||m== 10 ||m== 12 )) |
覆盖路径 |
10 | F | F | F | H-J |
11 | F | T | T | H-I |
12 | T | F | T | H-I |
编号 | (d== 28 &&m== 2 &&!(y% 4 == 0 &&y% 100 != 0 ||y% 400 == 0 )) |
(d== 29 &&m== 2 &&(y% 4 == 0 &&y% 100 != 0 ||y% 400 == 0 )) |
(d== 28 &&m== 2 &&!(y% 4 == 0 &&y% 100 != 0 ||y% 400 == 0 ))||(d== 29 &&m== 2 &&(y% 4 == 0 &&y% 100 != 0 ||y% 400 == 0 )) |
覆盖路径 |
13 | F | F | F | J-L |
14 | F | T | T | J-K |
15 | T | F | T | J-K |
编号 | (d== 30 &&(m== 4 ||m== 6 ||m== 9 ||m== 11 )) |
(d== 31 &&(m== 1 ||m== 3 ||m== 5 ||m== 7 ||m== 8 ||m== 10 ||m== 12 )) |
(d== 30 &&(m== 4 ||m== 6 ||m== 9 ||m== 11 ))||(d== 31 &&(m== 1 ||m== 3 ||m== 5 ||m== 7 ||m== 8 ||m== 10 ||m== 12 )) |
覆盖路径 |
16 | F | F | F | L-N |
17 | F | T | T | L-M |
18 | T | F | T | L-M |
编号 | m>12 | 覆盖路径 |
19 | F | O-Q |
20 | T | O-P-Q |
测试用例:
用例ID | 输入值 | 执行路径 | 覆盖条件 | 预期输出 | ||
Y | M | D | ||||
1 | 2051 | 4 | 21 | A-B-C-R | 2 | 年份超出范围 |
2 | 1914 | 5 | 22 | A-B-D-F-G-R | 3 | 年份超出范围 |
3 | 2000 | 0 | 23 | A-B-D-E-R | 6 | 月份超出范围 |
4 | 2000 | 13 | 30 | A-B-D-E-R | 5 | 月份超出范围 |
5 | 2000 | 2 | 30 | A-B-D-F-G-R | 8 | 日期超出范围 |
6 | 2001 | 2 | 29 | A-B-D-F-G-R | 9 | 日期超出范围 |
7 | 2000 | 5 | 32 | A-B-D-F-H-I-R | 11 | 日期超出范围 |
8 | 2001 | 4 | 31 | A-B-D-F-H-I-R | 12 | 日期超出范围 |
9 | 2004 | 2 | 29 | A-B-D-F-H-J-K-O-Q-R | 1,4,7,10,14,19 | 2004 3 1 |
10 | 2007 | 2 | 28 | A-B-D-F-H-J-K-O-Q-R | 1,4,7,10,15,19 | 2007 3 1 |
11 | 2003 | 4 | 25 | A-B-D-F-H-J-L-N-O-Q-R | 1,4,7,10,13,16,19 | 2003 4 26 |
12 | 2001 | 12 | 31 | A-B-D-F-H-J-L-M-O-P-Q-R | 1,4,7,10,13,17,20 | 2002 1 1 |
13 | 2002 | 9 | 30 | A-B-D-F-H-J-L-M-O-Q-R | 1,4,7,10,13,18,19 | 2003 10 1 |
3)相应Junit测试脚本、执行结果
package NextDate; import static org.junit.Assert.*; import org.junit.Test; public class NextDateTestTest { @Test public void testNextDate1() { assertFalse("年份超出范围",NextDateTest.checkDate(2051, 4, 21)); } @Test public void testNextDate2() { assertFalse("年份超出范围",NextDateTest.checkDate(1914, 5, 22)); } @Test public void testNextDate3() { assertFalse("月份超出范围",NextDateTest.checkDate(2000, 0, 23)); } @Test public void testNextDate4() { assertFalse("月份超出范围",NextDateTest.checkDate(2000, 13, 30)); } @Test public void testNextDate5() { assertFalse("日期超出范围",NextDateTest.checkDate(2000, 2, 30)); } @Test public void testNextDate6() { assertFalse("日期超出范围",NextDateTest.checkDate(2001, 2, 29)); } @Test public void testNextDate7() { assertFalse("日期超出范围",NextDateTest.checkDate(2000, 5, 32)); } @Test public void testNextDate8() { assertFalse("日期超出范围",NextDateTest.checkDate(2001, 4, 31)); } @Test public void testNextDate9() { assertEquals("NextDate:2004年3月1日",NextDateTest.nextDate(2004, 2, 29)); } @Test public void testNextDate10() { assertEquals("NextDate:2007年3月1日",NextDateTest.nextDate(2007, 2, 28)); } @Test public void testNextDate11() { assertEquals("NextDate:2003年4月26日",NextDateTest.nextDate(2003, 4, 25)); } @Test public void testNextDate12() { assertEquals("NextDate:2002年1月1日",NextDateTest.nextDate(2001, 12, 31)); } @Test public void testNextDate13() { assertEquals("NextDate:2003年10月1日",NextDateTest.nextDate(2003, 9, 30)); } }
结果:
4)给出测试参数化和打包测试的脚本,并生成执行结果
参数化测试:
package NextDate; 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 ParametersTest { private static NextDateTest NextDatet = new NextDateTest(); private int year; private int month; private int day; private String result; @Parameters public static Collection data() { return Arrays.asList(new Object[][]{ {2051,4,21, "年份超出范围"}, {1914,5,22, "年份超出范围"}, {2000,0,23, "月份超出范围"}, {2000,13,30, "月份超出范围"}, {2000,2,30, "日期超出范围"}, {2001,2,29, "日期超出范围"}, {2000,5,32, "日期超出范围"}, {2001,4,31, "日期超出范围"}, {2004,2,29, "NextDate:2004年3月1日"}, {2007,2,28, "NextDate:2007年3月1日"}, {2003,4,25, "NextDate:2003年4月26日"}, {2001,12,31, "NextDate:2002年1月1日"}, {2003,9,30, "NextDate:2003年10月1日"}, }); } //构造函数,对变量进行初始化 public ParametersTest(int year, int month, int day, String result) { this.year = year; this.month = month; this.day = day; this.result = result; } @Test public void test() { if(NextDatet.checkDate(year, month, day)){ assertEquals(result, NextDatet.nextDate(year, month, day)); } else{ assertFalse(result,NextDateTest.checkDate(year, month, day)); } } }
结果:
打包测试:
package NextDate; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({NextDateTestTest.class,ParametersTest.class}) public class AllTest { }
结果:
四、测试小结:
测试用例均通过测试。
因判定条件过多,对于测试的工作量就增加了很多。且因判断格式与计算nextdata分为两个方法,所以对于两个方法的测试采用不同方法。