2014-01-16 25 views
1

在C++類中設計函數時,我經常會考慮測試。因此,當我完成一個類的所有功能主義者時,經常會在課堂上添加幾個僅用於測試目的的功能。看看下面的例子:C++類中冗餘測試函數的影響

class SimpleClass 
{ 
public: 
    int a; 
    int b; 
    void fun1(); 
    void fun2(); 
    void testIntermediateResult(); 
private: 
    void _fun1(); 
    void _fun2(); 

}; 

在此功能只需要測試目的testIntermediateResult。它是一個很好的做法只是離開該函數的類裏面,或者我應該做這樣的事情:

class SimpleClass 
    { 
    public: 
     int a; 
     int b; 
     void fun1(); 
     void fun2(); 
#ifdef TESTING 
     void testIntermediateResult(); 
#endif 
    private: 
     void _fun1(); 
     void _fun2(); 

    }; 

這裏的理念是,當這個類已經完成測試,將給予客戶端,然後測試將被定義而這個函數不會在類中。因此,我的問題是:當課堂授予客戶端時,真的需要移除測試功能嗎?假設客戶端不會使用測試功能,那麼在類中添加多個冗餘測試功能會有什麼效果?謝謝。

+0

我會稱之爲「測試」。 '#ifndef TESTING'聽起來像「如果我們沒有測試它」,這與你所描述的相反...... – starsplusplus

+3

設計不要做太多的課程是更好的做法,不得不在他們內部放置任意的測試功能。 – juanchopanza

+1

如果您喜歡未定義的行爲,這是很好的做法。如果你用'TESTING'定義了一個源,而另一個沒有定義,你就有未定義的行爲。 (當然,它可能會工作,但是你永遠不知道;如果我編寫一個編譯器,它不會編譯。) –

回答

3

我假設你的客戶端不會參與測試你正在交付的類。我不想將測試函數直接添加到類中,因爲它們可能會破壞類的行爲。至於客戶端,我寧願不給他們帶有測試功能的東西,因爲:

  • 沒有必要 - 測試它不是他們的工作。
  • 他們可以決定嘗試使用它 - 誰知道會發生什麼呢?

如果他們沒有看到它就更簡單了。至於使用預處理器,這可能充滿了問題,特別是如果您的屬性需要以相同的方式進行保護。如果他們中的任何一個被遺漏或者您的宏在客戶端的構建過程中被重新定義,那麼您可能因爲類的大小不匹配等原因而導致運行時崩潰等。

我希望擁有一對一的外部類測試你的可交付類。類似於執行測試的TestSimpleClass。這種方法有許多優點:

  1. 它是完全獨立於您的代碼,並沒有內置到它,所以你不是膨脹的代碼或導致任何潛在的問題。
  2. 它將以您的客戶所看到的方式測試您的班級接口(即黑盒測試)
  3. 因爲它是分開的,您不必將其交給客戶端 - 他們永遠不需要知道它。

如果你真的想測試這個類的內部,你總是可以讓你的測試類成爲你的可交付類的一個朋友。在可交付類中只有一行額外的內容,您仍然不需要運送測試類或庫。