《软件测试的艺术》读书笔记(四)

第 4 章 测试用例的设计

由于书中给了很详细的例子,本章主要节选理论知识。

和预期不一样的是,这一张并不是教怎么设计一个具体的用例,而是更注重理论。

没有相当的编程基础的话很难看得懂,再次证明想做测试并且做得好,需要的能力并不比程序员低。

那些只会点点点的测试,也就和初级程序员一样,还没走出新手村。

没有人曾承诺说:软件测试会是容易的事。引用一位智者的话,“如果你觉得设计和编写程序很困难,你就并非一无所知。”

推荐的步骤是先使用黑盒测试方法来设计测试用例,然后视情况需要使用白盒测试方法来设计补充的测试用例。

4.1 白盒测试(White-Box Testing)

4.1.1 逻辑覆盖测试(Logic-Coverage Testing)

对于包含每个判断只存在一种条件的程序,最简单的测试准则就是设计出足够数量的测试用例,实现:

(1)将每个判断的所有结果都至少执行一次;
(2)将所有的程序入口(例如入口点或 ON 单元)都至少调用一次,以确保全部的语句都至少执行一次。

而对于包含多重条件判断的程序,最简单的测试准则是设计出足够数量的测试用例,将每个判断的所有可能的条件结果的组合,以及所有的入口点都至少执行一次(加入“可能”二字,是因为有些组合情况难以生成)。

4.1.2 等价划分(Equivalence Partitioning)

1.确定等价类

选取每一个输入条件(通常是规格说明中的一个句子或短语)并将其划分为两个或更多的组。

有效等价类代表对程序的有效输入,而无效等价类代表的则是其他任何可能的输入条件(即不正确的输入值)。

指导原则:

1. 如果输入条件规定了一个取值范围(例如,“数量可以是从 1 到 999”),那么就应确定出一个有效等价类(1<数量<999 ) ,以及两个无效等价类(数
量<1,数量>999)。
2. 如果输入条件规定了取值的个数(例如,“汽车可登记一至六名车主”),那么就应确定出一个有效等价类和两个无效等价类(没有车主,或车主多于六个)。
3. 如果输入条件规定了一个输入值的集合,而且有理由认为程序会对每个值进行不同处理(例如,“交通工具的类型必须是公共汽车、卡车、出租车、火车或摩托车”),那么就应为每个输入值确定一个有效等价类和一个无效
等价类(例如,“拖车”)。
4. 如果存在输入条件规定了“必须是”的情况,例如“标识符的第一个字符必须是字母”,那么就应确定一个有效等价类(首字符是字母)和一个无效等价类(首字符不是字母)。

改成表格看起来更形象:

输入条件 举例 有效等价类 无效等价类
取值范围 数量可以是从 1 到 999 1 2
取值的个数 汽车可登记一至六名车主 1 2
输入值的集合 交通工具的类型必须是公共汽车、卡车、出租车、火车或摩托车 1 1
“必须是”的情况 标识符的第一个字符必须是字母 1 1

2.生成测试用例

使用等价类来生成测试用例,其过程如下:
1. 为每个等价类设置一个不同的编号。
2. 编写新的测试用例,尽可能多地覆盖那些尚未被涵盖的有效等价类,直到所有的有效等价类都被测试用例所覆盖(包含进去)。
3. 编写新的用例,覆盖一个且仅一个尚未被覆盖的无效等价类,直到所有的无效等价类都被测试用例所覆盖。 

4.1.3 一个范例

等价划分方法的不足:这种方法忽略了某些特定类型的高效测试用例

4.1.4 边界值分析(Boundary-Value Analysis)

经验证明,考虑了边界条件的测试用例与其他没有考虑边界条件的测试用例相比,具有更高的测试回报率。

边界条件,是指输入和输出等价类中那些恰好处于边界、或超过边界、或在边界以下的状态。

边界值分析方法与等价划分方法存在两方面的不同:

1. 与从等价类中挑选出任意一个元素作为代表不同,边界值分析需要选择一个或多个元素,以便等价类的每个边界都经过一次测试。

2. 与仅仅关注输入条件(输入空间)不同,还需要考虑从结果空间(输出等价类)设计测试用例。

通用指南:

如果输入条件规定了一个输入值范围,那么应针对范围的边界设计测试用例,针对刚刚越界的情况设计无效输入测试用例。
如果输入条件规定了输入值的数量,那么应针对最小数量输入值、最大数量输入值,以及比最小数量少一个、比最大数量多一个的情况设计测试用例。
对每个输出条件应用指南 1。
对每个输出条件应用指南 2。
如果程序的输入或输出是一个有序序列(例如顺序的文件、线性列表或表格),则应特别注意该序列的第一个和最后一个元素。
此外,发挥聪明才智找出其他的边界条件。

如果使用得正确,边界值分析是最为有效的测试用例设计方法之一。然而,这种方法常常使用得不好,因为表面上它听起来比较简单。

4.1.5 因果图(Cause-Effect Graphing)

边界值分析和等价划分的一个弱点是未对输入条件的组合进行分析。

对输入组合进行测试并不是简单的事情,因为即使对输入条件进行了等价划分,这些组合的数量也是个天文数字。

因果图有助于用一个系统的方法选择出高效的测试用例集。它还有一个额外的好处,就是可以指出规格说明的不完整性和不明确之处。

生成测试用例时采用的过程如下:

  1. 将规格说明分解为可执行的片段。
  2. 确定规格说明中的因果关系。
  3. 分析规格说明的语义内容,并将其转换为连接因果关系的布尔图。
  4. 给图加上注解符号,说明由于语法或环境的限制而不能联系起来的“因”和“果”。
  5. 通过仔细地跟踪图中的状态变化情况,将因果图转换成一个有限项的判定表。表中的每一列代表一个测试用例。
  6. 将判定表中的列转换成测试用例。

因果图方法是一个根据条件的组合而生成测试用例的系统性的方法。

由于因果图方法需要将规格说明转换为一个布尔逻辑网络,因此它使我们从不同的视角,以更多的洞察力来审视规格说明。

事实上,建立因果图是一个暴露规格软件测试的艺术说明中模糊和不完整之处的好方法。

尽管因果图方法确实能产生一组有效的测试用例,但通常它不能生成全部应该被确定的有效测试用例。

由于因果图方法给我们提供了选择操作对象具体值的灵活性,在由因果图生成测试用例时,可以将边界条件分析一并考虑进去。

4 .2 错误猜测(Error Guessing)

利用直觉和经验猜测出错的可能类型,然后编写测试用例来暴露这些错误。

其基本思想是列举出可能犯的错误或错误易发情况的清单,然后依据清单来编写测试用例。

4.3 测试策略

合理的策略如下:
1. 如果规格说明中包含输入条件组合的情况,应首先使用因果图分析方法。
2. 在任何情况下都应使用边界值分析方法。应记住,这是对输入和输出边界进行的分析。边界值分析可以产生一系列补充的测试条件,但是,也正如“因果图分析”一节所述,多数甚至全部条件都可以被整合到因果图分析中。
3. 应为输入和输出确定有效和无效等价类,在必要情况下对上面确认的测试用例进行补充。
4. 使用错误猜测技术增加更多的测试用例。
5. 针对上述测试用例集检查程序的逻辑结构。应使用判定覆盖、条件覆盖、判定/条件覆盖或多重条件覆盖准则(最后的一个最为完整)。如果覆盖准则未能被前四个步骤中确定的测试用例所满足,并且满足准则也并非不可能(由于程序的性质限制,某些条件的组合也许是不可能实现的),那么增加足够数量的测试用例,以使覆盖准则得到满足。

 

posted @ 2022-09-26 19:00  丸子233  阅读(74)  评论(0)    收藏  举报