首页 程序猿 软件测试 浏览内容
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;}
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();}