数据测试

数据结构与算法


设计测试数据的技术分为两类:黑盒法(black box method)和白盒法(white box method)。

在黑盒法中,考虑的是程序的功能,而不是实际的代码。在白盒法中,通过检查程序代码来设计测试数据,以便使测试数据的执行结果能很好地覆盖程序的语句以及执行路径。

1. 黑盒法

最流行的黑盒法是 I/O分类及因果图,本节仅探讨 I / O分类。在这种方法中,输入数据和/或输出数据空间被分成若干类,不同类中的数据会使程序所表现出的行为有质的不同,而相同类中的数据则使程序表现出本质上类似的行为。二次方程求解的例子中有三种本质上不同的行为:产生复数根,产生实数根且不同,产生实数根且相同。可以根据这三种行为把输入空间分为三类。第一类中的数据将产生第一种行为;第二类中的数据将产生第二种行为;而第三类中的数据将产生第三种行为。一个测试集应至少从每一类中抽取一个输入数据。

2. 白盒法

白盒法基于对代码的考察来设计测试数据。对一个测试集最起码的要求就是使程序中的每一条语句都至少执行一次。这种要求被称为语句覆盖(statement coverage)。对于二次方程求解 的 例 子 , 测 试 集{(1, -5 , 6 ),(1,- 8, 1 6),(1 ,2, 5)}将 使 程 序 中 的 每 一 条 语 句 都 得 以 执行,而测试集{(1,-5,6),(1,3,2),(2,5,2)}则不能提供语句覆盖。

在分支覆盖(decision coverage)中要求测试集要能够使程序中的每一个条件都分别能出现t r u ef a l s e 两 种 情 况 。 程 序 1 - 3 0中 的 代 码 有 两 个 条 件 :d > 0d = = 0 。 在 进 行 分 支 覆 盖 测 试 时 ,要求测试集至少能使条件d > 0d = = 0分别出现一次为t r u e、一次为f a l s e的情况。 


1 - 7 [ 求最大元素 ] 程序 1 - 3 1用于返回数组 a [ 0 : n -1 ] 中最大元素所在的位置。它依次扫描 a [ 0 ]a [ n -1 ] , 并 用 变 量 p o s 来 保 存 到 目 前 为 止 所 能 找 到 的 最 大 元 素 的 位 置 。 数 据 集 a [ 0 : 4 ] = [ 2 , 4 , 6 , 8 , 9 ]能够提供语句覆盖,但不能提供分支覆盖,因为条件 a [ p o s ] < a [ i ] 不会变成 f a l s e 。数据集[ 4,2,6,8 ,9 ]既 能 提 供 语 句 覆 盖 也 能 提 供 分 支 覆 盖 。

page27image25232

程序1-31 寻找最大元素

page27image25880

template<class T>
int Max(T a[], int n)
{//
寻找 a [ 0 : n - 1 ] 中的最大元素

int pos = 0;
for (int i = 1; i < n; i++)

if (a[pos] < a[i])pos = i;

page28image6384

return pos;}

可以进一步加强分支覆盖的条件,要求每个条件中的每个从句( c l a u s e )既能出现 t r u e 也能出现 f a l s e的情况,这种加强的条件被称之为从句覆盖( c l a u s e c o v e r a g e )。 一 个 从 句 在 形 式 上 被定 义 成 一 个 不 包 含 布 尔 操 作 符 ( 如 & & , | | , ! ) 的 布 尔 表 达 式 。 表 达 式 x > y , x + y < y * z 以及 c ( c 是一个布尔类型 )都是从句的例子。考察如下语句:

if((C1 && C2) || (C3 && C4)) S1;else S2;

其中 C 1 ,C 2 , C 3C 4 是从句, S 1 S 2 是语句。在分支覆盖方式下,需要使用一个能使 ( ( C 1& & C 2 ) | | ( C 3 & & C 4 ) ) t r u e 的测试数据以及一个能使该条件为 f a l s e 的 测 试 数 据 。 而 从 句 覆 盖则 要 求 测 试 数 据 能 使 四 个 从 句 C 1 , C 2 , C 3 C 4 都 分 别 至 少 取 一 次 t r u e 值 和 至 少 取 一 次 f a l s e值。

还可以继续加强从句覆盖的条件,要求测试各从句值的所有可能组合。对于上面的条件
( ( C 1 & & C 2 ) | | ( C 3 & & C 4 ) ) ,加强后的从句覆盖要求使用 1 6 个 测 试 数 据 集 : 每 个 测 试 集 对 应 于四个从句值组合后的情形。不过,其中有些组合是不可能的。

如果按照某个测试数据集来排列程序语句的执行次序,可以得到一条执行路径( e x e c u t i o np a t h )。 不 同 的 测 试 数 据 可 能 会 得 到 不 同 的 执 行 路 径 。 程 序 1 - 3 0 仅 存 在 三 条 执 行 路 径 — — 第 1 行至第 7 行,第 1 2 8 ~1 2 行,第 1 28 1 3 ~ 1 9行。而程序 1 - 3 1中的执行路径则随着 n 的增加而增加。当 n = 1 时,仅有一条执行路径—— 1 25行;当 n = 2 时,有两条路径—— 1 2 325 1 2 3 4 2 5 行;当 n = 3时,有四条路径—— 1 2 3 2 3 2 5 行, 1 2 3 4 2325行,12323425行,12342345行。执行路径覆盖要求测试数据集能使每条执行路径都得以执行。对于二次方程求解程序,语句覆盖、分支覆盖、从句 覆 盖 以 及 执 行 路 径 覆 盖 都 是 等 价 的 , 但 对 于 程 序 1 - 3 1, 语 句 覆 盖 、 分 支 覆 盖 、 和 执 行 路 径 覆盖是不同的,而分支覆盖和从句覆盖是等价的。

在这些白盒测试方法中,一般要求实现执行路径覆盖。一个能实现全部执行路径覆盖的测试数据同样能实现语句覆盖和分支覆盖,然而,它可能无法实现从句覆盖。全部执行路径覆盖通常会需要无数的测试数据或至少是非常可观的测试数据,所以在实践中一般不可能进行全部执行路径覆盖。

本书中的许多练习都要求你测试所编代码的正确性。你所使用的测试数据应至少提供语句覆盖。此外,你必须测试那些可能会使你的程序出错的特定情形。例如,对于一个用来对 n0个 元 素 进 行 排 序 的 程 序 , 除 了 测 试 n 的 正 常 取 值 外 , 还 必 须 测 试 n = 0 , 1这 两 种 特 殊 情 形 。 如 果 该程序使用数组 a [ 0 : 9 9 ] , 还需要测试 n = 1 0 0 的情形。 n= 0 , 1 1 0 0 分 别 表 示 边 界 条 件 为 空 , 单 值 和 全数组的情形。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值