一、等价类划分法
该方法是将系统的输入域划分为若干部分,然后从每个部分选取少数代表性数据进行测试,这样可以避免穷举法产生的大量用例。
等价类是指某个输入域的子集合,在该子集合中,各个输入数据对于揭露软件中的错误都是等效的。并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试。
有效等价类:是指对于系统的规格说明来说是合理的,有意义的输入数据构成的集合。利用有效等价类可以验证程序是否实现了规格说明中所规定的功能和性能。
无效等价类:是指对于系统的规格说明来说是不合理或无意义的输入数据所构成的集合。
设计测试用例时,要同时考虑这两种等价类。因为,软件不仅要能接收合理的数据,也要能经受意外的考验,这样的测试才能确保软件具备有更高的可靠性。
1、划分等价类
基于特性测试子项所对应的 SRS 片段,可以参考下面几条原则:
1.在输入条件规定了取值范围或值的个数的情况。
例子:在1<x<5中。一个有效等价类:1<x<5,两个无效等价类:x>=5 和 x<=1。
2.在输入条件规定了输入值的集合或者规定了必定如何的条件的情况下,可确立一个有效等价类和一个无效等价类。
例子:规定字段”星期”是输入星期几。该输入条件一个有效等价类是输入的值属于从星期一到星期日的集合,一个无效等价类是不属于星期一到星期日的其他值。
3.在输入条件是一个布尔量的情况。
例子:性别,如果规定输入“男”为有效,则一个有效等价类:“男”,一个无效等价类:“女”。
4.在规定了输入数据的一组值假定 n 个,并且程序要对每一个输入值分别处理的情况下,可确立 n 个有效等价类和一个无效等价类。
例子:PPT的打印效果分为幻灯片加框和幻灯片不加框,则对于打印效果这个输入条件,n (这里 n =2)个有效等价类:幻灯片加框,幻灯片不加框;一个无效等价类:加框和不加框外的其他值。
5.在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类符合规则和若干个无效等价类从不同角度违反规则。
例子:用户名规则:长度 6-16 位,由英文和数字组成,则一个有效等价类:符合长度和字符类型的字符串,如 test123。若干个无效等价类可以包括:违反长度,如test1,test1234567890123456,;违反字符类型,如 test@123,test 123等。
6.在确知已划分的等价类中个元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。
例子:
对于学校考试分数及格(100分制)而言,
有效等价类:大于等于 60 分,无效等效类:小于 60 分,
根据学校相关规定对于分数处理方式不同,可以进一步划分:
有效:60-80 合格,80 分以上 优秀
无效:50-59 分 补考,小于 50 分 重修
2、确定初始用例
从划分出的等价类中按以下三个原则设计测试用例:
1.为每一个等价类规定一个唯一的编号。
2.设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止。
3.设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。
例子:
3、实际应用
等价类划分法主要应用在功能测试,性能测试,GUI测试,配置测试等类型中。
性能测试,比如针对 Word 打开文档的时间进行测试,可以考虑用 Word 打开纯文字的文档,打开全是图片的文档,打开全是表格文档,打开文字、图片、表格混合的文档。
GUI 测试,比如针对下图中的文件名编辑框输入回的测试,可以考虑输入文件名长度小于编辑框的长度,输入文件名长度大于编辑框长度,输入英文字母,输入中文汉字,输入的中文汉字在编辑框边沿等等,这就是等价类划分。
配置测试,比如针对网页在不同浏览器上的工作进行测试,通过分析这些浏览器的技术实现,IE、遨游、MyIE 等属于 Trident 内核,可以归为一类;firefox、mozilla 属于 Gecko 内核,归成一类;safari、Chrome 属于 Webkit 内核,归成一类。
常见的能够划分等价类的地方:
数值范围、重复次数、字符串长度、字符串组中字符串的个数、文件命名、文件大小、可用内存大小、屏幕分辩率、屏幕颜色种类、操作系统版本、超时时间。
总结:等价类是以效果来换取效率,等价类细分程度、等价类组合程度取决于进度和人力资源情况。等价类的出发点是考虑设计用例把每个输入的每种情况都有用例测试到,就认为达到了充分性。但对于各情况的组合不进行考虑。等价类要想用的好,关键是要把输入背后隐藏的信息从各个角度去进行分类。
二、边界值分析法
1、边界值使用条件:
1.输入条件明确了一个值的取值范围,或是规定了值的个数。
例子:输入条件为整数,取值范围[1,100]
2.输入条件明确了一个有序集合。
例子:输入条件为星期几,取值范围是星期的集合:星期一到星期日
边界值点定义:
上点:边界上的点,如果域的边界是封闭的(例如闭区间[1,5]),上点就在域范围内;如果域的边界是开放的(例如开区间(1,5)),上点就在域范围外。
离点:就是离上点最近的一个点,如果域的边界是封闭的,离点就在域范围外,如果域的边界是开放的,离点就在域范围内。
内点:顾名思议,就是在域范围内的任意一个点。
例子:
88<x<=99 88 89 99 100
上点:88 99
内点:90
离点:89 100
203<=x<500 202 203 499 500
上点:203 500
内点:300
离点:202 499
2、确定测试用例:
1.为每一个等价类内点、上点或离点规定一个唯一的编号。
2.设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类的内点、上点或离点,重复这一步,直到所有的有效等价类点都被覆盖为止。
说明:等价类划分和边界值分析结合使用时,边界值分析的内点如果已经在等价类中有测试用例覆盖,则无需重复再设计用例。
3.设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类的内点、上点或离点,重复这一步,直到所有的无效等价类的内点、上点或离点都被覆盖为止。
3、实际应用:
基于边界分析方法选择测试用例的原则:
1.如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。如:重量在 10-50 范围内的邮件。应取 10 及 50,还要取 10.01,49.99,9.99,50.01等。
2.如果输入条件规定了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据。如:输入文件包括1-255个记录。应取 1 和 255,还要取 0 及 256 等。
3.将规则 1 和 2 应用于输出条件,即设计测试用例使输出值达到边界值及其左右的值。如:每月保险金扣除额为 0 至 1165.25 元。应 0.00 及 1165.24,还要取 0.01 及 1165.26等。
4.如果程序的规格说明给出的输入域输出域是有序集合,则应选取集合的第一元素和最后一个元素作为测试用例。如:输入条件为星期几,如果规定星期日为一周的第一天,则选取测试用例集合第一个元素:星期日,集合最后一个元素:星期六。
5.如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。如:程序采取循环结构,则可以考虑选取循环第 0 次,第 1 次,倒数第 2 次,最后 1 次等。程序采用数组,则可以考虑选取数组第一个元素和最后一个元素等。
6.分析规格说明书,找出其他可能的边界条件。
总结:边界值分析法实际上是通过优先选择不同等价类间的边界值覆盖有效等价类和无效等价类来更有效的进行测试,因此该方法需要和等价类划分法结合使用。
三、判定表法
在测试中往往需要考虑多个输入条件组合的情况,我们可以采取判定表、因果图、正交实验等方法。
判定表是分析和表达多种输入条件下系统执行不同动作的工具。在程序设计发展的初期,判定表就已被当作编写程序的辅助工具了,它可以把复杂的逻辑关系和多种条件组合的情况表达得既具体又明确。
1、判定表通常由四个部分组成:
1.条件桩:列出了系统的所有输入,列出的输入次序无关紧要。
2.动作桩:列出了系统可能采取的操作,这些操作的排列顺序没有约束。
3.条件桩:列出针对它左列输入的取值,在所有可能情况下的真假值。
4.动作项:列出在输入项的各种取值情况下应该采取的动作。
例子:手机在未欠费、有信号、开机情况下,可以正常通话。
条件桩:是否欠费、是否有信号、是否开机
条件项:(欠费:是、否)(信号:有、没有)(开机:是、否)
动作桩:是否正常通话
动作项:正常通话、不能正常通话
5.动作项和条件项一起,指出了在条件项的各种取值情况下应该采取的动作,在判定表中贯穿条件项和动作项的一列就是一条规则,规则是指任何一个条件组合的特定取值及其相应要执行的操作。在判定表中贯穿条件项和动作项的一列就是一条规则。
对于判定表可以进行化简工作,化简工作是以合并相似规则为目标的。如果表中有两条或多条规则具有相同的动作,并且其条件项之间存在极为相似的关系,我们便可以将其合并。
可以针对每个合法输入组合的规则设计用例进行测试。
2、方法使用步骤
1.标识输入和输出
逐项分析测试子项的测试规格,找出其中的输入和输出并标识出来,需要注意以下几点:
1)输入需要包括外部消息输入、内部预置的用户状态、数据配置等所有对系统输出有影响的因素;
2)输入和输出项只涉及 2 种取值的,可以只做为一个标识出来。如果输入项涉及多种取值的,每个取值需要做为一个输入标识出来;
3)标识符可以自己确定,但输入与输出需要独立标识。
2.构造判定表
将标识的输入填入条件桩部分,将标识的输出填入动作桩部分。条件项部分的列数为 2 的 n 次方列,n 为输入数。并从最右列到最左列逐列从“NN......N”到“YY......Y”填入条件项的所有组合。
3.逐列分析条件项组合,填入其动作项
分析每列的条件项取值情况,根据输入和输出逻辑关系,得到该列的输出值为“Y”或“N”,填入该列动作项,得到一条规则。如果该列条件项取值组合不合法,则动作项填入“X”。
4.简化判定表(可选)
简化判定表是将相似规则(即表中的列)进行合并,以简少测试用例,当然它是以牺牲测试用例充分性为代价的。
5.生成测试用例
简化后的判定表的每一列可以规划为一个测试用例,它的输入和输出都已经非常明确。
例子:“……对已运行10年以上的机器、或功率大于50马力且维修记录不全的机器,给予全面维修处理,对其它机器只进行一般维修处理”
3、实际应用
判定表法主要针对功能需求中的处理过程,处理过程越是复杂,越有必要使用判定表法。考虑到控制系统以及游戏的处理过程一般比较负责,因此判定表法在控制系统和游戏的测试中应用较多。
四、因果图法
1、什么是因果图法
因果图用于描述系统的输入输出、以及输入和输出之间的因果关系、输入和输入之间的约束关系。因果图的绘制过程是对被测试系统外部特征的建模过程。根据系统输入输出间的因果图可以得到判定表,从而规划出测试用例。因果图和判定表两种方法在实际使用中结合紧密,往往同时使用,此时可以理解因果图为判定表的前置过程。对于一些简单的系统,或输入与输出已经非常明确的系统,判定表可以单独使用,如前所述判定表法。
因果图需要描述下面的一些关系:
1.输入与输出之间的因果关系。因果图的表示中输入与输出间的因果关系有四种:
1)恒等关系:当输入项关系,会产生对应输出,当输入项不发生时,不会产生对应输出。
2)非关系:与恒等关系相反。
3)或关系:多个输入条件中,只要有一个发生,则会产生对应输出。
4)与关系:多个输入条件中,只有所有输入项发生中,才会产生对应输出。
2.输入与输出之间的约束关系。因果图的表示中输入与输出间的约束关系有四种:
1)异:所有输入中至多一个输入条件发生。
2)或:所有输入中至少一个输入条件发生。
3)唯一:所有输入中有且只有一个输入条件发生。
4)要求:所有输入中只要有一个输入条件发生,则其它输入也会发生。
2、使用因果分析法得步骤
1.标识输入和输出
逐项分析测试子项的测试规格,找出其中的输入和输出并标识出来,其中要注意以下几点:
1)输入需要包括外部消息输入、内部预置的用户状态、数据配置等所有对系统输出有影响的因素;
2)输入和输出项只涉及 2 种取值的,可以只做为一个标识出来。如果输入项涉及多种取值的,每个取值需要做为一个输入标识出来;
3)标识符可以自己确定,但输入与输出需要独立标识。
2.画出因果图
1)根据特性测试需求分析和 SRS 等参考文档,针对每项测试子项的测试规格,分析输入与输出之间,输入与输入之间的关系,根据这些关系,画出因果图。
2)由于语法或环境限制,有些输入与输入之间,输入与输出之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号表明约束或限制条件。
3.将因果图转换为判定表
1)将输入和输出分别填入条件桩和动作桩,并在条件项填满输入的所有组合,若输入有 n 项,则组合的列数应该为 2n 列。
2)根据因果图中的输入条件约束关系,对不可能出现的输入组合,在动作项上做出删除标记。
3)根据因果图中的输入与输出的因果关系,在动作项上标出对应动作结果。
4.简化判定表(可选)
同前文判定表法中简化步骤
5.生成测试用例
简化后的判定表的每一列可以规划为一个测试用例,它的输入和输出都已经非常明确。
3、案例
以中国象棋中马的走法为例子,具体说明:
1)如果落点在棋盘外,则不移动棋子;
2)如果落点与起点不构成日字型,则不移动棋子;
3)如果落点处有自己方棋子,则不移动棋子;
4)如果在落点方向的邻近交叉点有棋子(绊马腿),则不移动棋子;
5)如果不属于1-4条,且落点处无棋子,则移动棋子;
6)如果不属于1-4条,且落点处为对方棋子 (非老将) ,则移动棋子并除去对方棋子;
7)如果不属于1-4条,且落点处为对方老将,则移动棋子,并提示战胜对方,游戏结束。
案例分析-因果图分析法:
1)根据程序规格说明书描述的语义内容,分析并确定“因”和“果”;
原因:
1、落点在棋盘外;
2、不构成日字;
3、落点有自方棋子;
4、绊马腿;
5、落点无棋子;
6、落点为对方棋子;
7、落点为对方老将。
结果:
21、不移动;
22、移动;
23、移动己方棋子消除对方棋子;
24、移动并战胜对方。
2)将“因”和“果”表示成 “因果图”,并标明约束条件;
3)将得到的因果图转换成判定表;
11这个结点称做中间结点,是为了让因果图的结构更加明了,简化因果图导出的判定表。分析得出以下两个结论:
只有1、2、3、4都不成立时,产生11,跟5、6、7结合分别得出22、23、24三个结果;
不管5、6、7哪个成立,只要1、2、3、4有一个成立,就产生结果21;再加上落点有自方棋子的状况。
可以得到判定表如下:
进一步分析,将各种不可能产生的组合情况,取消掉,图中用灰色表示。这些都是之前没有写的一些约束条件导致的。比如落点在棋盘外,那么落点就不可能在对方棋子上了。
4、实际应用
考虑到通过画图能更好的让测试人员了解需求,看懂需求,并更快的生成判定表,因此因果图法通常作为一种辅助的方法。当能很快得到判定表的时候,就需要画因果图了。只有当处理过程过于复杂,导致不太容易看清楚时才会使用因果图法。
5、因果图法-总结
判定表、因果图等方法普遍使用与各种类特性的测试设计
优点:
1)充分考虑了输入条件间的组合,对组合情况覆盖充分。
2)最终每个用例覆盖多种输入情况,有利于提高测试效率。
3)设计过程中,对输入条件间的约束关系做了考虑,避免了无效用例,用例的有效性高。
4)能同时得出每个测试项目的预期输出。
缺点:
1)当被测试特性输入较多时,判定表的规模将会非常庞大。
2)输入之间的约束条件不能有效区分输入是否确实需要进行组合测试,会造成不需要组合测试的输入做了组合,从而产生用例冗余。
简化:
特性输入多时,会造成因果图和判定表表格庞大。考虑到每个特性可以细分为若干功能流程,而这些功能流程都有自己各自的输入,功能流程间的输入是不需要进行组合的。
为了简化工作量,在应用判定表、因果图等方法前建议对特性进行尽可能的功能流程细分,然后在对每个功能流程采用上述方法。
注意,规则化简合并存在漏测风险。一个显然易见的原因是,虽然某个输入条件在输出接口上是无关的,但是在软件设计上,内部针对这个条件走了不同的程序分支(因分析内部业务流程而定),所以在简化时需要谨慎分析。
五、正交试验法
1、正交实验设计法
是从大量的试验点中挑选出适量的、有代表性的点,应用依据伽罗瓦理论导出的 “正交表”,合理的安排试验的一种科学的试验设计方法,是研究多因子多状态(或叫做多因素多水平)的一种设计方法,它是根据正交性从全面试验中挑选出部分有代表性的点进行试验,这些有代表性的点具备了 “均匀分散,齐整可比” 的特点,正交试验设计是一种基于正交表的、搞效率、快速、经济的试验设计方法。
通常把判断试验结果优劣的标准叫做试验的指标,把所有影响试验指标的条件称为因子,而影响试验因子的叫做因子的转态。
这是一种用来测试组合的方法,这一点和判定表法类似,但判定表法是通过人工对全列组合来进行化简得到测试用例的,正交实验法是借助于数学工具,通过算法从全排列组合中选择出组合并放到正交表中,这样通过查看合适的正交表就可以直接得到测试用例。
因子可以先简单理解成输入,一个软件的各个输入就可以看成因子。这样因子的状态就是输入的取值了。
正交设计助手,下载解压文件夹就能使用:链接进入下载
2、使用正交实验实验法
1.提取功能说明,构造因子-状态表,正交设计助手中填入:
该步骤目的是要确定哪些输入和输入的取值需要进行组合。
2.加权筛选,生成因素分析表
计算各因子和转态的权值,删去一部分权值较小,即重要性较小的因子或状态,最后生成的测试用例集缩减到允许范围。
该步骤目的是要明确哪些输入和输入的取值是最需要进行组合的,这样可以压缩最后测试的组合数。
3.利用正交表构造测试数据集
1)如果各个因子的状态数是不统一的,几乎不可能出现均匀的情况。必须首先用逻辑命令来组合各因子的状态,作出布尔图。
2)根据布尔图查找最接近的相应阶数的正交表。
3)依照因果图上根节点到叶子节点的顺序逐步替换正交表上的中间节点,得到最终的正交表。
最关键的在于正交表的选取,可以按照以下原则进行选取:
如果不同因子的状态数相同,比如有 M 个因子,每个因子 N 个状态,则最好选取 M 因子 N 转态的正交表,如果该正交表不存在,则逐步增加因子数,直到找到一个存在的正交表。
如果不同因子的状态数不同,则先要确认正交表的状态数,确认的原则是哪种状态数在各个因子中出现的最多。
选好正交表后需要将实际的因子和状态带入正交表,这个时候回出现:
(1)因子的状态数 = 正交表的状态数 直接替换。
(2)因子的状态数 > 正交表的状态数 需要先将多余的状态合并,带入正交表,然后展开即可。
(3)因子的状态数 < 正交表的状态数 正交表中多出来的状态,用实际状态的任意值任意替换。
4.利用正交表每行数据构造测试用例
针对用实际因子和状态替换过的正交表中的每一行选择数据构造测试用例即可。
3、案例
1.因子:A,B,C,D
2.分析各因子状态
A:A1,A2,A3
B:无,B2,B3
C:C1,C2,C3
D:D1,D2,D3
3.选择正交表
确定选择 4 因子 3 状态的正交表。
4.将因子、状态映射到上面的正交表中:
4、实际应用
1.单个功能测试:每个输入都是因子,每个输入的取值都是状态。
2.功能组合测试:每个功能是因子,是否包含功能是状态,也就是每个因子有 2 个状态。
例如,手机有多个功能,针对多个功能同时使用来进行测试,(N个因子 2 个状态)。
3.配置测试:每个配置项是因子,每个具体配置是状态。
例如,针对 cpu 进行测试时,需要考虑 CPU 和主板、内存、显卡、声卡等配置项组合在一起后是否能正常工作,这样每个配置项就是因子,而实际型号就是状态。
5、总结
正交试验法能借助于正交表快速的设计测试用例,在工作中有的广泛的应用,但需要注意由于正交表是数学推导出来的,因此其中包含的组合并不考虑实际取值的意义,因此可能出现正交表中包含的组合不一定是用户常用的,或者用户常用的组合并未包含在正交表中。这样就需要在使用正交试验法的时候,注意选出来组合的实际意义,删除无效的组合,补充漏掉的常见的组合。
优点:根据正交性从全面试验中挑选出部分有代表性的点进行试验,这些有代表性的点具备了 “均匀分散,整齐可比” 的特点。通过使用正交试验法减少了测试用例,合理地减少测试的工时与费用,提高测试用例的有效性。是一种高效率、快速、经济的实验设计方法。
缺点:对每个状态点同等对待,重点不突出,容易造成在用户不常用的功能或场景中,花费不少时间进行测试设计与执行,而在重要路径的使用上反而没有重点测试。
虽然正交试验设计有上述不足,但它能通过部分试验找到最优水平组合,因而很受实际工作者的青睐。
六、状态迁移法
将程序或流程功能拆分成各个状态,画出状态迁移图,分析各个流程。
有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。许多需求用状态机的方式来描述,状态机的测试主要关注在测试状态转移的正确性上面。对于一个有限状态机,通过测试验证其在给定的条件内是否能够产生需要的状态变化,有没有不可达的状态和非法的状态,可能不可能产生非法的状态转移等。对于被测系统,如果我们可以抽象出它的若干个状态、以及这些状态之间的切换条件和切换路径,那么我们可以从状态迁移路径覆盖的角度来设计用例对该系统进行测试。状态迁移法的目标时设计足够的用例达到对系统状态的覆盖、状态--条件组合的覆盖以及状态迁移路径的覆盖。
1、使用步骤
1.绘制状态迁移图
1)根据特性测试需求分析和 SRS 等参考文档,针对每项测试子项的测试规格,分析有哪些系统状态,这些状态之间的迁移关系;
2)用方框代表状态、箭头代表状态迁移方向(向右),绘制状态迁移图,在箭头旁标识该状态迁移的条件。如图:
2.定义状态--条件表
分析每个状态下,输入不同条件导致的输出和状态迁移,将其列在下表:
3.根据状态迁移图推导测试路径
1)从初始状态节点(可以有多个)出发,依据广度优先原则遍历状态迁移图,遍历到结束状态节点或已遍历过的节点为一次遍历结束,得到一条测试路径。
2)选取需要测试的路径,达到规定的路径覆盖率。这里每条路径对应一个或几个测试用例规格。将测试用例规格填入下表:
其中“覆盖路径”指该用例覆盖的路径的分支序列;“覆盖的状态--条件组合”指该分支序列上各状态点和条件的组合(可不填)。
4.选取测试数据,构造测试用例
对选定的每条需要测试的路径,结合等价类、边界值分析,确定每个状态节点的输入,沿着该路径通过表格将各种测试数据的输入输出对应起来,这样就完成了测试用例的设计。编写完全的用例填入下表:
案列略,上面有一个。
2、实际应用
状态迁移图法的核心在于通过状态转换树将不同状态之间的转换串起来进行测试,而这里所说的转换也可以看成是修改、改变,因此凡是设计到改变的地方都可以考虑使用状态迁移图法。状态迁移图法主要适用于以下两种情况:
1)播放器、手机等存在工作状态不断改变的系统。
2)编辑功能,比如修改字体颜色,修改字体大小等等。
看后一种情况,如字体颜色有红、蓝、黄三种,测试颜色之间的转换,状态转换树如下:
用 4 个用例来进行测试即可。
3、总结
状态迁移图法实际上是测试了各种状态的转换,这些状态转换的测试在实际工作中是容易遗漏的。只要能将这些状态的转换测试到,是不是采用状态迁移图法并不重要,因为状态迁移图只不过是给出一种将多个状态的转换串起来进行测试的思路。
七、流程分析法
主要针对场景类型属于流程测试场景的测试项下的测试子项进行设计,这是从白盒测试中路径覆盖分析法借鉴过来的一种很重要的方法。白盒测试中,路径就是指函数代码的某个分支组合,路径覆盖法需要我们构造足够的用例覆盖函数的所有代码路径。在黑盒测试中,如果我们将软件系统的某个流程也看成路径的话,我们将可以尝试着用路径分析的方法来设计测试用例。
采用路径分析的方法设计测试用例有两点好处:
1)降低了测试用例设计难度,只要搞清了各种流程,就可以设计出高质量的测试用例来,而不用太多测试方面的经验;
2)在测试时间较紧的情况下,可以有的放矢的选择测试用例,而不用完全根据经验来取舍。
1、实施步骤
1.画出业务流程图
针对测试场景类型属于流程测试场景的测试项下的测试子项,先从其最基本的流程入手,将流程抽象成为不同单功能点的顺序执行。在最基本流程的基础上再去考虑次要或者异常的流程,这样将各种流程逐渐细化,最后完成完整的针对该测试子项的流程图。流程图可以逐渐加深对流程的理解,还可以将各个看似孤立的流程关联起来。
画流程图时需要注意:
1)圆圈描述系统状态,箭头描述该状态下的输入或外部因素(条件)引起的状态迁移;
2)需要描述正常流程和异常流程;
3)若功能流程中涉及到多个实体的,可以画到一个流程图中,在圆圈或箭头的描述部分对属于哪个实体进行说明;
4)对于与被测试子项无关的分支不需要考虑。
2.定义状态节点和条件分支
顺着功能流程,针对被测试特性的每一状态节点分析其输入(条件)、下一状态节点、输出,并填写下表:
1)分析过程是针对功能流程中的各个状态分别分析的;
2)输入需要考虑与被测试对象的各个接口,输入可能是外部用户输入、系统内部定时触发、周边系统输入等;
3)输入的分析需要详细到参数级别;
4)对系统处理的分析过程中,需要全面考虑处理过程用到哪些资源,查过哪些表格,对用户状态做过哪些判断等。这些关键点如果是外部可控的,都可列入到输入中去;
5)输出是观察点的重要依据,表示系统沿流程分支处理业务时的输出,包括消息输出、后台输出、本地数据记录等;
6)对于系统不处理的输入,或没有必要测试的输入,在表中标出。
注:在分析过程中,会发现存在状态是在其它功能流程中已经分析过的,那么不需要重复分析。
分支优先级根据两个原则来选取:一是分支使用的频率,使用越频繁的优先级越高;二是分支的重要程度,如果失败对系统影响越大的优先级越高。将根据两个原则所得到的路径各分支的优先级相加就得到了整个路径的优先级。
3.确定测试路径
步骤2 确定了每个分支的优先级后,将组成路径的各分支的优先级相加就得到了路径的优先级。给每条路径设定优先级,这样在测试时就可以先测试优先级高的,再测试优先级低的,在时间紧迫的情况下甚至可以考虑忽略一些低优先的路径。根据优先级的排序就可以更有针对性的进行测试。
根据每条路径的优先级和测试进度情况,选取需要测试的路径,达到规定的路径覆盖率。这里每条路径对应一个或几个测试用例规格。将测试用例规格填入下表:
其中“覆盖路径”指该用例覆盖的路径的分支序列;“覆盖的样点”指该分支序列上某个或某几个状态点的输入的等价类点或边界点(可不填)
通常对于有向图,采用基本路径覆盖法,对于每条基本路径规划一个用例对其进行覆盖。这里有几个概念:
环路复杂度:有向图的闭合区域数 +1;
基本路径:至少包含有一条在其它基本路径中从未有过的边的路径;
基本路径数 = 环路复杂度
这里计算环路复杂度(圈数)时,入口点要求入度(进入分支数)为 0 ,出度(出发分支数)为 1 ;出口点要求出度为 0,入度为 1 。如果入口点不符合入度、出度要求(下图),可以在入口点之上增加一个节点作为纯入口节点;出口点也可以进行类似处理。经过上述处理后,入口点、出口点不会既可能出现在路径首末端,又可能出现在路径中间。
进行了如上述处理后,再分析该有向图的基本路径。按基本路径的定义----至少包含有一条在其它基本路径中从未有过的边的路径,这个定义很容易产生歧义。这里参考线性空间的概念来理解,基本路径相当于所有路径空间(当有循环、为有向有环图时,路径数可能为无穷)的一组基,即路径空间的其他任意路径都可以由这些基本路径组合而成(这里的组合需要理解成向量基的四则运算,只能沿路径的正向和逆向进行运算)。如果一个路径可以由已有基本路径组合而成,则这个路径不是一条基本路径。
例如在某个有向图中,有两个循环,其路径为:
路径1:1-2-4-6-7;
路径2:1-2-3-2-4-6-7;
路径3:1-2-4-6-5-6-7;
有路径4:1-2-3-2-4-6-5-6-7,路径4 不为基路径。因为:路径4 - 路径2 =5-6,路径3 -路径1 = 5-6,所以 路径4 = 路径2 + 路径3 -路径1
4.选取测试数据,构造测试用例
对选定的每条需要测试的路径,结合等价类、边界值分析,确定每个状态节点的输入,沿着该路径通过表格将各种测试数据的输入输出对应起来,这样就完成了测试用例的设计。
2、实际应用
流程分析法主要用于有先后顺序的测试,主要针对:
1)业务流程的测试
2)安装流程的测试
3、总结
流程分析法的重点在测试流程,因此每个流程用一个测试用例验证即可,流程测试没有问题并不能说明系统功能就没问题了,还需要针对单步的功能来进行测试,只有这两者都测试到了,才能算是比较充分的测试。
八、输入域测试法
1、概念
输入域测试法是一种综合的方法,综合了前面提到的等价类划分法、边界值分析法等方法。这里提到的输入域就是指输入,针对输入会有各种各样的输入值。输入域测试主要考虑三个方面:
1.极端测试,需要选择测试数据覆盖输入域的极端情况
2.中间范围测试,选择内部的数据进行测试
3.特殊值测试,根据要计算的功能特性的基础来选择测试数据。这个过程尤其适合于数学计算。所要计算功能的属性可以有助于选择能够验证被计算方案正确的测试数据。例如,根据Sin()函数的周期,可以使用 2π 不同的倍数的测试数据。
对于结构化的输入域,要选择每个成员的输入点的组合。这个过程可能会产生大量的数据。如果考虑输入域之间内部联系有选择的进行组合,可以一定程度上减轻这个问题。
2、使用方法
输入域测试法实际上是在等价类划分法、边界值分析法的基础上考虑了特殊值测试等其它情况,因此从步骤来讲,只需要在使用完等价类划分、边界值分析的基础上再考虑:
1.特殊值:主要和输入的特点有关,需要了解系统对该输入的存储和处理。
2.长时间输入:对于那些没有限制输入长度的输入进行长时间的持续输入,以查看是否存在输入的数据内存越界导致系统故障的情况。
3、案例
由于等价类、边界值在前面已经提到过,因此这里重点举例说明特殊值的情况。特殊值比如年份的2038年,目前大量的软件中存在一个和2038年相关的bug,2038bug产生的原因是:
Time_t 是C/C++等编程语言在内部代表/存储日期和时间的一种数据类型。Time_t实际上是一个代表秒数的整数,当它的值为0 时,代表的时间是 1970年1月1日12:00:00;当Time_t=60时,则表示1970年1月1日12:01:00,依次类推。
所有 32位电脑系统都用带符号 32位整型来存储time_t的值,也就是说t_time只能用31位二进制数来表示(第一位用来表示正负号),而其最大值转换为十进制是2147483647,换算成日期和时间刚好是2038年1月19日03:14:07am(GMT),而这一秒过后,t_time的值将变成-2147483647,代表的是1901年12月13日8:45:52pm,这样32位软硬件系统的日期时间显示就都乱套了。另外,无法接受time_t为负值的其他功能也将返回错误。
举个例子来说,登陆上Yahoo messenger,给好友发送个消息没问题,现在把系统时间更改为2038年1月19日03:14:07am,此时如果再发消息Yahoo messenger就将崩溃。
九、输出域分析法
1、概念
在前面域测试(含等价类、边界值分析)中,是针对系统的输入域进行分析,设计用例覆盖输入域的等价类和边界值。但由于系统输出和输入之间一般并不是线性关系,所以从输出域的角度来看,这些覆盖了输入域所有等价类和边界值的用例,并不一定能完全覆盖输出的等价类和边界值。因此,我们有必要对输出域进行等价类和边界值分析,确定要覆盖的输出域样点,然后反推得到应该输入的输入值,从而构造出测试用例。这种测试方法就是输出域分析法,它的目的是为了达到输出域的等价类和边界值覆盖。
2、分析步骤
1.针对输出域划分等价类(可选),在划分过程中,划分结果可以填写到下表:
2.分析样点
针对每个等价类区域分析其上点、离点、内点,结果填写到下表:
3.确定覆盖的输出点,然后反推得到应该输入的输入值,从而构造出测试用例
从划分出的等价类中按以下三个原则设计测试用例:
1)为每一个等价类内点、上点或离点规定一个唯一的编号。
2)设计一个新的测试用例,使其输出尽可能多地覆盖尚未被覆盖地有效等价类的内点、上点或离点,重复这一步,直到所有的输出的有效等价类点都被覆盖为止。
3)设计一个新的测试用例,使其输出仅覆盖一个尚未被覆盖的无效等价类的内点、上点或离点,重复这一步,直到所有的输出的无效等价类的内点、上点或离点都覆盖为止。
设计的测试用例填写到下表:
3、案例
一软件统计代码的工具,要选择统计(.c)文件,选择要统计的项目(可以是代码行、注释行、空行、总行),点击开始统计即可。
输出的代码行数满足:
1)检查到参数【源文件全路径】中的文件后缀名不是 .c :弹出对话框,提示用户“文件【源文件全路径】不是 *.c,文件类型非法,请重新选择文件”。
2)检查到参数【源文件全路径】中所指向的文件不存在或者被其它应用程序采用独占的方式打开,提示用户“无法打开该文件,请重新选择文件!”。
3)检查到参数【源文件名】中的文件大于1M :弹出对话框,提示用户“文件【源文件全路径】超过1M ,无法统计,请选择其它文件”。
4)统计 .c 文件中的代码行数后:输出如下结果信息:“统计代码行数(非空非注释行)共XXXX行”。
如果采用输出域分析法,则首先测试用例要包含这 4 种情况,另外对于第 4 种情况而言,代码行数有其取值范围[0,最大值],这样还需要对 0 和最大值这两个边界值进行覆盖。
十、异常分析法
1、概念
异常分析法就是针对系统有可能存在的异常操作、软硬件缺陷引起的故障进行分析,依次设计测试用例。主要针对系统的容错能力、故障恢复能力进行测试。简单一点说就是人为让系统出现故障,然后检查系统的故障恢复能力。
2、分析步骤
1.针对系统罗列可能的故障
这些故障包含软件和硬件方面的故障,常见的故障有:
(1)断电
(2)断网
(3)硬件损坏
(4)数据损坏
(5)内存不够
(6)等等
为了更好的罗列故障,需要多查看用户反馈的故障报告,多深入了解被测的系统。
2.针对每种可能故障设计测试用
设计测试用例时主要要考虑如何更有效更经济的制造各种故障。
3、案例
针对某在线音乐播放器进行测试,需要考虑断网的异常。从测试用例的角度来说,就是先用该播放器播放歌曲,然后拔掉网线,人为制造断网的故障,过一段时间后再接上网线,恢复网络,这时候来看一下播放器是否能正常工作。
十一、错误猜测法
1、概念
在软件测试中,人们可以靠经验和直觉推测系统中可能存在的各种错误,从而有针对性地编写检查这些错误的例子,这就叫错误推测法。其基本想法是:根据以往的测试经验和对系统内部知识的了解,列出系统中各种可能有的错误和容易发生错误的特殊情况,在根据它们来设计测试用例。随着在产品测试的实践中对产品的了解的加深和测试经验的丰富,使用错误推理法设计的测试用例往往非常有效,可以作为测试设计的一种补充手段。并且积累的经验越丰富,方法使用效率越高。
错误猜测法不是瞎猜,它需要依据对系统薄弱地方的了解和对开发人员盲点的了解。错误猜测需要了解错误,因此需要了解缺陷分类,了解了缺陷分类更加有利于定性地从大方面体系地把握错误、提高错误推测的全面性以及城市用例的命中率(有效性)。关于缺陷的分类,如果公司已经开展了ODC正交缺陷分析的话,可以参考公司有关缺陷分类文档,如果没有,最好进行明确定义。缺陷分类活动和错误猜测法的区别是,缺陷分类活动对缺陷进行定性分类找出改进点,主要关注缺陷预防;错误猜测关注于设计测试用例去发现问题。
错误猜测法有时是非常有效的,但要注意错误猜想法只能作为测试设计的补充而不能单独用来设计测试用例,否则可能会造成测试的不充分。也就是说,错误猜测法只是针对系统可能存在的薄弱环节的测试补充,而不是为了覆盖而测试。
2、使用步骤
1.确定合适的错误猜测 CHECKLIST
在进行错误推测前需要根据软件的具体特点制订错误猜测 CHECKLIST,使之适合在本软件当前版本的测试用例设计中有效的使用。该 CHECKLIST 可以根据缺陷分类文档来合理设计,保证 CHECKLIST 的完整性。下面是错误猜测 CHECKLIST 的样例:
2.确定需要进行错误猜测的测试子项
错误猜测方法并不是任何时候和每个地方都需要使用的。如果是简单的功能验证,影响因素已经非常清楚和简单的情况下没有必要进行各种错误猜测。对于影响因素比较复杂的、系统性的测试规格,可能需要作为常规特性测试设计的补充,使用错误猜测方法进行特性测试设计。在特性测试需求分析活动时就应该确定哪些测试子项需要运用错误猜测法进行测试设计。
3.根据 CHECKLIST 检查对应测试子项的规格进行错误猜测
确定了需要进行错误猜测的测试子项,与错误推测 CHECKLIST 以后,就需要对每个测试子项的规格按照 CHECKLIST 逐一分析比对,如果发现有对应的“易错误点”,(在 CHECKLIST 中)标记“有”,并将具体的内容写入“测试用例”表,直到全部需要进行错误猜测的测试子项对比分析完毕。
设计的测试用例填写到下表:
3、案例
写一段程序重新格式化文本,具体如下:
给定一个文本,以 CHECKLIST 字符结尾,并且文本内的字之间使用 BLANK 或者 NEWLINE 字符隔开,根据下面规则把该文本转成一行接一行的格式:
(1)行在文本有 BLANK 或 NEWLINE 处中断;
(2)行尽可能长;
(3)没有行可以有超过 MAXPOS 长度的字符。
这段规格会使一个有经验的程序员怀疑程序能否在下面这些情况下正确工作(因此可以从这些情况中选择测试用例):
(1)输入文本长度是零
(2)文本包含一个非常长的字(超过 MAXPOS)
(3)文本除了 BLANK 和 NEWLINE 之外没有任何别的字符
(4)一个文本有一个空行
(5)字被两个或更多个 NEWLINE 或 BLANK 分隔
(6)BLANK 为行的开头或结束字符
(7)文本包含数字或特殊字符
(8)文本包含不可打印字符
(9)MAXPOS 被设置为一个超过系统默认行长度的数字
十二、总结
下面通过一个表格将主要的黑盒测试用例设计方法进行归纳总结:
学习笔记
2020-04-12