TDD与VTDD系列(一):CppUnit的改进与使用(1)

前端之家收集整理的这篇文章主要介绍了TDD与VTDD系列(一):CppUnit的改进与使用(1)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本系列文章探讨TDD(测试驱动开发)与VTDD(可视化的TDD)。内容分为三部分:开源测试框架介绍,TDD探讨,VTDD探讨。关于开源测试框架,网上有大量相关文章,我本来不想再写,但是我尝试了CppUnit的另一种使用方式,比较简单和高效,因此分享出来,其他开源框架就不写了。

CppUnit的改进与使用(1)


这个改进后的使用方法是我为一个企业培训时所准备的,由于学员以测试人员为主,编程基础较差,所以我采用了模板替换的方式,来建立测试文件和测试代码框架,可以减少工作量,也比较容易上手。另外,为CppUnit添加了一些代码,用于解决代码与用例的匹配问题。代码及示例可在这里下载:http://download.csdn.net/source/2394472

“模板”文件夹有五个文件
用于生成测试类的模板文件:TestMyClass.h和TestMyClass.cpp
两个可重用的文件:CppUnitPub.h和TestRun.cpp
函数示例文件:Stub.cpp

1 文件CppUnitPub.h
包含了CppUnit的常用头文件,编写测试文件及桩文件时应包含这个文件
定义了两个宏:
CASE_BEGIN(name) :用于用例的开头,name为用例名字符串,不需要为用例命名时,可以填空字符串。这个宏会调用setUp()并设置用例名。
CASE_END():用于用例结束,这个宏会调用tearDown()。
这两个宏还将用例前后用{}括起来,每个用例自成一个域,使多个用例可以使用相同的变量名。
还定义了一个可在桩代码中判断当前用例名的函数caseNameIs(name),name为字符串。
编写用例时可以使用以下示例的格式:
CASE_BEGIN("Failed");
gExpectTemperature = 25; //输入
int second = 0; //输入
int ret = pObj->WorkTime(&second);
CPPUNIT_ASSERT_EQUAL(0,ret); //输出
CPPUNIT_ASSERT_EQUAL(0,second); //输出
CASE_END();

CASE_BEGIN("ok-28");
gExpectTemperature = 25;
int second = 0;
int ret = pObj->WorkTime(&second);
CPPUNIT_ASSERT_EQUAL(1,ret);
CPPUNIT_ASSERT_EQUAL(180,second);
CASE_END();

这种格式的好处是用例的输入与输出一目了然,可以适应复杂的输入输出,且编写好一个用例并编译执行后,添加更多用例时,可以拷贝并修改现有用例,通常,不同用例之间只是个别数据不同,拷贝修改是比较高效的方试。这种格式下,一个函数对应一个测试函数,测试数据比较容易管理,也比较容易检查完整性,代码量也比较少,但与xUnit常规的测试代码组织方式不同,xUnit的常规方式是一个用例编写一个测试函数。由于与xUnit常规方式不同,当一个测试函数内多个用例测出了错误时,只会显示第一个错误信息,可在修改代码,消除该错误后重新执行。


需编写桩代码时,可以使用以下示例的格式,能够比较便利地解决用例与桩输出之间的匹配关系:
int GetTemperature(int* pTemperature)
{
if(caseNameIs("Failed"))
return 0;

if(caseNameIs("ok-28"))
{
*pTemperature = 28;
return 1;
}

//…
}


2 文件TestRun.cpp
定义了执行测试的函数TestRunAll(),每个测试类需在这里注册代码如下:
void TestRunAll()
{
CppUnit::MfcUi::TestRunner runner;

//注册测试类,如
//runner.addTest(TestCMyClass::GetSuite());

runner.run(); //show UI
}


3 测试类模板:TestMyClass.h和TestMyClass.cpp 测试类不用从头编写,可用拷贝模板文件替换的方式建立,方法是: 1) 将TestMyClass.h和TestMyClass.cpp拷贝到测试工程,并将文件名中的MyClass替换为实际类名。 2)使用文本编辑工具进行以下替换: TestClassName 替换为 实际的测试类名。 ClassName 替换为 实际的被测试类。 TestHeaderName替换为 测试类的头文件名。 HeaderName 替换为 被测试类的头文件名。

猜你在找的设计模式相关文章