2010-02-18 68 views
3

假設我有一個測試類(在我的情況下VSUnit [TestClass])中的幾個單元測試。我試圖在每個測試中測試一件事(儘管如此,並不意味着只有一個聲明)。想象一下,有一個測試(例如Test_MethodA())可以測試其他測試中使用的方法。我不想在其他使用它的測試中斷言這種方法來避免重複/可維護性問題,所以我只在這一個測試中聲明。現在,當此測試失敗時,依賴於該測試方法的正確執行的所有測試都會失敗。我希望能夠更快地找到問題,所以我想以某種方式指向Test_MethodA。它會例如如果我可以讓測試類中的某些測試按特定順序執行,並且在失敗時我會開始尋找第一次失敗測試中失敗的原因。你有什麼想法如何做到這一點?組織單元測試在一個測試類

編輯:通過建議解決方案將按特定順序執行測試,我可能走得太遠,並在錯誤的方向。我不關心測試的順序。只是如果一個先決條件無效,那麼一些測試總會失敗。例如。我有一個測試DAO類的測試類(好吧,可能不是UNIT測試,但數據庫存儲過程中有邏輯需要測試,但這不是我認爲的重點)。爲了測試負責檢索記錄的方法(我們稱之爲GetAll()),我需要在表中插入一些記錄,以正確的順序獲取它們,例如我通過使用DAO類中的方法來執行插入操作。我們稱之爲Insert()。我有驗證Insert()方法按預期工作的測試。現在我想測試GetAll()方法。爲了使數據庫處於期望的狀態,我使用Insert()方法。如果Insert()不起作用,則大多數對GetAll()的測試都會失敗。我傾向於標記無法通過的測試,因爲Insert()不起作用,而不是失敗。如果我知道首先要查找哪種方法/測試,它會輕鬆找到問題的原因。

回答

1

我想我確實會對method_A()結果在每個測試依託其結果斷言,即使這會產生一些重複。然後我會使用斷言消息指向method_A()失敗

assert("method_A() returned true", true, rc); 

也許我會在最後提取method_A()調用斷言爲輔助函數刪除重複。

現在讓我們設想一下method_A()查詢一個對象並返回它,或者當沒有找到對象時返回NULL。那麼這個斷言是一個guard;並且對於沒有NullPointerException的語言如C,C++是必要的。

0

恐怕你不能這樣做。唯一的解決方案是重新設計你的代碼並將其分解成更小的方法,以便單元測試可以逐個調用它們。當然這並不總是可取的。

使用Visual Studio,您可以訂購您的測試:see here。但我想建議您儘可能遠離這種技術:單元測試旨在隨時隨地按任何順序運行。

編輯:爲什麼這是你的問題?無論如何,所有失敗的測試都指向相同的方法...

3

您不能(也不應該)以特定順序執行單元測試。造成這種情況的根本原因是爲了防止Interacting Tests - 我意識到你請求這種功能的動機是不同的,但這就是單元測試框架不允許你訂購測試的原因。實際上,我上次查看的時候,xUnit.net甚至隨機化了這個命令。

有人可能會爭辯說,一些測試依賴於同一類上的不同方法調用的事實是嚴密耦合的症狀,但情況並非總是如此(狀態機可以想到)。

但是,如果可能,請考慮使用Back Door而不是其他方法。

如果你不能做到這一點或解耦相互依賴性(例如通過使第一個方法是虛擬的並使用提取和覆蓋技術),您將不得不忍受它。

下面是一個例子:

public class MyClass 
{ 
    public virtual void FirstMethod() { // do something... } 

    public void SecondMethod() {} 
} 

由於FirstMethod是虛擬的,你可以從MyClass的派生並覆蓋其行爲。您還可以使用動態模擬爲您做到這一點。隨着起訂量,它應該是這樣的:

var sutStub = new Mock<MyClass>(); 
// by default, Moq overrides all virtual methods without calling base 

// Now invoke both methods in sequence: 
sutStub.Object.FirstMethod(); // overriden by Moq, so it does nothing 
sutSutb.Object.SecondMethod(); 
+0

感謝鏈接到Gerard Meszaros的網站... – trendl 2010-02-18 10:29:35