您的位置:首页 > 职场人生

UnitTest++使用方法 推荐

2009-09-10 22:49 309 查看
UnitTest++是C++工程下使用的一个非常小巧、方便的单元测试工具。它提供了与CppUnit相似的功能,但它把用例写作的工作量最小化了,使用起来更方便,这些都得益于它的框架构思非常巧妙,如果想知道详细情况可参考源代码。此工具本身不支持VC6,我把它改进了一下。 下面是CppUnit与UnitTest++的简单比较:


1.使用方法 1.1. 环境准备1.1.1. 编译生成UnitTest++.lib文件。 1.1.2. 设置一个环境变量UNITTEST_CPP_PATH。

1.1.3. 如下图,把UnitTest++的所有头文件复制过来。

1.1.4. 如下图,把刚才编译的.lib文件复制过来。

1.2. 工程设置 需要测试的工程需要做如下设置。 1.2.1. 增加头文件搜索路径:

1.2.2. 增加库文件搜索路径:

1.2.3. 在main()函数所在文件中加载刚才的lib文件。在main()函数中调用UnitTest::RunAllTests();那么所有测试用例便都会被执行了

1.3. 用例写作 一般可以为每个模块新建一个cpp文件用于写测试用例。 1.3.1. 简单的测试用例

// test.cpp


#include <UnitTest++.h>


TEST(TestCaseName)


{


int ret = TestFunction();


CHECK(ret == SUCCESS);


}
注: 1、 每个测试用例都以TEST开始,后面括号中是用例名字,不允许重复。 2、 一般情况下,检查结果用CHECK宏即可。更多的检查方式可以参考源代码或者UnitTest++自带的文档。下面列举一些常用的宏: CHECK_EQUAL(expected, actual) 检查是否相等 CHECK_CLOSE(expected, actual, tolerance) 检查在可容忍的误差范围内是否相等(多用于浮点数相等判断) CHECK_ARRAY_EQUAL(expected, actual, count) 检查数组是否相等,前面两个参数都是数组名字,count是元素个数。 CHECK_ARRAY_CLOSE(expected, actual, count, tolerance) 参考上面两个的说明。 CHECK_ARRAY2D_CLOSE(expected, actual, rows, columns, tolerance) 二维数组。 CHECK_THROW(expression, ExpectedExceptionType)检查是否会抛出指定类型的异常。 CHECK_ASSERT(expression) 检查是否会抛出UnitTest::AssertException类型的异常。 3、 每个测试用例都被自动添加到待运行的用例集合。 1.3.2. 测试套SUIT的使用 如果希望一组测试用例放在一个组中,则可以用SUIT。

SUITE(YourSuiteName)


{


TEST(YourTestName)


{


}


TEST(YourOtherTestName)


{


}


}
1.3.3. FIXTURE的使用 如果希望在一组用例执行前执行某一部分代码(即setUP),测试结束后再执行一段代码(即tearDown),或者是希望多个用例中的数据进行共享,那么可以用FIXTURE。

struct SomeFixture


{


SomeFixture() { /* some setup */ }


~SomeFixture() { /* some teardown */ }


int testData;


};


TEST_FIXTURE(SomeFixture, YourTestName)


{


int temp = testData;


}
注: 1、 使用FIXTURE需要先定义一个结构SomeFixture。 2、 把setUp中要运行的代码放到SomeFixture的构造函数中。 3、 把tearDown中要运行的代码放到SomeFixture的析构函数中。 4、 SomeFixture中的成员可以用于测试数据共享。 5、 每个用例都用TEST_FIXTURE来定义,与TEST宏一样,这样定义的用例也会被自动加入待运行的用例集合。 1.3.4. 限制用例部分代码的执行时间 可以限制用例中的一部分代码只能在规定时间内运行完(如果运行不完,用例fail)。

TEST(YourTimedTest)


{


// Lengthy setup...


{


UNITTEST_TIME_CONSTRAINT(50);


// Do time-critical stuff


}


// Lengthy teardown...


}
如果“Do time-critical stuff”部分的代码在50ms内没运行完,则用例fail。 1.4. 高级用法 1.4.1. 修改UnitTest++源代码可以进行功能定制。

int RunAllTests()


{


TestReporterStdout reporter;


return RunAllTests(reporter, Test::GetTestList(), 0);


}
1、 在UnitTest++源代码中修改上面的RunAllTests(reporter, Test::GetTestList(), 0)最后一个参数0,可以设置全局的时间约束,即每个用例的执行时间必须少于此时间约束,否则用例fail。 2、 可以改变reporter的类型,从而改变测试结果输出方式。比如用XmlTestReporter把结果输出到xml文件。 1.4.2. 更多的高级用法 通过学习UnitTest++源代码、UnitTest++自身的测试代码来获得。UnitTest++自身的测试代码写得很好,学习它可以了解UnitTest++的功能和测试用例的写作方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲 UnitTest