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的缺陷与改进》。

你可能感兴趣的:(C++,框架,单元测试,测试,JUnit,Class)