现在的位置: 首页 > 综合 > 正文

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

2014年04月05日 ⁄ 综合 ⁄ 共 2136字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.