叮当小说网 找小说网 无限小说网 红尘小说网 幻想小说网 酷文学 深夜书屋

CppUnit与单元测试

CppUnit与单元测试

许式伟
2004年6月

cppunit是什么?

cppunit是一个测试程序框架。cpp指的是该测试程序用c++写的,unit取“单元”测试的意思。
最初出现该测试框架是java版本的,名为junit。

为什么要用cppunit?

cppunit规范了单元测试的一些思想。这些思想朴素但非常重要。cppunit的测试观念主要有:

  • 测试的结果是程序直接监测的,而不是“通过人眼对屏幕上的输出结果的观测”。
    因此,cppunit并不推荐屏幕输出,或者写可视化的测试单元。
     
  • 测试的过程是自动化的,不需要人工的干预。
    cppunit推荐用大量典型测试数据进行回归的方式。
     
  • 测试案例是安全可控的。
    如果一个测试案例错误或者发生了异常,那么应该记录这个错误,并且去执行下一个案例,而不应该停下来。cppunit测试框架保证了这一点。
     
  • 单元测试是频繁发生的,每天都进行。
    由于测试案例的自动化,故此,在你的模块发生了重要改变时(特别是设计上的重大变化/重构时),你都应该马上运行一遍所有的测试程序,以确认你的代码没有引入预期(或曾经出现过)的bug。你可以在准备吃饭的时候,启动单元测试程序进行回归。
     
  • 单元测试的目的是产生高质量的单元(模块)。从而减少系统集成(包括系统集成测试)的代价。

cppunit使用样例

class TestBSTR : public TestCase
{
public:
    CPPUNIT_TEST_SUITE(TestBSTR);
        CPPUNIT_TEST(test_allocString);
        CPPUNIT_TEST(test_allocStringWithLen);
        CPPUNIT_TEST(test_allocChinese);
    CPPUNIT_TEST_SUITE_END();

public:
    
void test_allocString()
    {
        BSTR p;
        WCHAR szHello[] 
= L"Hello, world!";

        p 
= SysAllocString(szHello);
        CPPUNIT_ASSERT( wcscmp(p, szHello) 
== 0 );
        CPPUNIT_ASSERT( SysStringLen(p) 
== wcslen(szHello) );

        SysReAllocString(
&p, szHello);
        CPPUNIT_ASSERT( wcscmp(p, szHello) 
== 0 );

        SysFreeString(p);
    }

    
void test_allocStringWithLen()
    {
        BSTR p;

        p 
= SysAllocStringLen(L"ABCDEFGH"4);
        CPPUNIT_ASSERT( wcscmp(p, L
"ABCD"== 0 );

        SysReAllocStringLen(
&p, L"XYZ"2);
        CPPUNIT_ASSERT( wcscmp(p, L
"XY"== 0 );
        CPPUNIT_ASSERT( SysStringLen(p) 
== 2 );

        SysFreeString(p);

        SysAllocString(L
"Memory leak checker");
    }

    
void test_allocChinese()
    {
        BSTR p 
= SysAllocString(L"中文!");
        CPPUNIT_ASSERT( SysStringLen(p) 
== 3 );
        CPPUNIT_ASSERT( wcscmp(p, L
"中文!"== 0 );
        SysFreeString(p);
    }
};

CPPUNIT_TEST_SUITE_REGISTRATION(TestBSTR);
// 使用CPPUNIT_TEST_SUITE_REGISTRATION辅助宏注册测试类  

int main()
{
    TestApp app;
    
return 0;
}

这里TestApp是我自己写的辅助类。CppUnit标准的main函数大概如下:

int main()
{
    CPPUNIT_NS::Test 
*suite = CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest();
    CPPUNIT_NS::TextUi::TestRunner runner;
    runner.addTest( suite );
    
    CPPUNIT_NS::Outputter
* outputter;
    outputter 
= new CPPUNIT_NS::CompilerOutputter(&runner.result(), std::cerr);
    runner.setOutputter(outputter);
    
    
return runner.run();
}

 

补充

如果你已经使用CppUnit,并在使用中遇到问题,那么你的体验有可能与我类似。这方面的内容,参考《CppUnit的缺陷与改进》。

posted on 2006-12-19 00:22  麦哲思科技  阅读(168)  评论(0)    收藏  举报

导航