黑盒测试案例设计技术(2)
测试用例设计方法
软件测试是一个工程,需要按照工程的角度去认识软件测试,在具体的测试实施之前,我们需要明白我们测试什么,怎么测试等,也就是说通过制定测试用例指导测试的实施。
正交试验法
利用因果图来设计测试用例时,作为输入条件的原因与输出结果之间的因果关系,有时很难从软件需求规格说明中得到。往往因果关系非常庞大,导致利用因果图二得到的测试用例数目多得惊人,给软件测试带来沉重的负担。为了有效地、合理地减少测试的工时与费用,可利用正交试验法进行测试用例的设计。
1.正交试验设计方法
依据Galois理论,正交试验设计方法是从大量的试验数据中挑选适量的、有代表性的点,从而合理地安排测试的一种科学的试验设计方法。正交试验法,就是使用已经造好了的表格“——”正交表来安排试验并进行数据分析得一种方法。它简单易行并且计算表格化,应用性较好。
例题:为提高某化工产品的转化率,选择了三个有关因素进行条件试验,反正温度(A),反应时间(B),用碱量(C),并确定了它们的试验范围如下。
-
A:80~90℃;
-
B:90~150分钟;
-
C:5%~7%。
试验目的是搞清楚因子A、B、C对转化率有什么影响,哪些是主要的,哪些是次要的,从而确定最适生产条件,即温度、时间及用碱量各位多少才能转化率最高。这里,对因子A、B、C,在试验范围内都选了三个水平,如下:
-
A:A1=80℃,A2=85℃,A3=90℃;
-
B:B1=90分钟,B2=120分钟,B3=150分钟;
-
C:C1=5%,C2=6%,C3=7%。
当然,在正交试验设计中,因子可以是定量的,也可以是定性。而定量因子各水平间的距离可以相等,也可以不相等。这个三因子三水平的条件试验,通常由两种试验方法:
①取三因子所有水平之间的组合,即A1B1C1,A1B1C2,A1B2C1,……,A3B3C3,共有3 ³=27次试验。用图5-7表示立方体的27个节点。这种试验法叫做全面试验法。
全面试验对各因子与指标间的关系剖析得比较清楚。但试验次数太多。特别是当因子数目多每个因子的水平数目也很多时,试验量非常大。如选6个因子,每个因子取5个水平时,如果想做全面试验,则需56=15625次试验,这实际上是不可能实现的。如果应用将要介绍的正交试验法,只做25次试验就行了。而且在某种意义上讲,这25次试验代表了15625次。
②简单对比法,即变化一个因素而固定其他因素,如首先固定B、C于B1、C1,使A变化:
如得出结果A3最好,则固定A于A3,C还是C1,使B变化:
得出结果以B2为最好,则固定B于B2,A于A3,使C变化:
试验结果以C2为最好。于是就认为最好的工艺条件是A3B2C2。
这种方法一般也有一定的效果,但缺点很多。首先这种方法的选点代表性很差,如按上述方法进行试验,试验点完全分布在一个角上,而在一个很大的范围内没有选点,因此这样试验方法不全面,所选的工艺条件A3B2C2不一定是27个组合中最好的。其次,用这种方法比较条件好坏时,是把单个的试验数据拿来,进行数值上的简单比较,而试验数据中心必然包含着误差成分,所以单个数据的比较不能剔除误差,必然造成结论的不稳定。
简单对比法的最大优点就是试验次数少,例如,6因子5水平试验,在不重复时,只用5+(6-1)*(5-1)=25次试验就可以了。
考虑兼顾这两种试验方法的优点,从全面试验的点中选择具有典型性、代表性的点,使试验点在试验范围内分布得很均匀,能反映全面情况。但我们又希望试验点尽量地少,为此还要具体考虑一些问题。如上例,对应于A有A1、A2、A3 3个平面,对应于B、B也个有3个平面,共9个平面。则这9个平面上的试验点都应当一样多,即对每个因子的每个水平都要同等看待。具体来说,每个平面上都有3行、3列,要求在每行、每列上的点一样多。这样做出如图5-8所示的设计,试验点用⊙表示。我们看到,在9个平面中每个平面上都恰好有3个点,而每个平面的每行每列都有1个点,而且只有1个点,总共9个点。这样的试验方案,试验点的分布很均匀,试验次数也不多。
但因子数和水平数都不太大时,尚可通过作图的办法来选择分布很均匀的试验点。但是因子数和水平数多了,作图的方法就不行了。试验工作者在长期的工作中总结出一套办法,创造出所谓的正交表。按照正交表来安排试验,既能使试验点分布均匀,又能减少试验次数,而且计算分析简单,能够清晰地阐明试验条件与指标之间的关系。用正交表来安排试验及分析试验结果,这种方法叫正交试验设计法。
一般用L代表正交表,常用的由L8(27)、L9(34)、L16(45)、L8(27)等。此符号各数字的意义如下。
例如:L8(27),其中,7为此表列的数目(最多可安排的因子数);2为因子的水平数;8为此表行的数据(试验次数)。又例如:L18(2*37),有7列是3水平的,有1列是2水平的, L18(2*37)的数字告诉我们,用它来安排试验,做18个试验最多可以考察一个2水平因子和7个3水平因子。
在行数为mn型的正交表中(m,n是正整数),试验次数(行数)= ∑(每列水平数-1)+1,如L8(27),8=7*(2-1)+1,利用上述关系式可以从所要考察的因子水平数来决定最低的试验次数,进而选择合适的正交表。比如要考察5个3水平因子及一个2水平因子,则起码的试验次数为5*(3-1)+1*(2-1)+1=12(次),这就是说,要在行数小于12,既有2水平列又有3水平列的正交表中选择,L18(2*37)合适。正交表具有两条性质:每一列中各数字出现的次数都一样多;任何两列所构成的各有序数对出现的次数都一样多。所以称之为正交表。
例如,在 L9(34)中(如表5-7所示),各列中的1、2、3都各自出现3次;任何两列,例如第3、4列,所构成的有序数对从上向下共9中,既没有重复也没有遗漏。其他任何两列所构成的有序数对也是这9种各出现一次。这反映了试验点分布得均匀性。
试验方案应该如何设计呢?安排试验时,只要把所考察的每一个因子任意地对应于正交表的一列(一个因子对应一列,不能让两个因子对应一列),然后把每列的数字“翻译”成所对应因子的水平。这样,每一列的各水平组合就构成了一个试验条件(不考虑没安排因子的列)。对于上例,因子A、B、C都是3水平的,实验次数要不少于3*(3-1)+1=7(次),可考虑选用L9(34)。因子A、B、C可任意地对应于L9(34)的某三列,例如A、B、C分别放在1、2、3列,然后试验按行进行,顺序不限,每一行中各因素的水平组合就是每一次的试验条件,从上到下就是这个正交试验的方案,如表5-8所示。这个试验方案的几何解释正好是正交试验设计图例。
3个3水平的因子,做全面试验需要33=27次试验,现用L9(34)来设计试验方案,只要做9次,工作量减少了2/3,而在一定意义上代表了27次试验。
2.正交试验测试用例设计步骤
利用正交试验设计测试用例的步骤如下。
-
提取功能说明,构造因子“——”状态表。把影响实验指标的条件称为因子,而影响实验因子的条件叫做因子的状态。利用正交试验设计方法来设计测试用例时,首先要根据被测试软件的规格说明找出影响其功能实现的操作对象和外部因素,把它们当作因子,而把各个因子的取值当做状态。对软件需求规格说明中的功能要求进行划分,把整体的、概要性的功能要求进行层层分解与展开,分解成具体的、有相对独立性的基本的功能要求。这样的可以把被测试软件中所有的因子都确定下来,并为确定因子的权值提供参考的依据。确定因子与状态是设计测试用例的关键。因此,要求尽可能全面地、正确地确定取值,以确保测试用例的设计做到完整与有效。
-
加权筛选,生成因素分析表。对因子与状态的选择可按其重要程度分别加权。可根据各个因子及状态作用的大小、出现频率的大小以及测试的需要,确定权值的大小。
-
利用正交表构造测试数据集,正交表的推导依据Galois理论。
利用正交试验设计方法设计测试用例,与使用等价类划分、边界值分析、因果图等方法相比,有以下优点:节省测试工作工时;可控制生成的测试用例的数量;测试用例具有一定的覆盖率。
正交试验法爱软件处测试中是一种有效的方法,例如在平台参数配置方面,我们要选择哪种组合方法是最好的,每个参数可能就是一个因子,参数的不同取值就是水平,这样我们可以采用正交试验法设计出最少的测试组合,达到有效的测试目的。
功能图法
一个程序的功能说明通常由动态说明和静态说明组成。动态说明描述了输入数据的次序或转移的次序。静态说明描述了输入条件与输出条件之间的对应关系。对于较复杂的程序,由于存在大量的组合情况,因此,仅用静态说明组成的规格说明对于测试来说往往是不够的,必须用动态说明来补充功能说明。
1.功能图设计方法
功能图方法是用功能图形象地表示程序的功能说明,并机械地生成功能图的测试用例。功能图模型由状态迁移图和逻辑功能模型构成。
-
状态迁移图用于表示输入数据序列以及相应的输出数据。在状态迁移图中,有输入数据和当前状态决定输出数据和后续状态。
-
逻辑功能模型用于表示在状态中输入条件和输出条件之间的对应关系。逻辑功能模型只适合于描述静态说明,输出数据仅由输入数据决定。测试用例则是由测试中经过的一系列状态和在每个状态中必须依靠输入/输出数据满足的一对条件组成。
功能图方法中要用到逻辑覆盖和路径测试的概念和方法,属白盒测试方法中的内容。逻辑覆盖是以程序内部的逻辑结构为基础的测试用例设计方法,该方法要求测试人员对程序的逻辑结构有清楚的了解。由于覆盖测试的目标不同,逻辑覆盖可分为:语句覆盖、判定覆盖、判定—条件覆盖,条件组合覆盖及路径覆盖。下面我们指的逻辑覆盖和路径是功能或系统水平上的,以区别于白盒测试中的程序内部的,如图5-9及表5-9所示。
2.功能图法生产测试用例
功能图由状态迁移图和布尔函数组成。状态迁移图用状态和迁移来描述一个状态,指出数据输入的位置(或时间),而迁移则指明状态的改变,同时要依靠判定表和因果图表示的逻辑功能。
采用什么样的方法生成测试用例?从功能图生成测试用例,得到的测试用例数量是可接受的。问题的关键是如何从状态迁移图中选取测试用以。若用节点代替状态,用弧线代替迁移,状态迁移图就可转化成一个程序的控制流程图形式。问题就转化为程序的路径测试问题(白盒测试范畴概念)了。
测试用例生成规则:为了把状态迁移(测试路径)的测试用例与逻辑模型的测试用例组合起来,从功能图生成实用的测试用例,需定义下面的规则。一个结构化的状态迁移中,定义3种形式的循环:顺序、选择和重复。但分辨一个状态迁移中的所有循环是有困难的。
从功能图生成测试用例的过程如下。
-
生成局部测试用例:在每个状态中,从因果图生成局部测试用例。局部测试库由原因值(输入数据)组合与对应的结果值(输出数据或状态)构成。
-
测试路径生成:利用上面的规则生成从初始状态到最后状态的测试路径。
-
测试用例合成:合成测试路径与功能图中每个状态的局部测试用例。结果是视状态到最后状态的一个状态序列,以及每个状态中输入数据与对应输出数据组合。
-
测试用例的合成算法:采用条件构造树。
场景法
现在的软件几乎都是用时间触发来控制流程的,事件触发时的情景便形成了场景,而同一事件不同的触发顺序和处理结果就形成事件流。这种在软件设计方面的思想也可引入到软件厕所中,可以比较生动地描绘出事件触发时的情景,有利于测试设计者设计测试用例,同时使测试用例更容易理解和执行。用例场景用来描述流经用例的路径,从用例开始到结束遍历这条路径上所有基本流和备选流。
1.基本流和备选流
如图5-10所示,图中经过用例的每条路径都用基本流和备选流来表示,直黑线表示基本流,是经过用例的最简单的路径。备选流用不同的曲线表示,一个备选流可能从基本流开始,在某个特定条件下执行,然后重新加入基本流中(如备选流1和3);也可能起源于另一个备选流(如备选流2),或者终止用例而不再重新加入到某个流(如备选流2和4)。
按照如图5-10中所示的每个经过用例的路径,可以确定一下不同的用例场景。
-
场景1:基本流;
-
场景2:基本流、备选流1;
-
场景3:基本流、备选流1、备选流2;
-
场景4:基本流、备选流3;
-
场景5:基本流、备选流3、备选流1;
-
场景6:基本流、备选流3、备选流1、备选流2;
-
场景7:基本流、备选流4;
-
场景8:基本流、备选流3、备选流4.
2.ATM例子
(1)例子描述
如图5-11所示是ATM例子的流程示意图。
如表5-10所示,包含了如图5-11中所示提款用例的基本流和某些备选流。
(2)场景设计
如表5-11所示是生成的场景。
(3)用例设计
对于这7个场景中的每一个场景都需要确定测试用例,一般采用矩阵或决策表来确定和管理测试用例。如表5-12所示是一种通用格式,其中行代表各个测试用例,列代表测试用例的信息。本例中的测试用例包含测试用例ID、场景/条件、测试用例红涉及的所有数据元素和预期结果等项目。首先确定执行用例场景所需的数据元素,然后构建矩阵,最后要确定包含执行场景所需的适当条件的测试用例。在下面的矩阵中,V表示这个条件必须是有效的才可执行基本流,I表示这种条件下将激活所需备选流,n/a表示这个条件不适用与测试用例。
在上面的矩阵中,六个测试用例执行了四个场景。对于基本流,上述测试用例CW1被称为正面测试用例。它一直沿着用例的基本流路径执行,未发生任何偏差。基本流的全面测试必须包括负面测试用例,以确保只有在符合条件的情况下才执行基本流。这些负面测试用例由CW2~CW6表示。虽然CW2~CW6相对于基本流而言都是负面测试用例,但它们相对于备选流2~4而言是正面测试用例。而且对于这些备选流中的每一个而言,至少存在一个负面测试用例,就是CW1—基本流。
每个场景只有一个正面测试用例和负面测试用例时不充分的,场景4正是这样的一个示例。要全面地测试场景4—PIN有误,至少需要三个正面测试用例,以激活场景4:
①输入了错误的PIN,但仍存在输入机会,此备选流重新加入基本流中的步骤3—输入PIN。
②输入了错误的PIN,而且不再有输入机会,则此备选流将保留银行卡并终止用例。
③最后一次输入时输入了“正确”的PIN,备选流在步骤5—输入金额处重新加入基本流。
注意,在上面的矩阵中,无需为条件输入任何实际的值。以这种方式创建测试用例矩阵的一个优点在于容易看到测试的是什么条件。由于只需要查看V和I,这种方式还易于判断是否已经确定了充分的测试用例。从表5-12中可发现存在几个无效的条件I ,这表明测试用例还不完全,如场景6—不存在的账户/账户类型有误和场景7—账户余额不足就缺少测试用例。
(4)数据设计
一旦确定了所有的测试用例,则应对这些进行复审和验证以确保其准确且适度,并取消多余或等效的测试用例。
测试用例一经认可,就可以确定实际数据值(在测试用例实施矩阵中)并且设定测试数据。以上测试用例只是本次迭代中需要用来验证提款用例的一部分测试用例。需要的其他测试用例包括以下内容。
-
场景6——账户不存在/账户类型有误:未找到账户或账户不可用;
-
场景6——账户不存在/账户类型有误:禁止从该账户中提款;
-
场景7——账户余额不足:请求的金额超出账面金额。
在奖来的迭代中,当实施其他事件流时,在下列情况下将需要测试用例:
①无效卡(所持卡为挂失卡、被盗卡、非承兑银行卡、磁条损坏等);
②无法读卡(读卡机堵塞、脱机或出现故障);
③账户已消户、冻结或由于其他发面原因而无法使用;
④ATM内的现金不足或不能提供所请求的金额(与CW3不同,在CW3中只有一种币值不足,而不是所有币值都不足);
⑤无法联系银行系统以获得认可;
⑥银行网络离线或交易过程中断电。
结论:所有从事软件测试和即将从事软件测试的人大都是从黑盒测试做起的,每种类型的软件有各自的特点,每种测试用例设计的方法也有各自的特点,针对不同软件如何利用这些黑盒方法是非常重要的,它能极大地提高测试效率和测试覆盖度,认真掌握这些方法的原理,有效提高测试水平,积累更多的测试经验,这是测试人员最宝贵的财富。
测试方法选择的综合策略
测试用例的设计方法不是单独存在的,具体到每个测试项目里都会用到多种方法,每种类型的软件有各自的特点,每种测试用例设计方法也有各自的特点,针对不同软件如何利用这些黑盒方法是非常重要的,在实际测试中,往往是综合使用各种方法才能有效地提高测试效率和测试覆盖率,这种需要认真掌握这些方法的原理,积累更多的测试经验,以有效地提高测试水平。
以下是各种测试方法选择的综合策略,可供读者在实际应用过程中参考。
①首先进行等价类划分,包括输入条件和输出条件的等价划分,将无限测试变成有限测试,这是减少工作量和提高测试效率最有效的方法。
②在任何情况下都必须使用边界值分析方法。经验表明,用这种方法设计出的测试用例发现程序错误的能力最强。
③可以用错误推测法追加一些测试用例,这需要依靠测试工程师的智慧和经验。
④对照程序逻辑,检查已设计出的测试用例的逻辑覆盖程度。如果没有达到要求的覆盖标准,应当再补充足够的测用例。
⑤如果程序的功能说明中含有输入条件的组合情况,则一开始就可以选用因果图法和判定表驱动法。
⑥对于参数配置类的软件,要正交试验法选择较少的组合方式达到最佳效果。
⑦功能图法也是很好的测试用例设计方法,我们可以通过不同时期条件的有效性设计不同的测试数据。
⑧对于业务流清晰的系统,可以利用场景法贯穿整个测试案例过程,在案例中综合使用各种测试方法。