标题: C++test的使用案例 [打印本页] 作者: trace703 时间: 2006-8-3 14:40 标题: C++test的使用案例 1 个人意见
1.1 一个例子
对以下的函数(在其提供的例子程序divide_by_zero.cpp中)
// calculates sum of specified values
int get_sum(int *data, unsigned int size) {
// missing checking if 'data' exists
int sum = 0;
for (int i = 0; i < size; i++) {
sum += data;
}
return sum;
}
在VC环境下对其进行动态分析,选择把信息输出到C++Test界面下,可以看到:
可以看到红色的测试用例表示出现异常,绿色的测试用例表示正确。
对第一个红色的测试用例进行分析:
输入值data为空,size为198,很明显data为空,即指针为空,没有对指针进行保护,肯定出异常,在原来的函数中加上一段,如红色所示。
// calculates sum of specified values
int get_sum(int *data, unsigned int size) {
// missing checking if 'data' exists
int sum = 0;
if ( !data )
{
return 0;
}
for (int i = 0; i < size; i++) {
sum += data;
}
return sum;
}
再次分析,可得到如下的结果:
对于AUTO_1_A_2这个测试用例,用鼠标右键可以查看此测试用例,如下图:
可见对于只有一维的数组,却加了4294967265次。这次是SIZE越界。需要保护:
// calculates sum of specified values
int get_sum(int *data, unsigned int size) {
// missing checking if 'data' exists
int sum = 0;
if ( !data )
{
return 0;
}
for (int i = 0; i < size; i++) {
sum += data;
}
return sum;
}
还有很多问题,例如:I是int类型,而size是unsigned int类型,当size很大时,I就无法跟上它同步大小,sum也可能越界。
另外,也可以设置自己的测试用例,设置预期的结果,进行对算法正确地判断。如下图:
关于测试用例的各种复杂应用见下面各个例子。
8 回归测试
回归测试的目的是为了保证对代码的任何修改以后没有引入错误。因此一定要保持与前次测
试的可比性。在C++Test 中,你可以有多种方式执行已有的测试用例,如这个项目、一个文件、类、方法、若干测试用例或单个测试用例。
9 自动测试尽可能多的分支和边界条件
C++Test 具有一定的“智能”,能够自动分析你的代码,根据一些特征值自动生成能够更好
地执行各个条件分支的测试用例,提高代码覆盖性。虽然目前这种能力还是比较初步,但在
市场上还是独有的,是ParaSoft 自动测试用例生成技术专利的一部分,能够有效地提高测试覆盖性。
C++Test 的这种能力主要表现在几个方面:
. 根据输入参数的类型特征生成测试用例。
. 你可以设置特定的边界值,用于自动生成测试用例。
. 自动分析代码中的边界条件,并自动生成相应的测试用例。
9.1 【例】发现条件中的整型边界条件
#define SIZE 88
int user_input_handler(int i)
{
int result = 0;
if (i > SIZE) result = -1;
else if (i <33) result = 1;
return result;
}
C++Test 能够自动识别第一个条件中的SIZE(并使用SIZE 的实际值88)和第二个条件中的33,并自动生成相应的测试用例。
9.2 【例】发现条件中的字符型边界条件
D:\ParaSoft\C++Test\examples\extern_func.cpp:
#include <string.h>
int user_input_handler(char *user_input, char * output)
{
int result = 0;
if (strcmp("load", user_input) == 0) {
strcpy(output,user_input);
} else if (strcmp("save", user_input) == 0) {
strcpy(output, user_input);
} else if (strcmp("quit", user_input) == 0) {
strcpy(output, user_input);
} else {
result = -1;
}
return result;
}
在自动生成的测试用例中使用了实际的判断条件“load”、“save”和“quit”,从而保证测
试用例可以执行各个分支。
9.3 【例】使用枚举类型生成测试用例的输入值
enum Mode {TO, FROM};
int GetStatus(Mode mode) {
int status;
switch (mode) {
case TO:
status = 0;
break;
case FROM:
status = 1;
break;
default:
status = -1;
break;
}
return status;
}
自动生成的测试用例如下: