加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 20:26:28 所属栏目:百科 来源:网络整理
导读:本系列文章探讨TDD(测试驱动开发)与VTDD(可视化的TDD)。内容分为三部分:开源测试框架介绍,TDD探讨,VTDD探讨。关于开源测试框架,网上有大量相关文章,我本来不想再写,但是我尝试了CppUnit的另一种使用方式,比较简单和高效,因此分享出来,其他开源框架

本系列文章探讨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 替换为 被测试类的头文件名。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读