CppUnit与单元测试
作者:网络转载 发布时间:[ 2013/11/20 15:42:22 ] 推荐标签:
CppUnit是什么?
CppUnit是一个测试程序框架。cpp指的是该测试程序用c++写的,unit取“单元”测试的意思。
初出现该测试框架是java版本的,名为junit。
为什么要用CppUnit?
CppUnit规范了单元测试的一些思想。这些思想朴素但非常重要。CppUnit的测试观念主要有:
测试的结果是程序直接监测的,而不是“通过人眼对屏幕上的输出结果的观测”。
因此,CppUnit并不推荐屏幕输出,或者写可视化的测试单元。
测试的过程是自动化的,不需要人工的干预。
CppUnit推荐用大量典型测试数据进行回归的方式。
测试案例是安全可控的。
如果一个测试案例错误或者发生了异常,那么应该记录这个错误,并且去执行下一个案例,而不应该停下来。CppUnit测试框架保证了这一点。
单元测试是频繁发生的,每天都进行。
由于测试案例的自动化,故此,在你的模块发生了重要改变时(特别是设计上的重大变化/重构时),你都应该马上运行一遍所有的测试程序,以确认你的代码没有引入预期(或曾经出现过)的bug。你可以在准备吃饭的时候,启动单元测试程序进行回归。
单元测试的目的是产生高质量的单元(模块)。从而减少系统集成(包括系统集成测试)的代价。
CppUnit使用样例
{
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函数大概如下:
{
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();
}

sales@spasvo.com