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();
}