5.5 举例分析
5.5.2 NextDate 函数的测试用例
回顾以下第2章中关于NextDate的问题描述:NextDate是一个有三个变量(月份、日期和年)的函数。函数返回输入日期后面的那个日期。变量月份、日期和年都是整数,且满足以下条件:
C2:1≤日期≤31
C3:1812≤年≤2012
对无效的输入日期,比如6月31日,或c1、c2、c3中的任意一个条件失败,则NextDate,都会产生一个输出,指示其为无效日期,或给出具体的无效原因,或笼统的给出"无效日期输入。"提示。
注:以下是依据方法产生测试用例,未考虑输入之间的逻辑关系,比如6月31日,出现的常识性错误并不是疏落。
边界值分析测试用例:共4×3 + 1 = 13个,如下表所示
月份 |
日期 |
年 |
预期输出 | |
1 |
6 |
15 |
1812 |
1812年6月16日 |
2 |
6 |
15 |
1813 |
1912年6月16日 |
3 |
6 |
15 |
1912 |
1912年6月16日 |
4 |
6 |
15 |
2011 |
2011年6月16日 |
5 |
6 |
15 |
2012 |
2012年6月16日 |
6 |
6 |
1 |
1912 |
1912年6月2日 |
7 |
6 |
2 |
1912 |
1912年6月3日 |
8 |
6 |
15 |
1912 |
1912年6月16日 |
9 |
6 |
30 |
1912 |
1912年7月1日 |
10 |
6 |
31 |
1912 |
错误 |
11 |
1 |
15 |
1912 |
1912年1月16日 |
12 |
2 |
15 |
1912 |
1912年2月16日 |
13 |
6 |
15 |
1912 |
1912年6月16日 |
14 |
11 |
15 |
1912 |
1912年11月16日 |
15 |
12 |
15 |
1912 |
1912年12月16日 |
边界值健壮性测试用例:共6×3 + 1 = 19个,如下表所示
用例标识 |
月份 |
日期 |
年 |
预期输出 |
1 |
6 |
15 |
1811 |
提示输入超出范围 |
2 |
6 |
15 |
1812 |
1812年6月16日 |
3 |
6 |
15 |
1813 |
1912年6月16日 |
4 |
6 |
15 |
1912 |
1912年6月16日 |
5 |
6 |
15 |
2011 |
2011年6月16日 |
6 |
6 |
15 |
2012 |
2012年6月16日 |
7 |
6 |
15 |
2013 | |
8 |
6 |
0 |
1912 |
提示输入超出范围 |
9 |
6 |
1 |
1912 |
1912年6月2日 |
10 |
6 |
2 |
1912 |
1912年6月3日 |
11 |
6 |
15 |
1912 |
1912年6月16日 |
12 |
6 |
30 |
1912 |
1912年7月1日 |
13 |
6 |
31 |
1912 |
错误 |
14 |
6 |
32 |
1912 |
提示输入超出范围 |
15 |
0 |
15 |
1912 |
提示输入超出范围 |
16 |
1 |
15 |
1912 |
1912年1月16日 |
17 |
2 |
15 |
1912 |
1912年2月16日 |
18 |
6 |
15 |
1912 |
1912年6月16日 |
19 |
11 |
15 |
1912 |
1912年11月16日 |
20 |
12 |
15 |
1912 |
1912年12月16日 |
21 |
13 |
15 |
1912 |
提示输入超出范围 |
最坏情况测试用例:共53 = 125,如下表所示
用例标识 |
月份 |
日期 |
年 |
预期输出 |
1 |
1 |
1812 |
1812年1月2日 | |
2 |
1 |
1 |
1813 |
1813年1月2日 |
3 |
1 |
1 |
1912 |
1912年1月2日 |
4 |
1 |
1 |
2011 |
2011年1月2日 |
5 |
1 |
1 |
2012 |
2012年1月2日 |
6 |
1 |
2 |
1812 |
1812年1月3日 |
7 |
1 |
2 |
1813 |
1813年1月3日 |
8 |
1 |
2 |
1912 |
1912年1月3日 |
9 |
1 |
2 |
2011 |
2011年1月3日 |
10 |
1 |
2 |
2012 |
2012年1月3日 |
11 |
1 |
15 |
1812 |
1812年1月16日 |
12 |
1 |
15 |
1813 |
1813年1月16日 |
13 |
1 |
15 |
1912 |
1912年1月16日 |
14 |
1 |
15 |
2011 |
2011年1月16日 |
15 |
1 |
15 |
2012 |
2012年1月16日 |
16 |
1 |
30 |
1812 |
1812年1月31日 |
17 |
1 |
30 |
1813 |
1813年1月31日 |
18 |
1 |
30 |
1912 |
1912年1月31日 |
19 |
1 |
30 |
2011 |
2011年1月31日 |
20 |
1 |
30 |
2012 |
2012年1月31日 |
21 |
1 |
31 |
1812 |
1812年2月1日 |
22 |
1 |
31 |
1813 |
1813年2月1日 |
23 |
1 |
31 |
1912 |
1912年2月1日 |
24 |
1 |
31 |
2011 |
2011年2月1日 |
25 |
1 |
31 |
2012 |
2012年2月1日 |
2 |
1 |
1812 |
1812年2月2日 | |
27 |
2 |
1 |
1813 |
1813年2月2日 |
28 |
2 |
1 |
1912 |
1912年2月2日 |
29 |
2 |
1 |
2011 |
2011年2月2日 |
30 |
2 |
1 |
2012 |
2012年2月2日 |
31 |
2 |
2 |
1812 |
1812年2月3日 |
32 |
2 |
2 |
1813 |
1813年2月3日 |
33 |
2 |
2 |
1912 |
1912年2月3日 |
34 |
2 |
2 |
2011 |
2011年2月3日 |
35 |
2 |
2 |
2012 |
2012年2月3日 |
36 |
2 |
15 |
1812 |
1812年2月16日 |
37 |
2 |
15 |
1813 |
1813年2月16日 |
38 |
2 |
15 |
1912 |
1912年2月16日 |
39 |
2 |
15 |
2011 |
2011年2月16日 |
40 |
2 |
15 |
2012 |
2012年2月16日 |
41 |
2 |
30 |
1812 | |
42 |
2 |
30 |
1813 |
错误 |
43 |
2 |
30 |
1912 |
错误 |
44 |
2 |
30 |
2011 |
错误 |
45 |
2 |
30 |
2012 |
错误 |
46 |
2 |
31 |
1812 |
错误 |
47 |
2 |
31 |
1813 |
错误 |
48 |
2 |
31 |
1912 |
错误 |
49 |
2 |
31 |
2011 |
错误 |
50 |
2 |
31 |
2012 |
错误 |
6 |
1 |
1812 |
1812年6月2日 | |
52 |
6 |
1 |
1813 |
1813年6月2日 |
53 |
6 |
1 |
1912 |
1912年6月2日 |
54 |
6 |
1 |
2011 |
2011年6月2日 |
55 |
6 |
1 |
2012 |
2012年6月2日 |
56 |
6 |
2 |
1812 |
1812年6月3日 |
57 |
6 |
2 |
1813 |
1813年6月3日 |
58 |
6 |
2 |
1912 |
1912年6月3日 |
59 |
6 |
2 |
2011 |
2011年6月3日 |
60 |
6 |
2 |
2012 |
2012年6月3日 |
61 |
6 |
15 |
1812 |
1812年6月16日 |
62 |
6 |
15 |
1813 |
1813年6月16日 |
63 |
6 |
15 |
1912 |
1912年6月16日 |
64 |
6 |
15 |
2011 |
2011年6月16日 |
65 |
6 |
15 |
2012 |
2012年6月16日 |
66 |
6 |
30 |
1812 |
1812年7月1日 |
67 |
6 |
30 |
1813 |
1813年7月1日 |
68 |
6 |
30 |
1912 |
1912年7月1日 |
69 |
6 |
30 |
2011 |
2011年7月1日 |
70 |
6 |
30 |
2012 |
2012年7月1日 |
71 |
6 |
31 |
1812 |
错误 |
72 |
6 |
31 |
1813 |
错误 |
73 |
6 |
31 |
1912 |
错误 |
74 |
6 |
31 |
2011 |
错误 |
75 |
6 |
31 |
2012 |
错误 |
11 |
1 |
1812 |
1812年11月2日 | |
77 |
11 |
1 |
1813 |
1813年11月2日 |
78 |
11 |
1 |
1912 |
1912年11月2日 |
79 |
11 |
1 |
2011 |
2011年11月2日 |
80 |
11 |
1 |
2012 |
2012年11月2日 |
81 |
11 |
2 |
1812 |
1812年11月3日 |
82 |
11 |
2 |
1813 |
1813年11月3日 |
83 |
11 |
2 |
1912 |
1912年11月3日 |
84 |
11 |
2 |
2011 |
2011年11月3日 |
85 |
11 |
2 |
2012 |
2012年11月3日 |
86 |
11 |
15 |
1812 |
1812年11月16日 |
87 |
11 |
15 |
1813 |
1813年11月16日 |
88 |
11 |
15 |
1912 |
1912年11月16日 |
89 |
11 |
15 |
2011 |
2011年11月16日 |
90 |
11 |
15 |
2012 |
2012年11月16日 |
91 |
11 |
30 |
1812 |
1812年12月1日 |
92 |
11 |
30 |
1813 |
1813年12月1日 |
93 |
11 |
30 |
1912 |
1912年12月1日 |
94 |
11 |
30 |
2011 |
2011年12月1日 |
95 |
11 |
30 |
2012 |
2012年12月1日 |
96 |
11 |
31 |
1812 |
错误 |
97 |
11 |
31 |
1813 |
错误 |
98 |
11 |
31 |
1912 |
错误 |
99 |
11 |
31 |
2011 |
错误 |
100 |
11 |
31 |
2012 |
错误 |
12 |
1 |
1812 |
1812年12月2日 | |
102 |
12 |
1 |
1813 |
1813年12月2日 |
103 |
12 |
1 |
1912 |
1912年12月2日 |
104 |
12 |
1 |
2011 |
2011年12月2日 |
105 |
12 |
1 |
2012 |
2012年12月2日 |
106 |
12 |
2 |
1812 |
1812年12月3日 |
107 |
12 |
2 |
1813 |
1813年12月3日 |
108 |
12 |
2 |
1912 |
1912年12月3日 |
109 |
12 |
2 |
2011 |
2011年12月3日 |
110 |
12 |
2 |
2012 |
2012年12月3日 |
111 |
12 |
15 |
1812 |
1812年12月16日 |
112 |
12 |
15 |
1813 |
1813年12月16日 |
113 |
12 |
15 |
1912 |
1912年12月16日 |
114 |
12 |
15 |
2011 |
2011年12月16日 |
115 |
12 |
15 |
2012 |
2012年12月16日 |
12 |
30 |
1812 |
1812年12月31日 | |
117 |
12 |
30 |
1813 |
1813年12月31日 |
118 |
12 |
30 |
1912 |
1912年12月31日 |
119 |
12 |
30 |
2011 |
2011年12月31日 |
120 |
12 |
30 |
2012 |
2012年12月31日 |
121 |
12 |
31 |
1812 |
1813年1月1日 |
122 |
12 |
31 |
1813 |
1814年1月1日 |
123 |
12 |
31 |
1912 |
1913年1月1日 |
124 |
12 |
31 |
2011 |
2012年1月1日 |
125 |
12 |
31 |
2012 |
2013年1月1日 |
5.5.3 佣金问题的测试用例
回顾问题描述:步枪销售商销售制造商制造的步枪机(lock)、枪托(stock)和枪管(barrel)。枪机卖45美元,枪托卖30美元,枪管卖25美元。销售商每月至少要售出一只完整的步枪,且生产限额是大多数销售商在一个月内科销售70个枪机、80个枪托和90个枪管。每访问一个镇子之后,销售商都给制造商发出电报,说明在那个镇子中售出的枪机、枪托和枪管数量。到了月末,销售商要发出一封很短的电报,通知-1个枪机被售出。这样步枪制造商就知道当月的销售情况,并计算销售商的佣金如下:销售额不到(含)1000美元的部分为10%,1000(不含)~1800(含)美元的部分15%,超过1800美元的部分20%。佣金程序生成月份销售报告,汇总售出的枪机、枪托和枪管总数,销售商的总销售额以及佣金。
分析:
C1:1≤lock≤70,-1
C2: 1≤stock≤80
C3: 1≤barrel≤90
基于输入的边界值测试方法与三角形和Next Date问题类似,不在赘述,重点分析输出边界问题。
(2)输出边界
佣金问题的输入空间如下图所示,根据问题描述,重点分析中间输出销售额为1000、1800时的输出边界,如图所示的两个平面,靠下的平面是输出销售额为1000的平面,这个平面的三个点分别是(22,0,0)、(0,33,0)和(0,0,40),靠上的平面是输出销售额为1800的平面,这个平面的三个点分别是(40,0,0)、(0,60,0)和(0,0,72),一是因为整除问题,数量的取值不一定正好在平面上,但是是离平面最近的一个点,二是可以把此边界认为是一个平面边界,是一个对前面所述的点边界的拓展,当然根据不同的条件,可以有线边界、曲面边界。
依据上图设计输出边界测试用例如下表所示:
用例标识 |
枪机 |
枪托 |
枪管 |
销售额 |
佣金 |
说明 |
1 |
1 |
1 |
1 |
100 |
10 |
(输出,下同)最小值 |
2 |
1 |
1 |
2 |
125 |
12.5 | |
3 |
1 |
2 |
1 |
130 |
13 |
略大于最小值 |
4 |
2 |
1 |
1 |
145 |
14.5 |
略大于最小值 |
5 |
5 |
5 |
5 |
500 |
20 |
0-1000的中点 |
6 |
10 |
10 |
9 |
975 |
97.5 |
略低于边界值 |
7 |
10 |
9 |
10 |
970 |
97 |
略低于边界值 |
8 |
9 |
10 |
10 |
955 |
95.5 |
略低于边界值 |
9 |
1 |
1 |
37 |
1000 |
100 |
边界值 |
10 |
1 |
31 |
1 |
1000 |
100 |
边界值 |
11 |
21 |
1 |
1 |
1000 |
100 |
边界值 |
12 |
10 |
10 |
10 |
1000 |
100 |
边界值 |
13 |
10 |
10 |
11 |
1025 |
103.75 |
略高于边界值 |
14 |
10 |
11 |
10 |
1030 |
104.5 |
略高于边界值 |
15 |
11 |
10 |
10 |
1045 |
106.75 |
略高于边界值 |
16 |
10 |
11 |
9 |
1005 |
100.75 |
略高于边界值 |
17 |
14 |
14 |
14 |
1400 |
160 |
1000-1800的中点 |
18 |
1 |
57 |
1 |
1780 |
217 |
略低于边界值 |
19 |
39 |
2 |
1 |
1795 |
219.25 |
略低于边界值 |
20 |
18 |
17 |
19 |
1795 |
219.25 |
略低于边界值 |
21 |
1 |
1 |
69 |
1800 |
220 |
边界值 |
22 |
18 |
18 |
18 |
1800 |
220 |
边界值 |
23 |
18 |
19 |
17 |
1805 |
221 |
略高于边界值 |
24 |
18 |
18 |
19 |
1825 |
225 |
略高于边界值 |
25 |
18 |
19 |
18 |
1830 |
226 |
略高于边界值 |
26 |
19 |
18 |
18 |
1845 |
229 |
略高于边界值 |
27 |
48 |
48 |
48 |
4800 |
820 |
1800-7800的中点 |
28 |
70 |
80 |
89 |
7775 |
1415 |
略小于最大值 |
29 |
70 |
79 |
90 |
7770 |
1414 |
略小于最大值 |
30 |
69 |
80 |
90 |
7755 |
1411 |
略小于最大值 |
31 |
70 |
80 |
90 |
7800 |
1420 |
最大值 |
5.6 随机测试
随机测试,使用随机数生成器选出测试用例值,随机测试可以避免出现测试偏见,但也带来一个严重的问题:多少随机测试是充分的?另外,预期结果如何确定?是由程序判定还是由人来判定?如果特别多测试用例怎么来判定?这些问题大多时候很难回答。
可以将随机测试作为其它方法测试的一个补充,正如生活中一样,一个连字都不认识的小孩,凭着好奇心,可以发现很多关于软件的新功能,使得惯于常用套路思维的爸爸妈妈感到很惊讶,发出:"原来软件还可这么用,还有这个功能。"的感叹。
5.7 边界值测试的指导方针
- 除了特殊值测试,基于函数(程序)输入定义域的测试方法,是所有测试方法中最基本的。
- 这类方法有一种假设,输入变量是真正独立的。
- 注意区分正常值与健壮值、单缺陷与多缺陷。
- 另一种很有用的基于输出的测试用例形式,可以用于生成错误消息的系统,覆盖所有的错误消息。
-
定义域分析还可以用于内部变量,例如循环控制、索引和指针。
第5章结束。
------------------------