编辑: 山南水北 | 2019-07-01 |
51testing.com CppUnit CookBook 中文版 自己翻译的 cppunit cookbook,如有错漏,欢迎指出.可以在这里下载到 cppunit 的最新版本源码. 这只是一个 cookbook 的翻译,并没介绍安装方法,你可以在这里找到 win32 下的安 装方法和例子.不过,这个例子并不清楚,还是建议你看看这里的例子,清楚的多.看完这 些安装方法和例子之后, 再回头看看这篇 cookbook, 应该会帮助你理解例子里面那些代码 的含义.
1、简单的测试案例 怎么才能知道你的代码是不是能够正常工作?有很多方法可以达到这个目的. 通过调试 器单步跟踪, 或者在你的代码里加入打印输出代码是两个比较简单的办法, 但是这两个方法 都有缺点.单步跟踪不能自动进行,每次代码稍有调整就要进行调试.打印输出也不错, 只 是这种方法会增加很多不必要的代码,导致代码臃肿丑陋. CppUnit 单元测试很容易建立起来,并且可以自动进行,而且,一旦你写完测试用例, 就能通过它们保证你的代码质量. 按照下面的流程可以构造一个简单的 test:
1、继承 CppUnit::TestCase 类.
2、重写 runTest()方法.
3、使用 CPPUNIT_ASSERT()和CPPUNIT_ASSERT(bool)两个宏来检测表达式或值, 以判断测试成功与否. 举个例子,如果要测试一个复数类的赋值(=号)运算符,按照上面的步骤,代码如下:
01 class ComplexNumberTest : public CppUnit::TestCase
02 {
03 public:
04 ComplexNumberTest( std::string name ) : CppUnit::TestCase( name ) {}
05 void runTest()
06 {
07 CPPUNIT_ASSERT( Complex (10, 1) == Complex (10, 1) );
08 CPPUNIT_ASSERT( !(Complex (1, 1) == Complex (2, 2)) );
09 }
10 };
一个简单的 test 就建起来了.但通常来说,我们会在同一个对象里面有很多小的测试 用例.这种情况下,我们用 fixture.
2、fixture fixture 是为一组测试用例提供基础服务的对象,当你边开发边测试时,使用 fixture 非 常方便.我们试着模拟一下这种边开发边测试情况. 假设我们真的在开发一个复数类,首先,定义一个空的 Complex 类:
1 class Complex {};
现在, 创建一个上面的 ComplexNumberTest 类对象, 然后编译代码看看会发生什么. 我们会得到几个编译错误. 因为测试过程中用到了==操作符, 但我们并没定义这个运算符. 现在为 Complex 类定义一个:
1 bool operator==( const Complex &
a, const Complex &
b)
2 {
3 return true;
4 } 再次编译运行这个测试.这次编译虽然通过了,但测试却是失败的. 要再做一点点事情让==操作符正常工作,重写代码如下:
01 class Complex
02 {
03 friend bool operator ==(const Complex&
a, const Complex&
b);
04 double real, imaginary;
05 public:
06 Complex( double r, double i =
0 ) :real(r) , imaginary(i) {}
07 };
08 bool operator ==( const Complex &
a, const Complex &
b )
09 {
10 return a.real == b.real &
&
a.imaginary == b.imaginary;
11 } 编译运行,测试顺利通过. 好了,现在我们准备增加一些新的操作和新的测试.这个时候,fixture 就体现出方便 性了.因为在这个时候,如果使用 fixture 实例化三四个 Complex 对象,并且在测试过程 中复用这几个对象,这样不需要重复构建这些实例对象,测试代码会更加好写. fixture 的使用步骤如下: - 给每个 fixture 添加成员变量;
- 重写 CppUnit::TestFixture::setUp()以初始化这些变量;