CppUnit的改进与使用(1)
@H_502_0@这个改进后的使用方法是我为一个企业培训时所准备的,由于学员以测试人员为主,编程基础较差,所以我采用了模板替换的方式,来建立测试文件和测试代码框架,可以减少工作量,也比较容易上手。另外,为CppUnit添加了一些代码,用于解决桩代码与用例的匹配问题。代码及示例可在这里下载:http://download.csdn.net/source/2394472 @H_502_0@“模板”文件夹有五个文件:
用于生成测试类的模板文件:TestMyClass.h和TestMyClass.cpp
两个可重用的文件:CppUnitPub.h和TestRun.cpp
桩函数示例文件:Stub.cpp @H_502_0@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(); @H_502_0@ 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(); @H_502_0@ 这种格式的好处是用例的输入与输出一目了然,可以适应复杂的输入输出,且编写好一个用例并编译执行后,添加更多用例时,可以拷贝并修改现有用例,通常,不同用例之间只是个别数据不同,拷贝修改是比较高效的方试。这种格式下,一个函数对应一个测试函数,测试数据比较容易管理,也比较容易检查完整性,代码量也比较少,但与xUnit常规的测试代码组织方式不同,xUnit的常规方式是一个用例编写一个测试函数。由于与xUnit常规方式不同,当一个测试函数内多个用例测出了错误时,只会显示第一个错误信息,可在修改代码,消除该错误后重新执行。 @H_502_0@
需编写桩代码时,可以使用以下示例的格式,能够比较便利地解决用例与桩输出之间的匹配关系:
int GetTemperature(int* pTemperature)
{
if(caseNameIs("Failed"))
return 0; @H_502_0@ if(caseNameIs("ok-28"))
{
*pTemperature = 28;
return 1;
} @H_502_0@ @H_502_0@ //…
} @H_502_0@
2 文件TestRun.cpp
定义了执行测试的函数TestRunAll(),每个测试类需在这里注册,代码如下:
void TestRunAll()
{
CppUnit::MfcUi::TestRunner runner; @H_502_0@ //注册测试类,如
//runner.addTest(TestCMyClass::GetSuite()); @H_502_0@ runner.run(); //show UI
} @H_502_0@
3 测试类模板:TestMyClass.h和TestMyClass.cpp 测试类不用从头编写,可用拷贝模板文件替换的方式建立,方法是: 1) 将TestMyClass.h和TestMyClass.cpp拷贝到测试工程,并将文件名中的MyClass替换为实际类名。 2)使用文本编辑工具进行以下替换: TestClassName 替换为 实际的测试类名。 ClassName 替换为 实际的被测试类。 TestHeaderName替换为 测试类的头文件名。 HeaderName 替换为 被测试类的头文件名。 原文链接:https://www.f2er.com/javaschema/287556.html