标题: 小妹急求c++ test6.5 license [打印本页] 作者: alina_min 时间: 2006-8-2 19:07 标题: 小妹急求c++ test6.5 license 下载到的c++ test6.5没有license,哪位能告诉我吗?
能给我c ++ test其他版本的带license的也行! 谢谢啦作者: trace703 时间: 2006-8-3 14:44 标题: 可到www.superst.com.cn上申请 可到www.superst.com.cn上申请或给我发邮件作者: trace703 时间: 2006-8-3 14:46 标题: 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;
}
自动生成的测试用例如下:
9.4 【例】使用特殊字符
D:\ParaSoft\C++Test\examples\heuristic.cpp:
char *encode_char(char value) {
char *result = new char[5];
char *encoded = 0;
switch (value) {
case '&':
encoded = "AND";
break;
case '%':
encoded = "PRC";
break;
case '$':
encoded = "DLR";
break;
case '*':
encoded = "ASX";
break;
case '/':
encoded = "DVD";
break;
case '^':
encoded = "PWR";
break;
case '#':
encoded = "HSH";
break;
default :
break;
}
char *iter = result;
//should check to see if 'encoded' is null
while (*encoded) {
*iter++ = *encoded++;
}
*iter = 0;
return result;
}
识别case 子句条件与输入参数的关系,并在自动生成测试用例时可以使用特殊字符。
续作者: trace703 时间: 2006-8-3 14:48 标题: C++test的使用案例3 13 初始化对象
C++Test 在执行自动测试用例时能够自动初始化下列类型的对象:
. 复杂类型的函数参数(入口参数)
. 成员函数的隐含This 指针(前置条件)
. 全局对象(后置条件)
当使用自定义测试用例时,你能够选择使用那个构造函数来初始化对象。
13.1 【例】使用用户定义构造函数初始化对象
D:\ParaSoft\C++Test\examples\inheritance.cpp:
class Auto
{
protected:
char * _model;
unsigned int _carPrice;
unsigned int _mpg;
double _gasPrice;
public:
// default constructor
Auto(){}
// user-defined constructor
Auto(char * new_Name, int new_price, int new_mpg, double new_cost)
:_model(new_Name), _carPrice(new_price), _mpg(new_mpg), _gasPrice(new_cost)
{ }
virtual ~Auto(){}
// another way to initialize an automobile
virtual void init(char * name, int price, int mpg, double cost)
{
_model = name;
_carPrice = price;
_mpg = mpg;
_gasPrice = cost;
}
virtual char * getname()
{
return _model;
}
// the cost of the car is the sum of the price of the car plus the mileage
// divide by gas efficiency and times the price of a gallon of gas
virtual double totalCost(int mile)
{
// should make sure _mpg != 0;
return _carPrice + mile/_mpg * _gasPrice;
}
};
// Sports inherits from Auto, it uses its constructor
class Sports:public Auto
{
public:
Sports(char * new_name, int new_price, int new_mpg, double new_cost)
:Auto(new_name, new_price, new_mpg, new_cost)
{ }
Sports():Auto(){}
virtual ~Sports(){}
};
// mySports is a typical Sports car which has a constant name "myCar"
// when using the user-defined constructor, "myCar" is passed into 'new_name'
class mySports:public Sports
{
public:
mySports(int new_price, int new_mpg, double new_cost)
:Sports("myCar", new_price, new_mpg, new_cost)
{ }
mySports():Sports(){}
virtual ~mySports(){}
};
// 's' uses user-defined constructor to initialize object
double costOfaCar_1 (Sports & s, int miles)
{
return s.totalCost(miles);
}
// 's' uses default constructor, and use 'init' function to initialize object
double costOfaCar_2 (Sports & s, int miles)
{
s.init("Super", 20000, 26, 1.5);
return s.totalCost(miles);
}
// by using the user-defined constructor, 'getname()' will always return "myCar"
char * nameOfCar(mySports & m)
{
return m.getname();
}
例如,在测试costOfaCar_1 函数时,可以指定用那个构造函数初始化对象。
1)加入一个测试用例。
2)展开测试用例,右键点击Sports& s 节点,选择Use Constructors。
3)然后双击Sports()节点,选择用户定义的构造函数。
4)然后设置初始化参数。
14 自动测试用户定义构造函数和重载函数
C++Test 可以对类的每一个函数或方法(包括用户自定义构造函数和重载函数)进行自动测
试,确保其正确性。
【例】测试用户定义构造函数和重载函数
D:\ParaSoft\C++Test\examples\complex.cpp:
class Complex {
public:
Complex(float re = 0, float im = 0) : _re(re), _im(im) {}
Complex operator+(const Complex&);
Complex operator-(const Complex&);
private:
float _re;
float _im;
};
Complex Complex::operator+(const Complex& c)
{
return Complex(this->_re + c._re, this->_im + c._im);
}
Complex Complex::operator-(const Complex& c)
{
return Complex(this->_re - c._re, this->_im - c._im);
}
Complex testComplexOperators(Complex& a, Complex& b)
{
Complex zero;
Complex neg_a = zero - a;
Complex neg_a_sum_b = neg_a - b;
return a + b + neg_a_sum_b;
//this function should always return complex zero value
}
15 测试模板(template)应用
模板是C++语言中比较复杂的对象,C++Test 能够处理这种应用。
C++Test 不能直接测试模板函数或类本身,但可以测试模板函数和类的任何实例,并包括下
列特性:
. 测试任何用模板作为参数的非模板函数。
. 测试任何返回类型为模板对象的函数。
. 在函数内部使用预先实例化的对象。
15.1 【例】自动测试模板应用
D:\ParaSoft\C++Test\examples\templ.cpp:
template <class T>
class Bucket
{
public:
T _dataT;
// constructor
Bucket (T _newT):_dataT(_newT){}
T getT()
{
return _dataT;
}
T addT( T _newData)
{
return _dataT + _newData;
}
};
// creates a global Templa object smg with <int> and the value 10
Bucket <int> smg(10);
// func_1 takes in a Templa object instantiated when passing into function argument
int func_1(Bucket <int> templ)
{
return templ._dataT;
}
// func_2 uses the global object smg and returns the object itself
Bucket <int> func_2()
{
return smg;
}
// func_3 uses global object smg & returns the value of its public data member
int func_3()
{
return smg._dataT;
}
// func_4 uses global object smg & calls its public function getT()
Bucket<int> func_4()
{
return smg.getT();
}
// func_5 uses global object smg & pass in another Templa object to test 'addT' function
Bucket<int> func_5(Bucket <int> templ)
{
return smg.addT(templ._dataT);
}
该例子中包含了使用模板的几种情形,其中func_5 比较复杂。C++Test 能够对模板对象进行自动测试,下图是func_5 的一个自动测试用例。
16 自动捕获代码异常
C++Test 在测试过程中能够自动捕获代码中的异常状态,如内存存取违例、下标越界、被0
除等。这样的错误往往是造成程序莫名其妙的死机的根源。出现这种情况是因为缺少必要的
代码对数据流的合理性进行有效的检查和防范。原因有多种,如编程时考虑不周,“觉得”
通过的数据“应该是”合理的,我的程序“不会”产生不合理的数据等等。如果检测出这样
的代码异常,应该通过修改代码,排除异常错误。
16.1 【例】存取异常
D:\ParaSoft\C++Test\examples\exception_handle.cpp:
// helper function for l2a_convert() - converts unsigned values only
char *l2a_convert_slave(char *string, unsigned long number)
{
// missing checking
// if 'string' is not null / if it's capable enough
if (number >= 10) {
string = l2a_convert_slave(string, number / 10);
}
*string++ = "0123456789"[number % 10];
return string;
}
// working function for l2a()
char *l2a_convert(char *buffer, long number)
{
// missing checking
// if 'buffer' is not null / if it's capable enough
if (number < 0) {
*buffer++ = '-';
number = -number;
}
buffer = l2a_convert_slave(buffer, (unsigned long)number);
*buffer = '\0';
return buffer;
}
......
C++Test 的自动测试发现两处代码有异常。例如:
l2a_convert 函数在测试参数buffer 为NULL 时,*buffer++操作发生异常。应该在前面增加判断buffer 是否为NULL 的代码,排除隐患。
17 多文件测试
同时测试多个文件给了你更大的弹性,便于建立更实际的测试场景。
C++Test 通过建立测试单元(Create Test Unit)功能支持多文件测试:
1)选择菜单Project> Create Test Unit,弹出一个窗口,输入一个测试单元的名称。
点击左边项目树中的测试单元名,右边结果区中的Source Code tab 变成了Test Unit tab。你可
以从当前打开的文件列表中加入文件,也可以打开并加入新的文件。我们加入..\Parasoft\C++Test2.0\examples\MultiFileSupport 下的文件:
这时你就可以像测试一个文件一样对测试单元进行测试了。
18 函数序列测试
有时你需要对一些函数进行组合测试,或测试其特定的调用序列。使用测试单元功能就可以
很容易地做到这点。执行下列步骤:
. 编写一个文件,包含你希望的函数调用序列(例如一个函数的返回值可以用于另一个函数
的输入)。注意要包含所有必要的#include 文件。
. 通过定义全局变量控制中间值。这些全局变量可以在测试函数中作为前置和后置条件访问。
. 建立一个测试单元项目,并加入写好的文件以及其它必要的文件(包含在测试函数中使用
的函数)。
. 像测试一个文件一样对测试单元进行测试。
下面是函数序列测试文件的一个例子:
#include "cstack.h"
int MyTest()
{
CharStack cs;
cs.push('a');
cs.push('b');
cs.pop();
cs.push('z');
cs.pop();
cs.pop();
return cs.size();
}
int MyTest2()
{
CharStack cs;
cs.push('a');
cs.push('b');
cs.pop();
cs.push('z');
cs.pop();
cs.pop();
cs.push('1');
cs.push('2');
return cs.size();
}
19 观察测试覆盖性
C++Test 在动态测试时提供实时的覆盖性信息,包括每一行已经执行的次数和汇总的覆盖性
数据。
要监视覆盖性,首先选择:Settings> Enable Coverage,然后执行测试用例,就可以看到结果。
你还可以将测试结果保存到文件中:
Line coverage for file: D:\ParaSoft\C++Test2.0\examples\cpptest_demo.cpp
--------------------------------------------------------------
File [D:\ParaSoft\C++Test2.0\examples\cpptest_demo.cpp] 17/31 (54%)
Class [Data] 17/31 (54%)
Function [unsigned int getSize()] 3/3 (100%)
Function [char* getData()] 0/3 (0%)
Function [void copyToBuffer(char*)] 6/6 (100%)
Function [int bufLen()] 0/8 (0%)
Function [~Data()] 0/2 (0%)
Function [Data(char)] 8/9 (88%)
--------------------------------------------------------------
D:\ParaSoft\C++Test2.0\examples\cpptest_demo.cpp
--------------------------------------------------------------
Line | Count | Source
--------------------------------------------------------------
1 | | // This class holds simple character buffer of size 5.
......
11 | | class Data
12 | | {
13 | | public:
14 | | // constructor should be declared 'explicit'
15 | 6 | Data(char fill = '\0') {
16 | 6 | const unsigned SZ = getSize();
17 | 6 | _data = new char [SZ];
18 | 6 | if (_data == 0) {
19 | | throw "Out of memory";
20 | | }
21 | 6 | for (unsigned i = 0; i < SZ; ++ i) {
22 | 30 | *(_data + i) = fill;
23 | | }
24 | 6 | _data[SZ - 1] = '\0';
25 | 6 | }
......
完作者: onedayme 时间: 2006-12-27 14:59
有破解文件的嘛