Fixture

fixture是撰寫許多測試test cases的地方。 用fixtures會很得心應手為開發好的程式而測試。

讓我們來試試這種開發風格,並且學習用fixture。 假設我們真的正在開發Complex類別。 一起從定義一個空的類別,命名Complex為起點吧。

//Complex.h
class Complex {};

現在以(上述的)ComplexNumberTest的程式碼當例子,建立一個並且編譯它,來看看會發生什麼。第一件事,我們注意到一些編譯錯誤。 測試程式使用了==運算子,而我們並沒有定義。我們來修正這個錯誤。

//Complex.h
bool operator==( const Complex &a, const Complex &b) 
{ 
    return true; 
}

現在編譯測試程式,並執行。 這次它通過了編譯,但是沒有通過測試。 我們需要加把勁讓==運算子的行為正確,所以再改一下程式碼。

//Complex.h
class Complex
{ 
    friend bool operator ==(const Complex& a, const Complex& b);
    double real, imaginary;
public:
    Complex( double r, double i = 0 ) 
        : real(r), imaginary(i) 
    {
    }
};

bool operator ==( const Complex &a, const Complex &b )
{ 
    return eq( a.real, b.real )  &&  eq( a.imaginary, b.imaginary ); 
}

如果我們現在編譯並執行,就會通過測試了。

接下來,我們準備加上新的運算式和測試。 而且會突顯fixture好用的地方。 如果可以在每一個測試程式執行前,都實體化三到四個complex物件,而且可以重覆使用的話會那就太好了。

下列介紹一下,如何實現這件事:

  • 在每一個fixture增加成員變數

  • Override setUp()來初始化這些變數

  • Override tearDown()來釋放你在setUp()動態宣告的記憶體空間

//Complex.h
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,我們可以在後續的開發過程中,加上complex其它的test cases

關鍵字翻譯

  • fixture 治具

譯註

  • 治具 工廠內為協助製作、測試產品所產生的特殊工具,都稱之為治具。(非正規定義)

  • need a bit more to get 這句不會翻耶,只求句子通順翻成「需要加把勁」

Last updated