您的位置:软件测试 > 开源软件测试 > 开源单元测试工具 > cppUnit
用CPPUnit做单元测试
作者:网络转载 发布时间:[ 2013/3/4 16:11:41 ] 推荐标签:

例子如下:
int additionPropertiesTest()
{
    //conmutative: a + b = b + a
    if ( addition(1, 2) != addition(2, 1) )
    {
 return (FALSE);
    }

    //asociative: a + (b + c) = (a + b) + c
    if ( addition(1, addition(2, 3)) != addition(addition(2, 1), 3 ) )
    {
 return (FALSE);
    }

    //neutral element: a + NEUTRAL = a
    if ( addition(10, 0) != 10 )
    {
 return (FALSE);
    }

    //inverse element: a + INVERSE = NEUTRAL
    if ( addition(10, -10) != 0 )
    {
 return (FALSE);
    }

    return (TRUE);
}
上面的例子测试了多个数据相加顺序不同的情况。
上述的两个Test Case组成了一个Test Suite,Test Suite是指用来测试同一被测单元的一组Test Case。
在开发被测模块时必须同时编写这些Test Case和Test Suite的代码,被测模块变更时,要同时变更(有时需要增加)相应的Test Case和Test Suite。
举例来说,当求和模块升级为可以对小数求和的模块,必须变更Test Case和Test Suite,加入诸如addDecimalNumbersTest之类的Test Case。
极限编程建议程序员在编写目标模块之前开发出所有单元测试中要用到的Test Case。其主要理由是:一旦程序员处于开发过程之中,那么他进入了一个持续改进的阶段,必须同时考虑单元模块功能、需要公布的接口、需要给方法传递的参数、外部访问、内部行为等等。在编写目标单元之前通过开发Test Case,可以对需要考虑的这些因素有更好的了解,这样编写目标模块与其他方法相比速度会更快,代码的质量也会更好。
每当开发团队需要发布新版本的时候,都要进行彻底的单元测试。所有的单元必须通过单元测试,这样可以发布成功的版本。如果有1个或以上的单元没有通过所有的测试,Bug出现了。遇到这种情况需要在进行测试,如果需要的话还需要增加新的Test Case,检查可以使Bug再现的所有情况。如果新的Test Case可以使Bug重现,可以修正这个Bug,然后再进行测试,如果模块通过了测试,可以认为Bug已经修正,可以发布新的无Bug版本了。
为每一个发现的Bug添加新的Test Case是很有必要的,因为Bug会反复出现,当其重复出现时需要有效的测试来检测Bug。这样的话,Test Bettery会逐渐膨胀直至覆盖所有的历史Bug和潜在的错误。
测试工具:
有两个小伙子,一个叫Kent Beck,另一个叫Eric Gamma,他们写了一系列的Java类,希望可以把测试做的尽可能自动化,并称之为JUnit,JUnit使整个单元测试界产生的很大的震动。其他的开发者们把JUnit的代码移植到其他语言上,构建了一大系列称为xUnit框架的产品。其总包括C/C++的CUnit和CPPUnit,Delphi的DUnit,Visual Basic的VBUnit,.NET平台上的NUnit,等等。
所有这些框架都采用同样的规则,对语言的依赖性很小,熟悉其中一个框架能够熟练应用其他框架。
下面要讲的是如何通过使用CPPUnit来编写测试代码并提高单元的质量。
CPPUnit采用面向对象的编程方法,中间会遇到诸如封装、继承、多态这些概念。另外,CPPUnit采用C++ SEH(Structured Exception Handling),所以还会遇到异常的概念,以及throw, try, finally, catch这些指令。
CPPUnit
每一个Test Case都需要在TestCase类的派生类中定义。TestCase类中包含了许多基本的功能,比如运行测试、在Test Suite中注册Test Case等。
比如在需要写一个在磁盘上存储数据的小模块的时候,模块(定义为DiskData类)主要实现两个功能:读取数据和装载数据。例程如下:
typedef struct _DATA
{
    int number;
    char string[256];
}DATA, *LPDATA;

class DiskData
{
public:
    DiskData();
    ~DiskData();

    LPDATA getData();
    void setData(LPDATA value);

    bool load(char *filename);
    bool store(char *filename);

private:
    DATA m_data;
};

此时,首先要做的事情不是弄明白上面的代码是如何变出来的,而是要确定上面所定义的类是否完成了设计的全部功能——正确地读取和存储数据。

为此,需要设计一个新的Test Suite,其中包含两个Test Case:一个读取数据、一个存储数据。

使用CPPUnit

新版本的CPPUnit可以在http://cppunit.sourceforge.net/上免费下载到,其中包含所有的库文件、文档、例子程序和其他有趣的素材。

在Win32环境下,可以在VC++(6.0或更新版本)中使用CPPUnit,由于CPPUnit采用的是ANSI C++,所以可应用于C++ Builder等开发环境中的版本较少。
构建库文件的步骤可以在CPPUnit发布版本的INSTALL-WIN32.txt文件中找到。构
建好库文件之后可以着手编写Test Suite了。

在VC++下编写单元测试程序的步骤如下:
 创建一个基于MFC的对话框应用程序(或者文档应用程序)
 开启RTTI:Project Settings -> C++ -> C++ Language
 在include目录中加入CPPUnitinclude:Tools -> Options -> Directories -> Include
 连接cppunitd.lib(静态连接)或者cppunitd_dll.lib(动态连接),testrunnerd.lib。如果是在“Release”配置下编译,同样需要连接这些库文件,只是需要把名称中的“d”字母去掉。
 拷贝testrunnerd.dll文件到可执行文件夹的下面(或者路径下的其他文件夹中),如果是动态连接的话,还需要拷贝cppunitd_dll.dll(“Release”配置下需要拷贝testrunner.dll和cppunit_dll.dll)。

配置好之后即可以着手进行单元测试类编码了。

待测试的DiskData类,主要实现两个功能:读取和存储磁盘上的数据。要测试这两个功能,需要两个Test Case:一个负责读取数据、一个负责存储数据。

上一页1234下一页
软件测试工具 | 联系我们 | 投诉建议 | 诚聘英才 | 申请使用列表 | 网站地图
沪ICP备07036474 2003-2017 版权所有 上海泽众软件科技有限公司 Shanghai ZeZhong Software Co.,Ltd