本文是一篇簡單的入門指導(dǎo),幫助你快速上手。
簡單測試用例(Simple Test Case)
你希望知道你的代碼是否正在工作。
你該怎么辦?
有很多種方法。使用調(diào)試器直接調(diào)試或者在你的代碼里亂丟一些流輸出指令是兩種簡單的方法,但是它們都有自己的缺點(diǎn)。直接調(diào)試代碼是個(gè)好主意,但是它不是自動(dòng)進(jìn)行的。你不得不在每次改動(dòng)代碼以后重新調(diào)試。輸出流文本也不錯(cuò),但是它使代碼變得面目可憎,并且大多數(shù)情況下,它輸出的信息比你想要的要多。
在CppUnit中測試可以自動(dòng)進(jìn)行。這些測試可以很容易被建立,并且一旦你書寫完畢,他們可以幫助你時(shí)刻了解你代碼的質(zhì)量。
為了做一個(gè)簡單的測試,下面這些是你要做的:
從TestClass中派生一個(gè)類。Override runTest()方法。當(dāng)你希望檢查一個(gè)值的時(shí)候,調(diào)用 CPPUNIT_ASSERT(bool),如果測試成功這個(gè)assert表達(dá)式可以被順利通過。
比如,為了測試一個(gè)復(fù)數(shù)類的等值比較,書寫如下:
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)) );
}
};
這是一個(gè)簡單的測試。通常來說,你會(huì)有很多小的測試用例,并且希望能在同一個(gè)對象集合中測試。為了達(dá)到這個(gè)目的,使用fixture。
Fixture
一個(gè)fixture是一組對象,被用來作為測試一組用例的基礎(chǔ)。當(dāng)你邊開發(fā)邊測試的時(shí)候,使用fixture會(huì)非常方便。
那我們嘗試一下這種開發(fā)方式,同時(shí)學(xué)習(xí)一下fixture的使用方法。假定我們是想開發(fā)一個(gè)復(fù)數(shù)的類,我們從定義一個(gè)名為Complex的空類開始。
class Complex{};
現(xiàn)在建立上面那個(gè)ComplexNumberTest測試用例,編譯它們看看會(huì)發(fā)生什么。我們注意到的第一件事是有一些編譯錯(cuò)誤。測試使用了操作符==,但是它并沒有被定義。修改如下:
bool ōperator==( const Complex & a, const Complex & b )
{
return true;
}
現(xiàn)在再次編譯并運(yùn)行之。這次編譯通過了,但是沒有通過測試。我們需要再寫些代碼使操作符==可以正確工作,所以我們再次修改代碼:
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 );
}
如果我們現(xiàn)在編譯并運(yùn)行,可以順利通過測試。