51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 12161|回复: 18
打印 上一主题 下一主题

[原创] C++test的使用案例

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2006-8-3 14:40:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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也可能越界。
另外,也可以设置自己的测试用例,设置预期的结果,进行对算法正确地判断。如下图:

当datat[0]=2147483647,size=1,这时候sum肯定=2147483647,否则就是算法错误。其实这个测试用例是C++Test自动生成的,怎么样?够强大吧。
1.2        个人意见
有人认为:
C++Test速度慢,耗系统资源,测试执行效率低。
我觉得,如果你要马上看到测试结果,最好一个文件一个文件的测试,因为你还要仔细分析测试用例和测试结果。如果你想大规模的对很多文件进行单元测试,最好下班前做好准备,第二天早上来看结果。我对一个VC的工程,856K大小的源程序,46个C文件,用了两个小时。不过也是应该的,因为要生成很多的测试程序、桩程序和测试用例,很麻烦的。
基于消息驱动的,函数之间传递的参数多为消息结构或消息的指针,对于这种类型的函数测试,C++Test的自动生成的测试用例和测试结果都没有实际意义,必须人工编辑测试用例。
我觉得,C++Test主要是对指针的保护、越界,数组的越界,变量的越界等很有用,对于数学运算等函数,可以明确知道返回值的,可以设置预期的返回值,来检查算法是否正确。对于可以通过以下的7 种类型的值的设置可以判断函数算法的正确也很有用。对于象数据库,可以用对函数来互相测试,例如测试建立一个数据库的函数,可以用写库函数或读库函数来判断是否建立正确。对于象消息的建立、释放等也可以用对函数来互相测试。本来单元测试的目的就是查找一些保护、越界错误,简单的可以通过以下7种来判断的函数的算法正确,代码走读是必不可少的。对于复杂的函数还要靠自己建立驱动程序和桩函数。
C++Test 测试用例可以控制7 种类型的变量条件(取决于被测函数用了多少):
. 参数(Arguments): 函数的入口参数。
. 参数出口条件(Arguments Post): 函数执行完成时入口参数的状态。
. 返回值(Return): 函数的返回值。
. 对象前置条件(Pre Conditions> This): 测试开始前对象的条件。
. 对象后置条件(Post Conditions> This): 测试执行后对象的条件。
. 前置条件(Pre Conditions> Externals): 测试开始前全局变量的条件。
. 后置条件(Post Conditions> Externals): 测试执行后全局变量的条件。
2        如何操作C++Test
2.1        在VC见面下
选择动态分析按钮,输出结果可以输出到VC的OUTPUT窗口或C++Test界面的窗口。建议输出到C++Test界面的窗口,看到的内容比较直观和多。
2.2        在C++Test的界面下
打开一个VC的工程,先Read Symbls,再运行动态分析。察看分析结果,如果有必要可以对一个函数增加一个自己的测试用例进行单独测试。
也可以建立一个测试单元包含几个文件测试,桩函数可以选择是自己原先的函数还是C++Test创建的函数。
以下是一些说明:
3        设置自己的测试参数
C++Test 有三种类型的测试参数设置:
通用设置(General):应用于整个C++Test 操作。命令:Settings> Customize。
项目设置(Project): 应用于项目中所有的C++Test 测试。命令:Project> Project Settings。
自动测试设置(Automatic):应用于动态分析测试。命令:Project> Project Test Configuration;
如果要为某个文件、类或方法定制测试参数:在项目树中选择目标符号(如项目、类或方
法),然后用右键或菜单选择Project > File/Class/Method Test Configuration。
自动测试设置由三部分组成:值、类型和测试用例生成。

3.1        自动测试设置[值-Value Groups]
这些设置描述在动态分析测试时分配给变量的值一般是如何确定的:
Parent Values:Values are defined only in the parent's context。
Standard Values:在测试参数中预先定义的标准值。
Heuristic Values:在自动生成测试用例时采用“智能参数推测(Smart Argument Guessing)”
技术―――一种内建的专门为测试设计的智能系统,可以根据代码中的上下文关系生成更好
的输入值。具体示例见【自动测试尽可能多的分支和边界条件】。
User Defined Values:用户自定义的特殊值。←自定义值
3.2        自动测试设置[类型-Types]
C++Test 在测试每种类型的变量(布尔/字符/整数等)时将要分配的值。你可以使用或禁用某些值,或增加自己的特定值。C++Test 还提供了指定一组值的能力。
【例】设计一组整数值
选择:Types>int>,单击[Add Value],单击[Values’ Range],然后输入你想要的值。
(1)按步长5 定义一组5 个值(-10, -5, 0, 5, 10):
(2)在[-10,10]内随机生成5 个值(可能是-8, 1, 3, 4, 10):

3.3        自动测试设置[测试用例生成- Test Case Generation]
控制动态分析测试的测试用例生成:

Max. Count of Generated Test Cases: 对一个被测函数可能生成的最大测试用例的数量。允
许任何大于0 的整数。默认是50个,可以修改。
Max Depth of Field Inspection: 对分层或嵌套的类可能生成的测试用例的最大深度。允许任
何大于0 的整数。有时不很容易确定合适的域检查的最大深度。我们建议你观察一下测试
结果浏览窗,在你的初始测试中包括多少层次的检查,如果你需要更多的检查层次,增加
该值。
Timeout (in seconds) for Test Case Execution: 一个测试用例执行的最长时间(秒数),超过
这个时间,C++Test 将给出一个信息并终止当前测试用例的执行,转到下一个测试用例执
行。允许任何大于0 的整数。
Max. Dynamic Allocation Size: 对于一个给定的变量,当动态分配内存(该变量类型)时,
分配的元素的最大数量。该参数避免分配过量的内存,而你在当前测试时并不需要,例如
数组。允许任何大于0 的整数。
Object Initialization Mode: 你可以自由选择地初始化对象,有三种方法:
1)        Use Constructors   ―――使用构造函数,
2)        Using Member Wise ―――在成员函数中直接初始化,
3)        Use Object Repository ―――使用对象库中保存的自定义对象。可以组合使用这些方法。注意只使用构造函数时,产生的测试用例可能比预期的要少。
Dynamic Analysis Mode for Symbols without Test Cases: Auto-Generate Test Cases: 控制是否要自动生成测试用例。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2006-8-3 14:41:26 | 只看该作者

C++test的使用案例2

4        自动执行白盒测试
白盒测试的目的是验证一个类的所有成员方法或函数(包括保护和私有成员)是否足够强壮
(robust),当遇到各种预期或非预期的输入时它们的执行是否正确。
C++Test 通过自动生成和执行大量的测试用例,检查代码在各种输入下的行为,并报告异常
行为。这是一个非常好的做进一步测试和调整测试用例的开始点,例如继续进行黑盒测试。
5        黑盒测试
黑盒测试的目的是检查类的功能性是否正确,即类的接口的执行(输入和输出)是否符合说
明书(设计文档)。
你需要比较一个测试用例的实际执行结果(输出)是否与预期的输出一致。在C++Test 中,
第1 次执行测试用例(自动或用户自定义)后,会将其结果自动保存在输出条件中,你可以使用上述结果也可以自己设置正确的预期输出(通过测试用例编辑器,见下节)。
6        定制测试用例
使用“测试用例编辑器”定制或建立自己的测试用例。

C++Test 测试用例可以控制7 种类型的变量条件(取决于被测函数用了多少):
. 参数(Arguments): 函数的入口参数。
. 参数出口条件(Arguments Post): 函数执行完成时入口参数的状态。
. 返回值(Return): 函数的返回值。
. 对象前置条件(Pre Conditions> This): 测试开始前对象的条件。
. 对象后置条件(Post Conditions> This): 测试执行后对象的条件。
. 前置条件(Pre Conditions> Externals): 测试开始前全局变量的条件。
. 后置条件(Post Conditions> Externals): 测试执行后全局变量的条件。
C++Test 能够支持任意类型的变量和条件,并且你可以控制到每个变量的任意层次上或最底
层的基本类型变量,你可以任意修改和扩充变量的值。
7        对象库
如果你需要经常用到一个对象的一组变量值,可以将它保存到对象库中。在定制其它测试用
例时可以直接复制这组值。

关于测试用例的各种复杂应用见下面各个例子。
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;
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2006-8-3 16:34:38 | 只看该作者

很有帮助,谢谢

顶一个
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2006-8-3 16:36:55 | 只看该作者

能把你的邮箱告诉我吗,我下到的c++ test没有license

把你的邮箱告诉我吧
或者发到我的邮箱nancymin8291@163.com  
qq8628573
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2007-4-22 11:21:46 | 只看该作者
谢谢啦,好东西大家顶sdlkfj6
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2007-5-11 11:03:38 | 只看该作者
收藏
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2007-5-11 13:19:59 | 只看该作者
已阅,8错
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2007-7-6 11:54:11 | 只看该作者
ding
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2007-7-28 20:22:16 | 只看该作者
好!
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2007-7-31 22:14:15 | 只看该作者
顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2007-8-15 11:14:41 | 只看该作者
看看
回复 支持 反对

使用道具 举报

该用户从未签到

12#
发表于 2007-9-12 11:55:44 | 只看该作者
很有帮助!!!
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 2007-9-17 10:55:22 | 只看该作者
ding
回复 支持 反对

使用道具 举报

该用户从未签到

14#
发表于 2008-4-8 11:01:24 | 只看该作者
very good!
thanks a lot
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2008-11-12 14:40:12 | 只看该作者
有没有用c++test进行集成测试的文章呢 。。。我的邮箱是taxianggirl@126.com发给我,谢谢啦
回复 支持 反对

使用道具 举报

该用户从未签到

16#
发表于 2011-1-17 14:21:59 | 只看该作者
您好  有没有用c++test 或者cppunit进行集成测试的具体例子呢  谢谢了  我的邮箱是wang212lei@163.com     
回复 支持 反对

使用道具 举报

该用户从未签到

17#
发表于 2011-5-26 16:59:36 | 只看该作者
顶顶更健康
回复 支持 反对

使用道具 举报

该用户从未签到

18#
发表于 2012-4-17 13:37:00 | 只看该作者
你好,请教一下,用C++ test对某个接口类进行测试时,当程序阻塞时是否能自动结束进行的用例继续执行其他用例并报错??还有就是在遇到某个测试用例执行时里面因空指针或者其他异常导致的程序crash是否能报错啊?
回复 支持 反对

使用道具 举报

  • TA的每日心情

    2015-9-22 14:39
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    19#
    发表于 2012-9-13 17:01:10 | 只看该作者
    您好,请教一下,C++Test(6.7)进行unit Testing (source )测试后,测试用例的通过率为0,而且LC、BBC、DC等覆盖为0,这个问题怎么解决。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-24 12:39 , Processed in 0.080569 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表