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();
}
查看本文来源