|
|
@ -4,7 +4,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
黑盒测试又称为功能测试或数据驱动测试,着眼于程序外部结构,将被测试程序视为一个不能打开的黑盒子,完全不考虑程序内部逻辑结构和内部特性,主要针对软件界面、软件功能、外部数据库访问以及软件初始化等方面进行测试。
|
|
|
|
黑盒测试又称为功能测试或数据驱动测试,着眼于程序外部结构,将被测试程序视为一个不能打开的黑盒子,完全不考虑程序内部逻辑结构和内部特性,主要针对软件界面、软件功能、外部数据库访问以及软件初始化等方面进行测试。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
> 主要目的
|
|
|
|
> 主要目的
|
|
|
|
|
|
|
|
|
|
|
@ -18,7 +18,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
> 黑盒测试常用的方法和技术
|
|
|
|
> 黑盒测试常用的方法和技术
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
## 边界值测试
|
|
|
|
## 边界值测试
|
|
|
|
|
|
|
|
|
|
|
@ -56,35 +56,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
为便于理解,假设有两个变量 x1 和 x2 的函数 F,其中函数 F 实现为一个程序, x1、x2 在下列范围内取值: a≤x1≤bc≤x2≤d 区间[a,b]和[c,d]是 x1、x2 的值域,程序 F 的输入定义域如下图所示,即带阴影矩 形中的任何点都是程序 F 的有效输入。
|
|
|
|
为便于理解,假设有两个变量 x1 和 x2 的函数 F,其中函数 F 实现为一个程序, x1、x2 在下列范围内取值: a≤x1≤bc≤x2≤d 区间[a,b]和[c,d]是 x1、x2 的值域,程序 F 的输入定义域如下图所示,即带阴影矩 形中的任何点都是程序 F 的有效输入。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
采用边界值分析测试的基本原理是:故障往往出现在输入变量的边界值附近。
|
|
|
|
采用边界值分析测试的基本原理是:故障往往出现在输入变量的边界值附近。
|
|
|
|
例如,当一个循环条件为“≤”时,却错写成“<”,计时器发生少计数一次。
|
|
|
|
例如,当一个循环条件为“≤”时,却错写成“<”,计时器发生少计数一次。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
边界值分析测试的基本思想是使用在最小值(min)、略高于最小值(min+)、正常值(nom)、略低于最大值(max-)和最大值(max)处取输入变量值。同时,对于有多个输入变量的情况我们通常是基于可靠性理论中称为“单故障”的假设,这种假设认为有两个或两个以上故障同时出现而导致软件失效的情况很少,也就是说,软件失效基本上是由单故障引起的。因此,边界值分析测试用例的获得,是通过使一个变量取极值,剩下所有变量取正常值。
|
|
|
|
边界值分析测试的基本思想是使用在最小值(min)、略高于最小值(min+)、正常值(nom)、略低于最大值(max-)和最大值(max)处取输入变量值。同时,对于有多个输入变量的情况我们通常是基于可靠性理论中称为“单故障”的假设,这种假设认为有两个或两个以上故障同时出现而导致软件失效的情况很少,也就是说,软件失效基本上是由单故障引起的。因此,边界值分析测试用例的获得,是通过使一个变量取极值,剩下所有变量取正常值。
|
|
|
|
|
|
|
|
|
|
|
|
因此,边界值分析测试用例的获得,是通过使一个变量 取极值,剩下所有变量取正常值。前面有两个输入变量的程序 F 的边界值分析测试用例(如图 3.2 所示)是:
|
|
|
|
因此,边界值分析测试用例的获得,是通过使一个变量 取极值,剩下所有变量取正常值。前面有两个输入变量的程序 F 的边界值分析测试用例(如图 3.2 所示)是:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
{ < x1nom ,x2min >, < x1nom ,x2min+ >, < x1nom , x2nom >, < x1nom , x2max- >, < x1nom , x2max >,< x1min , x2nom >,< x1min+ , x2nom >, < x1max- , x2nom >, < x1max , x2nom > }
|
|
|
|
{ < x1nom ,x2min >, < x1nom ,x2min+ >, < x1nom , x2nom >, < x1nom , x2max- >, < x1nom , x2max >,< x1min , x2nom >,< x1min+ , x2nom >, < x1max- , x2nom >, < x1max , x2nom > }
|
|
|
|
对于一个含有 n 个变量的程序,保留其中一个变量,让其余的变量取正常值,被 保留的变量依次取 min、 min+、nom、max-、max 值,对每个变量都重复进行。这样, 对于一个有 n 个变量的程序,边界值分析测试程序会产生 4n+1 个测试用例。如果没有显式的给出边界,如三角形问题,则必须创建一种人工边界,可以先设定下限值(边长应大于等于 1),并规定上限值,如 100,或取默认的最大可表示的整数值。
|
|
|
|
对于一个含有 n 个变量的程序,保留其中一个变量,让其余的变量取正常值,被 保留的变量依次取 min、 min+、nom、max-、max 值,对每个变量都重复进行。这样, 对于一个有 n 个变量的程序,边界值分析测试程序会产生 4n+1 个测试用例。如果没有显式的给出边界,如三角形问题,则必须创建一种人工边界,可以先设定下限值(边长应大于等于 1),并规定上限值,如 100,或取默认的最大可表示的整数值。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
> 健壮性测试
|
|
|
|
> 健壮性测试
|
|
|
|
|
|
|
|
|
|
|
|
健壮性测试是边界分析测试的一种简单扩展,除了取 5 个边界值分析取值外,还需要考虑采用一个略超过最大值(max+)以及略小于最小值(min-)的取值,检查超过极限值时系统的表现会是什么。健壮性测试最有意义的部分不是输入,而是预期的 输出。它要观察例外情况如何处理,比如某个部分的负载能力超过其最大值可能出现的情形。健壮性测试如图 3.3 所示。
|
|
|
|
健壮性测试是边界分析测试的一种简单扩展,除了取 5 个边界值分析取值外,还需要考虑采用一个略超过最大值(max+)以及略小于最小值(min-)的取值,检查超过极限值时系统的表现会是什么。健壮性测试最有意义的部分不是输入,而是预期的 输出。它要观察例外情况如何处理,比如某个部分的负载能力超过其最大值可能出现的情形。健壮性测试如图 3.3 所示。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
### 边界值分析法测试实例
|
|
|
|
### 边界值分析法测试实例
|
|
|
|
|
|
|
|
|
|
|
|
> 三角形问题
|
|
|
|
> 三角形问题
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
问题描述:
|
|
|
|
问题描述:
|
|
|
|
三角形问题接受三个整数 a、b 和 c 作为输入,用做三角形的边。
|
|
|
|
三角形问题接受三个整数 a、b 和 c 作为输入,用做三角形的边。
|
|
|
@ -93,7 +93,7 @@
|
|
|
|
通过提供更多细节可以改进这个定义。于是这个问题变成以下的形式。
|
|
|
|
通过提供更多细节可以改进这个定义。于是这个问题变成以下的形式。
|
|
|
|
三角形问题接受三个整数 a、b 和 c 作为输入,用做三角形的边。整数 a、b 和 c 必须满足以下条件:
|
|
|
|
三角形问题接受三个整数 a、b 和 c 作为输入,用做三角形的边。整数 a、b 和 c 必须满足以下条件:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
程序的输出是由这三条边确定的三角形类型:等边三角形、等腰三角形、不等边三角形或非三角形。如果输入值没有满足 c1、c2 和 c3 这些条件中的任何一个,则程序会通过输出消息来进行通知,例如,“b 的取值不在允许取值的范围内。”如果 a、b 和 c 取值满足 c1、c2 和 c3,则给出以下四种相互排斥输出中的一个:
|
|
|
|
程序的输出是由这三条边确定的三角形类型:等边三角形、等腰三角形、不等边三角形或非三角形。如果输入值没有满足 c1、c2 和 c3 这些条件中的任何一个,则程序会通过输出消息来进行通知,例如,“b 的取值不在允许取值的范围内。”如果 a、b 和 c 取值满足 c1、c2 和 c3,则给出以下四种相互排斥输出中的一个:
|
|
|
|
|
|
|
|
|
|
|
@ -104,7 +104,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
在三角形问题描述中,除了要求边长是整数外,没有给出其它的限制条件。边界下限为 1,上限为 100。表 3.1 给出了边界值分析测试用例。
|
|
|
|
在三角形问题描述中,除了要求边长是整数外,没有给出其它的限制条件。边界下限为 1,上限为 100。表 3.1 给出了边界值分析测试用例。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
>NextDate 函数
|
|
|
|
>NextDate 函数
|
|
|
|
|
|
|
|
|
|
|
@ -117,13 +117,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
在NextDate 函数中,规定了变量 month、day、year 相应的取值范围,即 1 ≤ month ≤ 12,1 ≤ day ≤31,1912 ≤ year ≤ 2050,表 3.2 给出了其健壮性测试用例。
|
|
|
|
在NextDate 函数中,规定了变量 month、day、year 相应的取值范围,即 1 ≤ month ≤ 12,1 ≤ day ≤31,1912 ≤ year ≤ 2050,表 3.2 给出了其健壮性测试用例。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
边界值分析局限性:
|
|
|
|
边界值分析局限性:
|
|
|
|
|
|
|
|
|
|
|
|
如果被测程序是多个独立变量的函数,这些变量受物理量的限制,则很适合采用边界值分析。这里的关键是“独立”和“物理量”。
|
|
|
|
如果被测程序是多个独立变量的函数,这些变量受物理量的限制,则很适合采用边界值分析。这里的关键是“独立”和“物理量”。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
简单地看一下表 3.2 中 NextDate 函数的边界分析测试用例,就会发现其实这些测试用例是不充分的。
|
|
|
|
简单地看一下表 3.2 中 NextDate 函数的边界分析测试用例,就会发现其实这些测试用例是不充分的。
|
|
|
|
|
|
|
|
|
|
|
@ -156,23 +156,23 @@
|
|
|
|
如果这样做了, 则可以预期不会从诸如(3,3,3)和(100,100,100)这样的测试用例中得到多少新东西。直觉告诉我们,这些测试用例会以与第一个测试用例一样的方式进行“相同处理”,因此,这些测试用例是冗余。
|
|
|
|
如果这样做了, 则可以预期不会从诸如(3,3,3)和(100,100,100)这样的测试用例中得到多少新东西。直觉告诉我们,这些测试用例会以与第一个测试用例一样的方式进行“相同处理”,因此,这些测试用例是冗余。
|
|
|
|
当我们在考虑结构性测试时,将会看到“相同处理”映射到“遍历相同的执行路径。”
|
|
|
|
当我们在考虑结构性测试时,将会看到“相同处理”映射到“遍历相同的执行路径。”
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
等价类测试的关键就是选择确定类的等价关系。通常我们通过预测可能的实现, 考虑在现实中必须提供的功能操作来做出这种选择。我们将用一系列例子说明这一 点,但是首先必须区分弱和强等价类测试。
|
|
|
|
等价类测试的关键就是选择确定类的等价关系。通常我们通过预测可能的实现, 考虑在现实中必须提供的功能操作来做出这种选择。我们将用一系列例子说明这一 点,但是首先必须区分弱和强等价类测试。
|
|
|
|
|
|
|
|
|
|
|
|
为了便于理解,我们还是讨论与有两个变量 x1 和 x2 的函数 F 联系起来。如果 F 实现为一个程序,则输入变量 x1 和 x2 将拥有以下边界,以及边界内的区间:
|
|
|
|
为了便于理解,我们还是讨论与有两个变量 x1 和 x2 的函数 F 联系起来。如果 F 实现为一个程序,则输入变量 x1 和 x2 将拥有以下边界,以及边界内的区间:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
其中方括号和圆括号分别表示闭区间和开区间的端点。x1 和 x2 的无效值是:x1<a,x1>d 以及 x2<e,x2>g。
|
|
|
|
其中方括号和圆括号分别表示闭区间和开区间的端点。x1 和 x2 的无效值是:x1<a,x1>d 以及 x2<e,x2>g。
|
|
|
|
|
|
|
|
|
|
|
|
- **弱一般等价类测试**
|
|
|
|
- **弱一般等价类测试**
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
弱一般等价类测试通过使用测试用例的每个等价类(区间)的一个变量实现(单缺陷 假设的作用)。对于上面给出的例子,可得到如图 3.4 所示的弱等价类测试用例。
|
|
|
|
弱一般等价类测试通过使用测试用例的每个等价类(区间)的一个变量实现(单缺陷 假设的作用)。对于上面给出的例子,可得到如图 3.4 所示的弱等价类测试用例。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
这三个测试用例使用每个等价类中的一个值。事实上,永远都有等量的弱等价类测试用例,因为划分中的类对应最大子集数。
|
|
|
|
这三个测试用例使用每个等价类中的一个值。事实上,永远都有等量的弱等价类测试用例,因为划分中的类对应最大子集数。
|
|
|
|
|
|
|
|
|
|
|
@ -180,7 +180,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
强一般等价类测试基于多缺陷假设,它需要等价类笛卡儿积的每个元素对应的测试用 例(如图 3.5 所示)。笛卡儿积可保证两种意义上的“完备性”:一是覆盖所有的等价类, 二是覆盖所有可能的输入组合中的每一个。
|
|
|
|
强一般等价类测试基于多缺陷假设,它需要等价类笛卡儿积的每个元素对应的测试用 例(如图 3.5 所示)。笛卡儿积可保证两种意义上的“完备性”:一是覆盖所有的等价类, 二是覆盖所有可能的输入组合中的每一个。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
“好的”等价类测试的关键是等价关系的选择,要注意被“相同处理”的输入。在大多数情况下,等价类测试定义输入定义域的等价类。不过,其实也没有理由不能根据被测程序函数的输出值域定义等价关系。事实上,这对于三角形问题是最简单的方法。
|
|
|
|
“好的”等价类测试的关键是等价关系的选择,要注意被“相同处理”的输入。在大多数情况下,等价类测试定义输入定义域的等价类。不过,其实也没有理由不能根据被测程序函数的输出值域定义等价关系。事实上,这对于三角形问题是最简单的方法。
|
|
|
|
|
|
|
|
|
|
|
@ -191,19 +191,19 @@
|
|
|
|
(1)对于有效输入,弱健壮等价类测试使用每个有效类的一个值,就像我们在弱一般等价类测试中所做的一样。请注意,这些测试用例中的所有输入都是有效的。
|
|
|
|
(1)对于有效输入,弱健壮等价类测试使用每个有效类的一个值,就像我们在弱一般等价类测试中所做的一样。请注意,这些测试用例中的所有输入都是有效的。
|
|
|
|
(2)对于无效输入,弱健壮等价类测试的测试用例将拥有一个无效值,并保持其余的值都是有效的。此时,“单缺陷”会造成测试用例失败。
|
|
|
|
(2)对于无效输入,弱健壮等价类测试的测试用例将拥有一个无效值,并保持其余的值都是有效的。此时,“单缺陷”会造成测试用例失败。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
对于健壮等价类测试通常有两个问题。
|
|
|
|
对于健壮等价类测试通常有两个问题。
|
|
|
|
第一是:规格说明常常并没有定义无效测试用例所预期的输出是什么。因此,测试人员需要花大量时间定义这些测试用例的输出。
|
|
|
|
第一是:规格说明常常并没有定义无效测试用例所预期的输出是什么。因此,测试人员需要花大量时间定义这些测试用例的输出。
|
|
|
|
第二是:强类型语言没有必要考虑无效输入。
|
|
|
|
第二是:强类型语言没有必要考虑无效输入。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
- **强健壮等价类测试**
|
|
|
|
- **强健壮等价类测试**
|
|
|
|
|
|
|
|
|
|
|
|
强健壮等价类测试,“强”是指该类测试用例的获得是基于多缺陷假设,“健壮” 则和前面的定义一样,是指考虑了无效值。如图 3.7 所示,强健壮等价类测试从所有等价类笛卡尔积的每个元素中获得测试用例
|
|
|
|
强健壮等价类测试,“强”是指该类测试用例的获得是基于多缺陷假设,“健壮” 则和前面的定义一样,是指考虑了无效值。如图 3.7 所示,强健壮等价类测试从所有等价类笛卡尔积的每个元素中获得测试用例
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
### 等价类测试实例
|
|
|
|
### 等价类测试实例
|
|
|
|
|
|
|
|
|
|
|
@ -218,31 +218,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
四个弱一般等价类测试用例是:
|
|
|
|
四个弱一般等价类测试用例是:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
由于变量 a、b 和 c 没有有效区间划分,则强一般等价类测试用例与弱一般等价类测试用例相同。
|
|
|
|
由于变量 a、b 和 c 没有有效区间划分,则强一般等价类测试用例与弱一般等价类测试用例相同。
|
|
|
|
|
|
|
|
|
|
|
|
考虑 a、b 和 c 的无效值产生的以下额外弱健壮等价类测试用例:
|
|
|
|
考虑 a、b 和 c 的无效值产生的以下额外弱健壮等价类测试用例:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
以下是额外强健壮等价类测试用例三维立方的一个“角”:
|
|
|
|
以下是额外强健壮等价类测试用例三维立方的一个“角”:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
请注意,预期输出如何完备地描述无效输入值。
|
|
|
|
请注意,预期输出如何完备地描述无效输入值。
|
|
|
|
|
|
|
|
|
|
|
|
等价类测试显然对于用来定义的等价关系很敏感。如果在输入定义域上定义等价类,则可以得到更丰富的测试用例集合。三个整数 a、b 和 c 有些什么可能的取值呢? 这些整数相等(有三种相等方式),或都不相等。
|
|
|
|
等价类测试显然对于用来定义的等价关系很敏感。如果在输入定义域上定义等价类,则可以得到更丰富的测试用例集合。三个整数 a、b 和 c 有些什么可能的取值呢? 这些整数相等(有三种相等方式),或都不相等。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
作为一个单独的问题,我们可以通过三角形的性质来判断三条边是否构成一个三角形(例如,三元组有一对相等的边,但是这些边不构成一个三角形)
|
|
|
|
作为一个单独的问题,我们可以通过三角形的性质来判断三条边是否构成一个三角形(例如,三元组有一对相等的边,但是这些边不构成一个三角形)
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
如果我们要彻底一些,可以将“小于或等于”分解为两种不同的情况,这样D6就变成:
|
|
|
|
如果我们要彻底一些,可以将“小于或等于”分解为两种不同的情况,这样D6就变成:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
同样对于 D7 和 D8 也有类似的情况。
|
|
|
|
同样对于 D7 和 D8 也有类似的情况。
|
|
|
|
|
|
|
|
|
|
|
@ -262,15 +262,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
由于每个独立变量的有效区间均为 1 个,因此只有弱一般等价类测试用例出现, 并且与强一般等价类测试用例相同:
|
|
|
|
由于每个独立变量的有效区间均为 1 个,因此只有弱一般等价类测试用例出现, 并且与强一般等价类测试用例相同:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
以下是弱健壮测试用例的完整集合:
|
|
|
|
以下是弱健壮测试用例的完整集合:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
与三角形问题一样,以下是额外强健壮性等价类测试用例三维立方的一个“角”:
|
|
|
|
与三角形问题一样,以下是额外强健壮性等价类测试用例三维立方的一个“角”:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
划分等价关系的重点是等价类中的元素要被“同样处理”。上述方法所得测试用例集其实是不足的,因为它只注意到在单个变量处理的有效/无效层次上进行,而没有进一步分析具体处理的过程与特征。对该函数如果更仔细地选择等价关系,所得到的等价类和测试用例集将会更有用。
|
|
|
|
划分等价关系的重点是等价类中的元素要被“同样处理”。上述方法所得测试用例集其实是不足的,因为它只注意到在单个变量处理的有效/无效层次上进行,而没有进一步分析具体处理的过程与特征。对该函数如果更仔细地选择等价关系,所得到的等价类和测试用例集将会更有用。
|
|
|
|
|
|
|
|
|
|
|
@ -295,15 +295,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
这些类产生以下弱等价类测试用例。与前面一样,机械地从对应类的取值范围中选择输入:
|
|
|
|
这些类产生以下弱等价类测试用例。与前面一样,机械地从对应类的取值范围中选择输入:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
机械选择输入值不考虑领域知识,因此没有考虑两种不可能出现的日期。“自动” 测试用例生成永远都会有这种问题,因为领域知识不是通过等价类选择获得的。
|
|
|
|
机械选择输入值不考虑领域知识,因此没有考虑两种不可能出现的日期。“自动” 测试用例生成永远都会有这种问题,因为领域知识不是通过等价类选择获得的。
|
|
|
|
|
|
|
|
|
|
|
|
经过改进的强一般等价类测试用例是:
|
|
|
|
经过改进的强一般等价类测试用例是:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
从弱一般测试转向强一般测试会产生一些边界值测试中也出现的冗余问题。从弱到强的转换,不管是一般类还是健壮类,都是以等价类的叉积表示。3 个月份类乘以 4 个日期类乘以 3 个年类,产生 36 个强一般等价类测试用例。对每个变量加上 2 个无效类,得到 150 个强健壮等价类测试用例。
|
|
|
|
从弱一般测试转向强一般测试会产生一些边界值测试中也出现的冗余问题。从弱到强的转换,不管是一般类还是健壮类,都是以等价类的叉积表示。3 个月份类乘以 4 个日期类乘以 3 个年类,产生 36 个强一般等价类测试用例。对每个变量加上 2 个无效类,得到 150 个强健壮等价类测试用例。
|
|
|
|
|
|
|
|
|
|
|
@ -335,23 +335,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
根据上述等价类的划分,可得如下所示佣金问题的弱一般等价类测试用例,这个 测试用例同样也等于强一般等价类测试用例。
|
|
|
|
根据上述等价类的划分,可得如下所示佣金问题的弱一般等价类测试用例,这个 测试用例同样也等于强一般等价类测试用例。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
七个弱健壮测试用例如下。
|
|
|
|
七个弱健壮测试用例如下。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
最后,额外强健壮等价类测试用例三维立方的一个“角”是:
|
|
|
|
最后,额外强健壮等价类测试用例三维立方的一个“角”是:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
请注意,对于强测试用例,不管是强一般测试用例还是强健壮测试用例,都只有一个是合理输入。如果确实担心错误案例,那么这就是很好的测试用例集合。但是这样很 难确信佣金问题的计算部分没有问题。在本例中,我们可以通过对输出值域定义等价类来进一步完善测试。前面提到过,销售额是所售出的枪机、枪托和枪管数量的函数:
|
|
|
|
请注意,对于强测试用例,不管是强一般测试用例还是强健壮测试用例,都只有一个是合理输入。如果确实担心错误案例,那么这就是很好的测试用例集合。但是这样很 难确信佣金问题的计算部分没有问题。在本例中,我们可以通过对输出值域定义等价类来进一步完善测试。前面提到过,销售额是所售出的枪机、枪托和枪管数量的函数:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
由此得到如下的输出值域等价类测试用例:
|
|
|
|
由此得到如下的输出值域等价类测试用例:
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
这些测试用例让人感觉到正在接触问题的重要部分。与弱健壮测试用例结合在一 起,就可得到佣金问题的相当不错的测试。另外,可能还希望增加一些边界检查,只是为了保证从 1000 美元到 1800 美元的转移是正确的。
|
|
|
|
这些测试用例让人感觉到正在接触问题的重要部分。与弱健壮测试用例结合在一 起,就可得到佣金问题的相当不错的测试。另外,可能还希望增加一些边界检查,只是为了保证从 1000 美元到 1800 美元的转移是正确的。
|
|
|
|
|
|
|
|
|
|
|
@ -376,7 +376,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
自从 20 世纪 60 年代初以来,决策表一直被用来表示和分析复杂逻辑关系。决策 61 表很适合描述不同条件集合下采取行动的若干组合的情况。
|
|
|
|
自从 20 世纪 60 年代初以来,决策表一直被用来表示和分析复杂逻辑关系。决策 61 表很适合描述不同条件集合下采取行动的若干组合的情况。
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
决策表有四个部分:粗竖线左侧是桩部分;右侧是条目部分。横粗线的上面是条件部分,下面是行动部分。因此,我们可以引用条件桩、条件条目、行动桩和行动条目。条目部分中的一列是一条规则。规则只是在规则的条件部分中指示的条件环境下要采取什么行动。在表 3.3 给出的决策表中,如果 c1、c2 和 c3 都为真,则采取行动 a1 和 a2。如果 c1 和 c2 都为真而 c3 为假,则采取行动 a1 和 a3。在 c1 为真 c2 为假的 条件下采取行动 a4,此时规则中的 c3 条目叫做“不关心”条目。不关心条目有两种主 要解释:条件无关或条件不适用。
|
|
|
|
决策表有四个部分:粗竖线左侧是桩部分;右侧是条目部分。横粗线的上面是条件部分,下面是行动部分。因此,我们可以引用条件桩、条件条目、行动桩和行动条目。条目部分中的一列是一条规则。规则只是在规则的条件部分中指示的条件环境下要采取什么行动。在表 3.3 给出的决策表中,如果 c1、c2 和 c3 都为真,则采取行动 a1 和 a2。如果 c1 和 c2 都为真而 c3 为假,则采取行动 a1 和 a3。在 c1 为真 c2 为假的 条件下采取行动 a4,此时规则中的 c3 条目叫做“不关心”条目。不关心条目有两种主 要解释:条件无关或条件不适用。
|
|
|
|
|
|
|
|
|
|
|
@ -390,61 +390,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
在表 3.4 所示的决策表中,给出了不关心条目和不可能规则使用的例子。正如第 一条规则所指示,如果整数 a、b 和 c 不构成三角形,则我们根本不关心可能的相关系。在规则 3、4 和 6 中,如果两对整数相等,则根据传递性,第三对整数也一定相等,因此这些规则不可能满足。
|
|
|
|
在表 3.4 所示的决策表中,给出了不关心条目和不可能规则使用的例子。正如第 一条规则所指示,如果整数 a、b 和 c 不构成三角形,则我们根本不关心可能的相关系。在规则 3、4 和 6 中,如果两对整数相等,则根据传递性,第三对整数也一定相等,因此这些规则不可能满足。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
表 3.5 所示的决策表给出了有关表示方法的另一种考虑:条件的选择可以大大地 扩展决策表的规模。这里将老条件(c1:a、b、c 构成三角形?)扩展为三角形特性的三个不等式的详细表示。如果有一个不等式不成立,则三个整数就不能构成三角形。 我们还可以进一步扩展,因为不等式不成立有两种方式:一条边等于另外两条边的和, 或严格大于另外两条边的和。
|
|
|
|
表 3.5 所示的决策表给出了有关表示方法的另一种考虑:条件的选择可以大大地 扩展决策表的规模。这里将老条件(c1:a、b、c 构成三角形?)扩展为三角形特性的三个不等式的详细表示。如果有一个不等式不成立,则三个整数就不能构成三角形。 我们还可以进一步扩展,因为不等式不成立有两种方式:一条边等于另外两条边的和, 或严格大于另外两条边的和。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
如果条件引用了等价类,则决策表会有一种典型的外观。如表 3.6 所示的决策表来自 NextDate 问题,引用了可能的月份变量相互排斥的可能性。由于一个月份就是一 个等价类,因此不可能有两个条目同时为真的规则。不关心条目(-)的实际含义是“必须失败”。有些决策表使用者用 F 表示这一点。
|
|
|
|
如果条件引用了等价类,则决策表会有一种典型的外观。如表 3.6 所示的决策表来自 NextDate 问题,引用了可能的月份变量相互排斥的可能性。由于一个月份就是一 个等价类,因此不可能有两个条目同时为真的规则。不关心条目(-)的实际含义是“必须失败”。有些决策表使用者用 F 表示这一点。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
不关心条目的使用,对完整决策表的识别方式有微妙的影响。对于有限的条目决策表,如果有 n 个条件,则必须有 2 n 条规则。如果不关心条目实际地表明条件是不相关的,则可以按以下方法统计规则数:没有不关心条目的规则统计为 1 条规则;规则中每出现一个不关心条目,该规则数乘一次 2。表 3.5 所示决策表的规则条目数统 计如表 3.7 所示。请注意,规则总数是 64(正好是应该得到的规则条数)。
|
|
|
|
不关心条目的使用,对完整决策表的识别方式有微妙的影响。对于有限的条目决策表,如果有 n 个条件,则必须有 2 n 条规则。如果不关心条目实际地表明条件是不相关的,则可以按以下方法统计规则数:没有不关心条目的规则统计为 1 条规则;规则中每出现一个不关心条目,该规则数乘一次 2。表 3.5 所示决策表的规则条目数统 计如表 3.7 所示。请注意,规则总数是 64(正好是应该得到的规则条数)。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
如果将这种简化算法应用于表 3.6 所示的决策表,会得到如表 3.8 所示的规则条数统计。
|
|
|
|
如果将这种简化算法应用于表 3.6 所示的决策表,会得到如表 3.8 所示的规则条数统计。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
应该只有八条规则,所以显然有问题。为了找出问题所在,我们扩展所有三条规则,用可能的 T 或 F 替代“-”,如图 3.9 所示。
|
|
|
|
应该只有八条规则,所以显然有问题。为了找出问题所在,我们扩展所有三条规则,用可能的 T 或 F 替代“-”,如图 3.9 所示。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
请注意,所有条目都是 T 的规则有三条:规则 1.1、2.1、和 3.1;条目是 T、T、 F 的规则有两条:规则 1.2 和 2.2。类似地,规则 1.3 和 3.2、2.3 和 3.3 也是一样的。 如果去掉这种重复,最后可得到七条规则,缺少的规则是所有条件都是假的规则。这 种处理的结果如表 3.10 所示,表中还给出了不可能出现的规则。
|
|
|
|
请注意,所有条目都是 T 的规则有三条:规则 1.1、2.1、和 3.1;条目是 T、T、 F 的规则有两条:规则 1.2 和 2.2。类似地,规则 1.3 和 3.2、2.3 和 3.3 也是一样的。 如果去掉这种重复,最后可得到七条规则,缺少的规则是所有条件都是假的规则。这 种处理的结果如表 3.10 所示,表中还给出了不可能出现的规则。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
这种识别完备决策表的能力,使我们在解决冗余性和不一致性方面处于很有利的 地位,表 3.11 给出的决策表是冗余的,因为有三个条件则应该是 2³=8 条规则,此处却有九条规则。(规则 9 和规则 1~4 中某一条相同,是冗余规则。)
|
|
|
|
这种识别完备决策表的能力,使我们在解决冗余性和不一致性方面处于很有利的 地位,表 3.11 给出的决策表是冗余的,因为有三个条件则应该是 2³=8 条规则,此处却有九条规则。(规则 9 和规则 1~4 中某一条相同,是冗余规则。)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
注意规则 9 的行为条目与规则 1~4 的条目相同。只要冗余规则中的行为与决策表相同的部分相同,就不会有什么大问题。如果行为条目不同,例如表 3.12 所示的情况, 则会遇到比较大的问题。
|
|
|
|
注意规则 9 的行为条目与规则 1~4 的条目相同。只要冗余规则中的行为与决策表相同的部分相同,就不会有什么大问题。如果行为条目不同,例如表 3.12 所示的情况, 则会遇到比较大的问题。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
如表 3.12 所示的决策表被用来处理事务,其中 c1 是真,c2 和 c3 都是假,则规则 4 和规则 9 都适用。我们可以观察到两点:
|
|
|
|
如表 3.12 所示的决策表被用来处理事务,其中 c1 是真,c2 和 c3 都是假,则规则 4 和规则 9 都适用。我们可以观察到两点:
|
|
|
|
|
|
|
|
|
|
|
@ -459,13 +459,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
- **三角形问题的测试用例**
|
|
|
|
- **三角形问题的测试用例**
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
使用表 3.5 所示的决策表,可得到 11 个功能性测试用例:3 个不可能测试用例, 3 个测试用例违反三角形性质,1 个测试用例可得到等边三角形,1 个测试用例可得到 不等边三角形,3 个测试用例可得到等腰三角形(如表 3.13 所示)如果扩展决策表以 显示两种违反三角形性质的方式,可以再选三个测试用例(一条边正好等于另外两条边的和)。做到这一点需要做一定的判断,否则规则会呈指数级增长。在这种情况下,最终会再得到很多不关心条目和不可能的规则。
|
|
|
|
使用表 3.5 所示的决策表,可得到 11 个功能性测试用例:3 个不可能测试用例, 3 个测试用例违反三角形性质,1 个测试用例可得到等边三角形,1 个测试用例可得到 不等边三角形,3 个测试用例可得到等腰三角形(如表 3.13 所示)如果扩展决策表以 显示两种违反三角形性质的方式,可以再选三个测试用例(一条边正好等于另外两条边的和)。做到这一点需要做一定的判断,否则规则会呈指数级增长。在这种情况下,最终会再得到很多不关心条目和不可能的规则。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
使用表 3.5 所示的决策表,可得到 11 个功能性测试用例:3 个不可能测试用例, 3 个测试用例违反三角形性质,1 个测试用例可得到等边三角形,1 个测试用例可得到 不等边三角形,3 个测试用例可得到等腰三角形(如表 3.13 所示)如果扩展决策表以 显示两种违反三角形性质的方式,可以再选三个测试用例(一条边正好等于另外两条边的和)。做到这一点需要做一定的判断,否则规则会呈指数级增长。在这种情况下,最终会再得到很多不关心条目和不可能的规则。
|
|
|
|
使用表 3.5 所示的决策表,可得到 11 个功能性测试用例:3 个不可能测试用例, 3 个测试用例违反三角形性质,1 个测试用例可得到等边三角形,1 个测试用例可得到 不等边三角形,3 个测试用例可得到等腰三角形(如表 3.13 所示)如果扩展决策表以 显示两种违反三角形性质的方式,可以再选三个测试用例(一条边正好等于另外两条边的和)。做到这一点需要做一定的判断,否则规则会呈指数级增长。在这种情况下,最终会再得到很多不关心条目和不可能的规则。
|
|
|
|
|
|
|
|
|
|
|
@ -493,7 +493,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
如表 3.14 所示是决策表,共有 22 条规则。
|
|
|
|
如表 3.14 所示是决策表,共有 22 条规则。
|
|
|
|
|
|
|
|
|
|
|
@ -501,19 +501,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
规则 1~5 处理有 30 天的月份,其中不可能规则也列出,如规则 5 处理在有 30 天 的月份中考虑 31 日;规则 6~10 和规则 11~15 处理有 31 天的月份,其中规则 6~10 处 理 12 月之外的月份,规则 11~15 处理 12 月;最后的 7 条规则关注 2 月和闰年问题。
|
|
|
|
规则 1~5 处理有 30 天的月份,其中不可能规则也列出,如规则 5 处理在有 30 天 的月份中考虑 31 日;规则 6~10 和规则 11~15 处理有 31 天的月份,其中规则 6~10 处 理 12 月之外的月份,规则 11~15 处理 12 月;最后的 7 条规则关注 2 月和闰年问题。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
可进一步简化这 22 条规则。若决策表中有两条规则的动作项相同,则一定至少 68 有一个条件能够把这两条规则用不关心条件合并。例如,规则 1、2、3 都涉及有 30 天的月份 day 类 D1、D2 和 D3,并且它们的动作项都是 day 加 1,因此可以将规则 1、 2、3 合并。类似地,有 31 天的月份的 day 类 D1、D2、D3 和 D4 也可合并,2 月的 D4 和 D5 也可合并。简化后的决策表如表 3.15 所示。
|
|
|
|
可进一步简化这 22 条规则。若决策表中有两条规则的动作项相同,则一定至少 68 有一个条件能够把这两条规则用不关心条件合并。例如,规则 1、2、3 都涉及有 30 天的月份 day 类 D1、D2 和 D3,并且它们的动作项都是 day 加 1,因此可以将规则 1、 2、3 合并。类似地,有 31 天的月份的 day 类 D1、D2、D3 和 D4 也可合并,2 月的 D4 和 D5 也可合并。简化后的决策表如表 3.15 所示。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
根据简化后的决策表 3.15,可设计测试用例,如表 3.16 所示。
|
|
|
|
根据简化后的决策表 3.15,可设计测试用例,如表 3.16 所示。
|
|
|
|
|
|
|
|
|
|
|
@ -558,7 +558,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
> 现有一个学生标准化考试批阅试卷,产生成绩报告的程序。其规格说明如下:程序的输入文件由一些有 80 个字符的记录组成,所有记录分为 3 组,如图:
|
|
|
|
> 现有一个学生标准化考试批阅试卷,产生成绩报告的程序。其规格说明如下:程序的输入文件由一些有 80 个字符的记录组成,所有记录分为 3 组,如图:
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> 
|
|
|
|
> 
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> - 标题:该组只有一个记录,其内容是成绩报告的名字。
|
|
|
|
> - 标题:该组只有一个记录,其内容是成绩报告的名字。
|
|
|
|
> - 各题的标准答案:每个记录均在第 80 个字符处标以数字 2。该组的记录:
|
|
|
|
> - 各题的标准答案:每个记录均在第 80 个字符处标以数字 2。该组的记录:
|
|
|
|