1.软件测试
软件测试是为了发现程序中的错误而执行程序的过程。软件测试不等于程序测试,它贯穿于软件定义和开发的整个期间软件测试的对象。针对的对象有:需求分析,概要设计,详细设计以及程序编码等各个阶段得到的文档。
注:
①只能尽可能地差错,不能证明程序没错
②测试员与程序员不应该是同一个人
测试用例:为了进行测试而输入地和获得的输出数据。
软件测试的方法包括黑盒测试和白盒测试。
2.黑盒测试
把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。又叫做功能测试或数据驱动测试
是在程序接口上进行测试
注:使用黑盒穷举测试对所有输入数据的各种可能值的排列组合都进行测试,来检查程序是否都能产生正确的输出。实际上这是不可能的。
黑盒测试要达到的目的:用尽可能少的测试用例去发现尽可能多的软件缺陷。
黑盒测试主要使用的方法 1.等价类划分 2.边界值分析 3.错误推测法 4.因果图
5.场景法
①等价类划分
方法:
1.找出限制条件
2.划分有效等价类和无效等价类
3.输入测试数据覆盖等价类
变量的命名规则一般规定如下:变量名的长度不多于 10 个字符,第一个字符必须为英文字母,其他字符可以英文字母、数字以及下划线的任意组合。请用等价分类法设计测试用例。
输入等价类 | 有效等价类 | 无效等价类 |
长度 | 1.不多于10个字符 | 2.大于10个字符 |
第一个字符 | 3.英文字符 | 4.非英文字符 |
其他字符 | 5.英文,数字,下划线 | 6.非英文,数字,下划线 |
输入测试数据覆盖等价类:每一个测试用例只覆盖一类无效等价类,而有效等价类可通过一条全部覆盖
测试数据 | 结果 | 覆盖 |
abc123_ | 有效 | 条件 1,2,3 |
abcdefghijk | 无效 | 条件2 |
2abc | 无效 | 条件4 |
a>b | 无效 | 条件6 |
②边界值分析法
输入域边界或边界附近,常常能发现大量缺陷,所以可以选择系统边界或边界附近的数据来设计测试用例。
注:边界值分析法和等价类划分法一般同时使用。
int Add(int x1,int x2)
{
1<=x1<=200
50<=x2<=300
}
针对有效输入,函数返回x1+x2
针对无效输入,函数返回-1
刚开始可能会这样想:
但是这样设计会引起以下问题
①这样排列组合数据,很容易导致罗列不全,思路混乱
②像0,49,两个都来自于超出范围的左边界,如果发生错误,那么就不能确定是0导致的还是49导致的错误
所以边界值分析法要解决的问题就是
(1)确定边界:
(2)确定边界点:
(3)确定边界的邻域:
人为定义区间δ𝛿,这样就构成了最小值的邻域和最大值的邻域 (δ𝛿1和δ𝛿2一般是一致的,但是也可以不一致),如下图:
若使用穷尽取值法,他的取值范围如下图红色区域所示,测试用例达到2000多个,虽然测试用例的覆盖度达到了100%,但是测试用例太多,冗余度非常高,很难定位哪一个边界值出了问题。
若采用以下方法,一个边界点附近只需9个测试用例,总共36个测试用例,这样覆盖度一般也能达到100%,但是最大的问题就是缺陷定位能力太差,无法通过一个测试用例确定哪一个边界值出现了问题。
正确的取测试用例的方法:
得到如下表格:
•边界值+中间值
•边界附近+中间值
也不一定需要中间值,这里强调的是,取边界的值需要单一化,不能同时取边界值或边界附近的值,这样在出错之后,就可以确定是哪一个边界值出现了问题。
边界值分析的示例:
边界值的选取有两种方式:
•选取5个值:最小值、略大于最小值、正常值、略小于最大值、最大值
•选取7个值:略小于最小值、最小值、略大于最小值、正常值、略小于最大值、最大值、略大于最大值
输入条件规定取值范围为1~100,选取5个值和7个值的情况如下表:
如果要求三角形的边长取值范围为1~100,则可以使用边界值分析法对三角形边界边长进行测试,在设计测试用例时,分别选取1、2、50、99、100五个值作为测试数据:
用边界值法构造用例:
③错误推测法
凭经验或直觉推测可能的错误
一一错误推测法在很大的程度上靠直觉和经验进行,它的基本想法是列举出程序中可能有的错误和容易发生错误的特殊情况,并且根据它们选择测试方案。
对于程序中容易出错的情况也有一些经验总结出来,例如:
• 输入数据为零或输出数据为零往往容易发生错误;
• 如果输入或输出的数目允许变化(例如被检索的或生成的表的项数),则输入或输出的数目为0和1的情况(例如表为空或只有一项) 是容易出错的情况。
• 对文件操作(插入、删除等)采取计数的方式控制。
④因果图法
等价类划分法和边界值分析法都主要考虑的是输入条件,而没有考虑输入条件的各种组合以及各个输入条件之间的相互制约关系。因此,必须考虑描述多种条件的组合,相应的产生多个动作的形式来考虑设计测试用例。这就需要利用因果图法。
因果图法从自然语言书写的程序规格说明书中寻找因果关系,即输入条件与输出和程序状态的改变,通过因果图产生判定表。它能够帮助人们按照一定的步骤高效选择测试用例,同时还能指出程序规格说明书中存在的问题。
在因果图中,用C表示原因,E表示结果,各节点表示状态,取值0表示某状态不出现,取值1表示某状态出现。因果图有四种关系符号,如图所示:
从输入、输出考虑,有以下约束条件:
E (互斥) : a和b两个原因不会同时成立,最多有一个可以成立。
I (包含) : a和b两个原因至少有一个必须成立。
O(唯一) : a和b两个原因必须有且仅有一个成立。
R(要求) : a出现时b也必须出现。
M (强制/屏蔽): a是1时,b必须为0;a为0时,b则不确定。
因果图设计测试用例的步骤如下:
1.分析程序规格说明书的描述中,哪些是原因,哪些是结果,原因常常是输入条件或输入条件的等价类,而结果常常是输出条件;
2.分析程序规格说明书中描述的语义内容,并将其表示成连接各个原因与各个结果的因果图;
3.由于语法或环境的限制,有些原因和结果的组合情况是不可能出现的,为表明这些特定的情况,在因果图上使用若干特殊的符号标明约束条件;
4.把因果图转化为决策表;
5.为决策表中每一列表示的情况设计测试用例。
例题:
自动饮料售货机软件。规格说明如下:
有一个处理单价为1元5角的盒装饮料的自动售货机软件。若投入1元5角硬币,按下“可乐”“雪碧”“红茶”按钮,相应的饮料就送出来若投入的是2元硬币,则在送出饮料的同时退还5角硬币。
首先从软件规格说明中分析原因、结果以及中间状态。
再用因果图的方式描述出来:
获得因果图,就可以进一步根据因果图做决策表(判定表):
决策表通常由4部分构成:
建立决策表的步骤:
1.确定规则个数;
2.列出所有条件桩和动作桩;
3.填入条件项;
4.填入动作频,制定初始决策表;
5.简化,合并相似规则或者相同动作。
在简化并得到最终决策表后,只要选择适当的输入,使决策表每一列的输入条件得到满足即可生成测试用例。
以上案例的决策表如图所示:
可以根据上述决策表设计测试用例,验证适当的输入组合能否得到正确的输出。
⑤场景法
现在软件很多都是用事件触发来控制流程,事件触发时的情形变形成场景,而同一事件不同的触发顺序和处理结果就形成了事件流。这种在软件设计中的思想也可以应用到软件测试中,可生动地描绘出事件触发时的情形,有利于测试者执行测试用例,同时测试用例也更容易得到理解和执行。
用例场景是通过描述流经用例的路径来确定的过程,这个流经过程要从用例开始到结束遍历其中所有的基本流和备选流。
•基本流:采用黑直线表示,是经过用例的最简单路径,表示无任何差错,程序从开始执行到结束;
•备选流:采用不同颜色表示,一个备选流可以从基本流开始,在某个特定条件下执行,然后重新加入基本流中,也可以起源于另一个备选流,或终止用例,不再加入到基本流。
应用场景法进行黑盒测试的步骤:
1.根据规格说明,描述出程序的基本流和各个备选流。
2.根据基本流和各个备选流生成不同的场景。
3.对每一个场景生成相应的测试用例。
4.对生成的所有测试用例进行复审,去掉多余的测试用例,对每一个测试用例确定测试数据。
示例:根据场景法设计“ATM取款流程”测试用例:
得到用例场景如表所示:
接下来设计用例覆盖每个用例场景:
3.白盒测试
把测试对象看做一个透明的盒子,允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。又称为结构测试或逻辑驱动测试。
① 语句覆盖:每个语句至少执行一次
eg:
if A and B
then action 1
if C or D
then action 2
这里的语句有action1 和 action2,如果两个语句都至少执行一次
A=TRUE B=TRUE(A,B两个都为真) C=TRUE/D=TRUE(C,D其中一个必须为真)
例如:若输入test:A=TRUE,B=TRUE,C=TRUE,就可以完成语句覆盖
② 判定覆盖(分支覆盖):每个判定真假至少一次
判定在这里就是指:if后面的框框
每个判定真假至少一次,即
A and B =T---->A=T,B=T ①
A and B = F---->A=F/B=F ②
C or D = T---->C=T/D=T ③
C or D = F---->C=F,D=F ④
满足以上四个判定
输入测试:
test1:A=T,B=T,C=T,D=F--->覆盖了①③用例
test2:A=T,B=F,C=F,D=F--->覆盖了②④用例
③ 条件覆盖:每个判定的条件至少真假一次
条件在这里就是指:
每个判定条件至少真假一次,即
A T F
B T F
C T F
D T F
⑤ ⑥(全T一列为⑤,全F一列为⑥)
那么以下测试用例,就可以覆盖上面的条件
test1:A=T,B=T,C=T,D=T
test2:A=F,B=F,C=F,D=F
④ 判定条件覆盖:判定覆盖+条件覆盖(两者都要满足)
A=T,B=T,C=T,D=T---->满足了⑤+①+③
A=F,B=F,C=F,D=F---->满足了⑥+②+④
⑤ 组合覆盖(条件组合覆盖):将每个判定中的各个条件的各种可能的组合至少一次
组合覆盖利用上面的例子就是:
对于if A and B 以及 if C or D:
A B | C D
test1: T T | T T
test2: T F |T F
test3: F T |F T
test4: F F |F F
⑥ 路径覆盖:将所有的路径都走一遍
我们将他展开,可以很清楚的看到4条路径:
覆盖这4个路径就可以满足路径覆盖:
test1:x=4 z=9 y=6 ----覆盖路径1
test2: x=5 z=9 y=1 ----覆盖路径2
test3: x=2 z=9 y=6 ----覆盖路径3
test4: x=2 z=9 y=1 ----覆盖路径4
我们也可以发现,覆盖程度由低到高:
语句覆盖--->判定覆盖--->条件覆盖--->判定条件覆盖--->组合覆盖--->路径覆盖