現(xiàn)在我們準備添加一些新的操作符和新的測試用例。這時使用一個fixture會很方便。如果我們實例化3到4個復數(shù)并在測試中反復使用它們,可能我們的測試會更好些。
我們這樣做:
* 為fixture的每個部分添加成員變量。
* Override setUp() 初始化這些變量。
* Override tearDown()釋放你在setUp()中使用的資源。
class ComplexNumberTest : public CppUnit::TestFixture {
private:
Complex *m_10_1, *m_1_1, *m_11_2;
protected:
void setUp()
{
m_10_1 = new Complex( 10, 1 );
m_1_1 = new Complex( 1, 1 );
m_11_2 = new Complex( 11, 2 );
}
void tearDown()
{
delete m_10_1;
delete m_1_1;
delete m_11_2;
}
};
一旦我們擁有了這個fixture,我們可以添加操作符+,以及整個開發(fā)過程中其他的任何操作符。
Test Case
為了使用一個fixture來調(diào)用單獨的測試,該如何做呢?
分為兩個步驟:
*以一個method的形式,在fixture類中寫一個測試用例
*創(chuàng)建TestCaller來運行那個method
這里是我們加了一些額外的用例method書寫的測試類:
private:
Complex *m_10_1, *m_1_1, *m_11_2;
protected:
void setUp()
{
m_10_1 = new Complex( 10, 1 );
m_1_1 = new Complex( 1, 1 );
m_11_2 = new Complex( 11, 2 );
}
void tearDown()
{
delete m_10_1;
delete m_1_1;
delete m_11_2;
}
void testEquality()
{
CPPUNIT_ASSERT( *m_10_1 == *m_10_1 );
CPPUNIT_ASSERT( !(*m_10_1 == *m_11_2) );
}
void testAddition()
{
CPPUNIT_ASSERT( *m_10_1 + *m_1_1 == *m_11_2 );
}
};
我們可以象下面這樣為每個測試用例創(chuàng)建并運行一個實例:
CppUnit::TestCaller<ComplexNumberTest> test( "testEquality",
&ComplexNumberTest::testEquality );
CppUnit::TestResult result;
test.run( &result );
TestCaller的構造函數(shù)的第二個參數(shù)是ComplexNumberTest中對應method的地址。當這個TestCaller運行的時候,指定的method會運行。但是,這個辦法也效果不彰,因為它不顯示診斷信息。我們可以使用TestRunner(下面會講到)來顯示這個診斷信息。
一旦我們有了幾個測試用例,可以把它們歸入一個suite中。