本文是一篇简单的入门指导,帮助你快速上手。
简单测试用例(Simple Test Case)
你希望知道你的代码是否正在工作。
你该怎么办?
有很多种方法。使用调试器直接调试或者在你的代码里乱丢一些流输出指令是两种简单的方法,但是它们都有自己的缺点。直接调试代码是个好主意,但是它不是自动进行的。你不得不在每次改动代码以后重新调试。输出流文本也不错,但是它使代码变得面目可憎,并且大多数情况下,它输出的信息比你想要的要多。
在CppUnit中测试可以自动进行。这些测试可以很容易被建立,并且一旦你书写完毕,他们可以帮助你时刻了解你代码的质量。
为了做一个简单的测试,下面这些是你要做的:
从TestClass中派生一个类。Override runTest()方法。当你希望检查一个值的时候,调用 CPPUNIT_ASSERT(bool),如果测试成功这个assert表达式可以被顺利通过。
比如,为了测试一个复数类的等值比较,书写如下:
class ComplexNumberTest : public CppUnit::TestCase {
public:
ComplexNumberTest( std::string name ) : CppUnit::TestCase( name ) {}
void runTest() {
CPPUNIT_ASSERT( Complex (10, 1) == Complex (10, 1) );
CPPUNIT_ASSERT( !(Complex (1, 1) == Complex (2, 2)) );
}
};
这是一个简单的测试。通常来说,你会有很多小的测试用例,并且希望能在同一个对象集合中测试。为了达到这个目的,使用fixture。
Fixture
一个fixture是一组对象,被用来作为测试一组用例的基础。当你边开发边测试的时候,使用fixture会非常方便。
那我们尝试一下这种开发方式,同时学习一下fixture的使用方法。假定我们是想开发一个复数的类,我们从定义一个名为Complex的空类开始。
class Complex{};
现在建立上面那个ComplexNumberTest测试用例,编译它们看看会发生什么。我们注意到的第一件事是有一些编译错误。测试使用了操作符==,但是它并没有被定义。修改如下:
bool ōperator==( const Complex & a, const Complex & b )
{
return true;
}
现在再次编译并运行之。这次编译通过了,但是没有通过测试。我们需要再写些代码使操作符==可以正确工作,所以我们再次修改代码:
class Complex {
friend bool ōperator ==(const Complex& a, const Complex& b);
double real, imaginary;
public:
Complex( double r, double i = 0 )
: real(r)
, imaginary(i)
{
}
};
bool ōperator ==( const Complex &a, const Complex &b )
{
return eq( a.real, b.real ) && eq( a.imaginary, b.imaginary );
}
如果我们现在编译并运行,可以顺利通过测试。