2010-08-17 95 views
5

多年來,我幾次使用自分流單元測試模式。正如我最近向某人解釋的那樣,他們認爲它違反了SRP。現在的理由是,測試類現在可以由於以下兩個原因而改變:測試更改時,或者測試正在實現的界面上的方法簽名更改。經過一段時間的思考後,似乎這是一個正確的評估,但我希望得到其他人的意見。思考?自並流測試模式是否違反單一責任原則?

參考: http://www.objectmentor.com/resources/articles/SelfShunPtrn.pdf

回答

5

我認爲測試類在技術上違反了SRP,但它並沒有違反SRP的精神。自我分流的替代方法是將模擬課程與測試課程分開。

對於單獨的模擬類,您可能會認爲它是全部自包含的並且滿足SRP,但是與模擬類屬性的語義耦合仍然存在。所以,真的,我們沒有達成任何有意義的分離。

以例子出來的PDF:

public class ScannerTest extends TestCase implements Display 
{ 
    public ScannerTest (String name) { 
    super (name); 
    } 
    public void testScan() { 
    // pass self as a display 
    Scanner scanner = new Scanner (this); 
    // scan calls displayItem on its display 
    scanner.scan(); 
    assertEquals (new Item (「Cornflakes」), lastItem); 
    } 
    // impl. of Display.displayItem() 
    void displayItem (Item item) { 
    lastItem = item; 
    } 
    private Item lastItem; 
} 

現在我們做一個模擬:

public class DisplayMock implements Display 
{ 
    // impl. of Display.displayItem() 
    void displayItem (Item item) { 
    lastItem = item; 
    } 

    public Item getItem() { 
    return lastItem; 
    } 
    private Item lastItem; 
} 

public class ScannerTest extends TestCase 
{ 
    public ScannerTest (String name) { 
    super (name); 
    } 
    public void testScan() { 
    // pass self as a display 
    DisplayMock dispMock = new DisplayMock(); 
    Scanner scanner = new Scanner (dispMock); 
    // scan calls displayItem on its display 
    scanner.scan(); 
    assertEquals (new Item (「Cornflakes」), dispMock.GetItem()); 
    } 
} 

在實際應用中(恕我直言)的TestClassDisplayMock更高的耦合比大惡違反SRP爲TestClass。此外,使用嘲諷框架,這個問題完全消失。

編輯我剛剛在羅伯特C.馬丁的優秀書Agile Principles, Patterns, and Practices in C#中遇到了簡要提及的自分流模式。下面是摘錄出書:

alt text

所以,(這是談到了非常詳細的在同一本書)誰杜撰了SRP的傢伙使用自分流模式沒有任何疑慮。鑑於此,我認爲在使用這種模式時,您從OOP(受到注視的警察)身上很安全。

1

如果正在實施或分流接口發生變化,這是比較可能的測試套件將不得不改變。所以我不認爲這是對SRP的違反。

+0

這絕對是一個好點,但它是一個謬誤的論點。僅僅因爲它可能會改變測試並不意味着使用這種模式不會導致測試類違反SRP。這就是說,從實際角度來看,我並不反對使用這種模式,也許會違反SRP。 – 2010-08-17 03:13:22

1

我更喜歡對我創建的模擬/存根控制一點點。當我嘗試使用自分流模式時,最終導致我的測試類更加複雜。通過在測試方法中創建當地人的模擬,我最終得到了更簡潔的代碼。除非你使用像C#(或python或其他)的功能強大的東西,否則當你改變界面時你的測試代碼將會改變。

3

在我看來,它違規,但一個非常小的。

您測試的類現在是一個測試類您正在測試的任何依賴項。

但是,這是一件壞事嗎?對於幾個簡單的測試,可能不是。隨着測試用例數量的增長,您可能需要重構並使用模擬類來分離一些問題。 (正如你粘貼的鏈接所說,自我分流是嘲弄的墊腳石)。但是如果測試案例的數量保持不變,那麼問題是什麼?

我認爲需要一點實用主義。它違反了SRP嗎?是的,但我猜測可能不像你正在測試的系統中的一些代碼。你需要做些什麼嗎?不,只要代碼清晰可維護,這對我來說始終是最重要的。 SRP是一個準則,而不是一個規則。

+0

那麼說。正如我在另一個評論中所暗示的,我並不反對使用它,但我只是想驗證它是否「技術上」違反了SRP。 – 2010-08-17 14:45:27

相關問題