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章结束。
------------------------