2013-01-08 65 views
3

VS UnitTest項目中聲明的標準行爲是告訴我某個測試在特定行上失敗。HowTo打破UnitTesting.Assert.AreEqual?

然而,有時候這樣會很方便,如果在這種斷言失敗時我可以中斷。因爲只是在該行上設置斷點也會導致不失敗的測試用例。如果我能斷言斷言失敗,我可以立即看到哪個測試用例失敗。

當斷言失敗時,我該如何暫時告訴VS打破?

E.g.我在下面的方式循環很多在我的單元測試,想知道哪個迭代失敗:

foreach(var testcase in testcases) 
{ 
    Assert.AreEqual(testcase.ExpectedOutputData, FuncionUnderTest(testcase.InputData)); 
} 
+0

也許nUnit的測試用例是你想要的?它們允許您逐個調試。 –

+1

我通常在調試模式下啓動所有測試,當我使用VS.如果有的話,調試器會中斷任何異常。這要求你不要設置任何斷點。這不是一個真正的解決方案,因此只是一個想法。 –

回答

5

只需使用一個條件斷點,並給它斷言的檢查的邏輯負。就個人而言,我認爲斷點現在已經被嚴重濫用,只不過是一個'在這一點上休息'的工具 - 它們是非常通用的,並且可以很容易地用來代替Console.WriteLine來顯示調試輸出,而不用實際修改代碼,因爲以及只有當斷言失敗時纔會破壞。

但是,如果以這種方式過度使用,它們往往會導致性能下降,但這很少是運行單元測試的問題。

+0

+1只是尋找示例代碼去與這樣的答案,擊敗了我; 編輯這個在您的答案可能會幫助 System.Diagnostics.Debugger.Break(); – RhysW

+2

這可能只是一個偏好問題(或者我錯過了一些非常有用的東西),但我從來沒有使用過。我一直覺得整個斷點是你不需要爲了調試而修改你的實際源代碼。 – Flynn1179

+0

大多數時候,當你想總是在那裏停留時,通常會把它們放在邊緣上,但有時如果它迭代1000次,你不想按f5 999次來獲得第1000個,那麼當一個程序斷點可以幫助加速你的發展,無論如何我的經驗 – RhysW

2

如果您使用NUnit,你可以有這樣的,它允許你單獨調試:

[TestCase(0)] 
[TestCase(1)] 
public void NunitTestCases(int expected) 
{ 
    Assert.AreEqual(expected,0); 
} 

我猜你總是可以做到這一點,雖然:

[Test] 
public void BreakTest() 
{ 
    for (int i = 0; i < 2; i++) 
    { 
     bool condition = i == 0; 
     if(!condition) 
      Debugger.Break(); 
     Assert.IsTrue(condition); 
    } 
} 
4

不具有怎樣你太多的知識我正在構建你的單元測試,在我看來,如果你正在努力查看哪個斷言導致你的單元測試失敗,那麼也許你在單個測試中測試的太多了?單元測試應儘可能原子化,否定這個問題。如果您可以打破測試,甚至可以在單個測試中進行單一斷言,那麼確定哪項測試失敗會更容易。我肯定會主張在你的單元測試中寫斷點特定的代碼。