【例题】下面是快速排序算法中的一趟划分算法,其中dataist是数据表,它有两个数据成员:一是元素类型为Eement的数组V,另一个是数组大小n.算法中用到两个操作,一是取某数组元素V[i]的关键码操作getKey ( ),一是交换两数组元素内容的操作Swap( ):
int Partition ( dataist &ist, int ow, int high ) {
//在区间[ ow, high ]以第一个对象为基准进行一次划分,k返回基准对象回放位置。
int k = ow; Eement pivot = ist.V[ow]; //基准对象
for ( int i = ow+1; i <= high; i++ ) //检测整个序列,进行划分
if ( ist.V[i].getKey ( ) < pivot.getKey( ) && ++ k != i )
Swap ( ist.V[k], ist.V[i] ); //小于基准的交换到左侧去
Swap ( ist.V[ow], ist.V[k] ); //将基准对象就位
return k; //返回基准对象位置
}
(1) 试画出它的程序流程图;
(2) 试利用路径覆盖方法为它设计足够的测试用例(循环次数限定为0次,1次和2次)。
答案:(1)流程图如下。
(2) 测试用例设计
循环次数 输 入 条 件 输 出 结 果 执 行 路 径
ow high k i V[0] V[1] V[2] k i V[0] V[1] V[2]
0 0 0 0 1 - - - 0 1 - - - ①③
1 0 1 0 1 1 2 - 0 2 1 2 - ①②⑤⑥③
0 1 0 1 2 1 - 1 2 1 2 - ①②④⑥③
0 1 0 1 1 1 - 0 2 1 1 - ①②⑤⑥③
2 0 2 0 1 1 2 3 0 3 1 2 3 ①②⑤⑥②⑤⑥③
0 2 0 1 1 2 1 0 3 1 2 1 ①②⑤⑥②⑤⑥③
0 2 0 1 2 3 1 1 3 1 2 3 ①②⑤⑥②④⑥③
0 2 0 1 3 2 1 2 3 1 2 3 ①②④⑥②④⑥③
0 2 0 1 2 1 2 1 3 1 2 2 ①②④⑥②⑤⑥③
0 2 0 1 2 1 3 1 3 1 2 3 ①②④⑥②⑤⑥③
0 2 0 1 1 1 2 0 3 1 1 2 ①②⑤⑥②⑤⑥③
0 2 0 1 2 2 1 1 3 1 2 2 ①②⑤⑥②④⑥③
0 2 0 1 2 2 2 0 3 2 2 2 ①②⑤⑥②⑤⑥③
分析:画程序流程图是设计测试用例的关键。从以往同学解题的经验来看,在画流程图时就出错了。所以首先要把流程图中的逻辑关系搞清楚再画出正确的流程图。考虑测试用例设计需要首先有测试输入数据,还要有预期的输出结果。对于此例,控制循环次数靠循环控制变量i和循环终值high.循环0次时,取ow = high,此时一次循环也不做。循环一次时,取ow +1 = high,循环二次时,取ow+2 = high.
根据BRO策略,条件V[i] < pivot && ++k≠i的约束集合为 { (, < ) },因此,测试用例设计为:
循环次数 输 入 条 件 输 出 结 果
ow high k i V[0] V[1] V[2] pivot k i V[0] V[1] V[2]
0 0 0 0 1 - - - - 0 1 - - -
1 0 1 0 1 1 2 1 0 2 1 2 (>,
0 1 0 1 2 1 2 1 2 2 1 1 2 (
0 1 0 1 1 1 1 0 2 1 1 (=,
0 1 0 1 不 可 达 (
2 0 2 0 1 1 2 3 1 00 23 1 1 2 2 3 3 (>, ,
0 2 0 1 1 2 1 1 00 23 1 1 2 2 1 1 (>,
0 2 0 1 2 3 1 2 01 23 2 2 1 3 1 2 1 3 3 (>,
0 2 0 1 不 可 达 (>,
0 2 0 1 3 2 1 3 12 23 3 3 1 2 2 2 1 1 3 (
0 2 0 1 2 1 2 2 11 23 2 2 1 1 1 2 2 2 2 (
0 2 0 1 2 1 3 2 11 23 2 2 1 1 1 2 3 3 3 (,
0 2 0 1 不 可 达 (
0 2 0 1 1 1 2 1 00 23 1 1 1 1 2 2 (=, ,
0 2 0 1 2 2 1 2 01 23 2 2 1 2 1 2 1 2 2 (=,
0 2 0 1 2 2 2 2 00 23 2 2 2 2 2 2 (=,
0 2 0 1 不 可 达 (=,
0 2 0 1 不 可 达 (