TA的每日心情 | 奋斗 2021-8-16 14:04 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]测试小兵
|
2#
楼主 |
发表于 2018-4-20 13:47:27
|
只看该作者
rem create a 10 element integer array
rem initialize each element to–1
dim data(10)as integer
dim i as integer
for i=1 to 10
data(i)=–1
next i
end
这段代码的意图是创建包含10个元素的数组,并为数组中的每一个元素赋初值–1。看起来相当简单。
它建立了包含10个整数的数组data和一个计数值i。For循环是从1~10,数组中从第1个元素到第10个
元素被赋予数值–1。那么边界问题在哪儿呢?
在大多数开发语言脚本中,应当以声明的范围定义数组,在本例中定义语句是dim data(10)as interg
er,第一个创建的元素是data(0),而不是data(1)。该程序实际上创建了一个从data(0)~ data
(10)共11个元素的数组。程序从1~10循环将数组元素的值初始化为-1,但是由于数组的第一个元素
是data(0),因此它没有被初始化。程序执行完毕,数组值如下:
data(0)= 0data(6)= –1
data(1)= –1data(7)= –1
data(2)= –1data(8)= –1
data(3)= –1data(9)= –1
data(4)= –1data(10)= –1
data(5)= –1
注意data(0)的值是0,而不是–1。如果这位程序员以后忘记了,或者其他程序员不知道这个数据数组是
如何初始化的,那么他就可能会用到数组的第1个元素data(0),以为它的值是–1。诸如此类的问题很常
见,在复杂的大型软件中,可能导致极其严重的软件缺陷。
2.次边界条件
上面讨论的普通边界条件是最容易找到的。它们在产品说明书中有定义,或者在使用软件的过程中确定。
而有些边界在软件内部,最终用户几乎看不到,但是软件测试仍有必要检查。这样的边界条件称为次边界
条件或者内部边界条件。
寻找这样的边界不要求软件测试员具有程序员那样阅读源代码的能力,但是要求大体了解软件的工作方式。
2的乘方和ASCII表就是这样的例子。
(1)2的乘方
计算机和软件的计数基础是二进制数,用位(bit)来表示0和1,一个字节(byte)由8位组成,一个字(w
ord)由两个字节组成等。表5-4中列出了常用的2的乘方单位及其范围或值。
表5-4 软件中2的乘方
术 语范围或值术 语范围或值
位0或1千1,024
双位0~15兆1,048,576
字节0~255亿1,073,741,824
字0~65,535万亿1,099,511,627,776
表5-4中所列的范围和值是作为边界条件的重要数据。除非软件向用户提出这些范围,否则在需求文档中
不会指明。然而,它们通常由软件内部使用,外部是看不见的,当然,在产生软件缺陷的情况下可能会看到。
在建立等价区间时,要考虑是否需要包含2的乘方边界条件。例如,如果软件接受用户输入1~1000范围
内的数字,谁都知道在合法区间中包含1和1000,也许还要有2和999。为了覆盖任何可能的2的乘方次边界,
还要包含临近双位边界的14、15和16,以及临近字节边界的254、255和256。
(2)ASCII表
另一个常见的次边界条件是ASCII字符表。如表5-5所示是部分ASCII值表的清单。
表5-5 部分ASCII值表
字符ASCII值字符ASCII值字符ASCII值字符ASCII值
Null0B66250a97
Space32Y89957b98
/47Z90:58y121
048[91@64z122
149'96A65{123
注意,表5-5不是结构良好的连续表。0~9的后面ASCII值是48~57。斜杠字符(/)在数字0的前面,
而冒号字符“:”在数字9的后面。大写字母A~Z对应65~90。小写字母对应97~122。这些情况都代表
次边界条件。
如果测试进行文本输入或文本转换的软件,在定义数据区间包含哪些值时,参考一下ASCII表是相当明智
的。例如,如果测试的文本框只接受用户输入字符A~Z和a~z,就应该在非法区间中包含ASCII表中这
些字符前后的值@、[ 、和{ 。
(3)其他一些边界条件
另一种看起来很明显的软件缺陷来源是当软件要求输入时(比如在文本框中),不是没有输入正确的信息,
而是根本没有输入任何内容,只按了Enter键。这种情况在产品说明书中常常被忽视,程序员也可能经常
遗忘,但是在实际使用中却时有发生。程序员总会习惯性地认为用户要么输入信息,不管是看起来合法
的或非法的信息,要么就会选择Cancel键放弃输入,如果没有对空值进行好的处理的话,恐怕程序员自
己都不知道程序会引向何方。
正确的软件通常应该将输入内容默认为合法边界内的最小值,或者合法区间内的某个合理值,否则,返
回错误提示信息。
因为这些值通常在软件中进行特殊处理,所以不要把它们与合法情况和非法情况混在一起,而要建立单独
的等价区间。
3.边界值的选择方法
边界值分析是一种补充等价划分的测试用例设计技术,它不是选择等价类的任意元素,而是选择等价
类边界的测试用例。实践证明,为检验边界附近的处理专门设计测试用例,常常取得良好的测试效果。
边界值分析法不仅重视输入条件边界,而且也适用于输出域测试用例。
对边界值设计测试用例,应遵循以下几条原则:
① 如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的
值作为测试输入数据。
② 如果输入条件规定了值的个数,则用最大个数、最小个数、比最小个数少1、比最大个数多1的数作
为测试数据。
③ 根据规格说明的每个输出条件,使用前面的原则①。
④ 根据规格说明的每个输出条件,应用前面的原则②。
⑤ 如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元
素作为测试用例。
⑥ 如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构边界上的值作为测试用例。
⑦ 分析规格说明,找出其他可能的边界条件。
2.4 错误推测法
错误推测法就是基于经验和直觉推测程序中所有可能存在的各种错误,有针对性地设计测试用例的方法。
错误推测法的基本思想是列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择
测试用例。例如,设计一些非法、错误、不正确和垃圾数据进行输入测试是很有意义的。如果软件要
求输入数字,就输入字母。如果软件只接受正数,就输入负数。如果软件对时间敏感,就看它在公元
3000年是否还能正常工作。还有,例如,在单元测试时曾列出的许多在模块中常见的错误,以前产品
测试中曾经发现的错误等,这些就是经验的总结。另外,输入数据和输出数据为0的情况,或者输入表
格为空格或输入表格只有一行,这些都是容易发生错误的情况。可选择这些情况下的例子作为测试用例。
2.5 因果图法
前节介绍的等价类划分方法和边界值分析法都是着重考虑输入条件,并没有考虑到输入情况的各种组
合,也没考虑到各个输入情况之间的相互制约关系。如果在测试时必须考虑输入条件的各种组合,可
能的组合数将是天文数字。因此必须考虑描述多种条件的组合,相应地产生多个动作的形式来考虑设
计测试用例,这就需要利用因果图。在软件工程中,有些程序的功能可以用判定表的形式来表示,并
根据输入条件的组合情况规定相应的操作。很自然,应该为判定表中的每一列设计一个测试用例,以
便保证测试程序在输入条件的某种组合下,操作是正确的。
1.因果图设计方法
因果图法是从用自然语言书写的程序规格说明的描述中找出因(输入条件)和果(输出或程序状态的
改变),通过因果图转换为判定表。
利用因果图导出测试用例需要经过以下几个步骤:
① 分析程序规格说明的描述中,哪些是原因,哪些是结果。原因常常是输入条件或是输入条件的等
价类,而结果是输出条件。
② 分析程序规格说明的描述中语义的内容,并将其表示成连接各个原因与各个结果的“因果图”。
③ 标明约束条件。由于语法或环境的限制,有些原因和结果的组合情况是不可能出现的。为表明这
些特定的情况,在因果图上使用若干个标准的符号标明约束条件。
④ 把因果图转换成判定表。
⑤ 为判定表中每一列表示的情况设计测试用例。
因果图生成的测试用例(局部,组合关系下的)包括了所有输入数据的取TRUE与取FALSE的情况,
构成的测试用例数目达到最少,且测试用例数目随输入数据数目的增加而增加。
事实上,在较为复杂的问题中,这个方法常常是十分有效的,它能有力地帮助我们确定测试用例。
当然,如果哪个开发项目在设计阶段就采用了判定表,也就不必再画因果图了,而是可以直接利用
判定表设计测试用例了。
通常在因果图中,用Ci表示原因,Ei表示结果,其基本符号如图5-3所示。各结点表示状态,可取“
0”或“1”值。“0”表示某状态不出现,“1”表示某状态出现。
图5-3 因果图的基本图形符号
① 恒等:若原因出现,则结果出现;若原因不出现,则结果也不出现。
② 非(~):若原因出现,则结果不出现;若原因不出现,则结果出现。
③ 或(∨):若几个原因中有1个出现,则结果出现;若几个原因都不出现,则结果不出现。
④ 与(∧):若几个原因都出现,结果才出现。若其中有1个原因不出现,则结果不出现。
为了表示原因与原因之间、结果与结果之间可能存在的约束条件,在因果图中可以附加一些表示约束
条件的符号。从输入(原因)考虑,有4种约束,例如:(a)、(b)、(c)、(d)。从输出(结果
)考虑,还有1种约束,例如:(e),如图5-4所示。
图5-4 因果图的约束符号
① E(互斥):表示a、b两个原因不会同时成立,两个中最多有一个可能成立。
② I(包含):表示a、b、c这3个原因中至少有一个必须成立。
③ O(惟一):表示a和b当中必须有一个,且仅有一个成立。
④ R(要求):表示当a出现时,b必须也出现。a出现时不可能b不出现。
⑤ M(屏蔽):表示当a是1时,b必须是0。而当a为0时,b的值不定。
2.因果图测试用例
例如:有一个处理单价为1元5角钱的盒装饮料的自动售货机软件。若投入1元5角硬币,按下“可乐”、
“雪碧”或“红茶”按钮,相应的饮料就送出来。若投入的是两元硬币,在送出饮料的同时退还5角硬币。
分析这一段说明,我们可以列出原因和结果。
原因:① 投入1元5角硬币;② 投入2元硬币;
原因:③ 按“可乐”按钮;④ 按“雪碧”按钮;⑤ 按“红茶”按钮。
中间状态:① 已投币;② 已按钮。
结果:① 退还5角硬币;② 送出“可乐”饮料;
原因:③ 送出“雪碧”饮料;④ 送出“红茶”饮料。
根据原因和结果,我们可以设计这样一个因果图(如图5-5所示。)
图5-5 因果图
转换为测试用例,如表5-6所示,每一列可作为确定测试用例的依据。
表 5-6
1234567891011
输
入
投入1元5角硬币(1)11110000000
投入2元硬币(2)00001111000
按“可乐”按钮(3)10001000100
按“雪碧”按钮(4)01000100010
按“红茶”按钮(5)00100010001
中间
结点
已投币(11)11111111000
已按钮(12)11101110111
输
出
退还5角硬币(21)00001110000
送出“可乐”饮料(22)10001000000
送出“雪碧”饮料(23)01000100000
送出“红茶”饮料(24)00100010000
|
|