2009-10-30 87 views
7

我有一個單元測試,測試如果異常是擲,但這種例外僅在調試模式下拋出(通過[條件(「調試」)]屬性)。如果我在發佈模式下運行此測試,它將失敗。我試圖在測試中應用相同的屬性,但沒有考慮到它。如何才能使單元測試僅在DEBUG模式下運行?

我怎樣才能排除在Release模式測試?在Release模式下運行單元測試還是應該堅持調試模式?

+0

相關:HTTP: //stackoverflow.com/questions/3133988/make-mstest-respect-conditional-attribute – 2016-05-03 14:32:54

回答

10

至於大部分的問題,它有點取決於什麼單元測試工具使用的上。但是,一般來說你要什麼都preprocessor directives

//C# 
#ifndef DEBUG 
    //Unit test 
#endif 

也許您的具體情況

//C# - for NUnit 
#if !DEBUG 
    [Ignore("This test runs only in debug")] 
#endif 

但至於是否要離開的單元測試的發行版?我會給出一個響亮的NO。我建議將所有的單元測試移到它自己的項目中,並且不要在你的發佈中包含這個。

+0

當然,我所有的單元測試是在另一個項目,但我仍然可以運行他們在Release模式...... – 2009-10-30 11:51:32

+0

爲什麼你真的希望他們在發佈和調試不同? – 2009-10-30 12:36:02

+0

我想確保我的代碼在調試和發佈模式下的行爲相同。但是,在這種特殊情況下,我知道* *,該測試將在Release模式失敗,因爲異常只應在調試模式(設計)拋出 – 2009-10-30 13:23:02

5

試試這個:

#if DEBUG 

// here is your test 

#endif 
+0

這工作,但我認爲這是一個過於激烈的解決方案。相反,我使用[Ignore]屬性(仍然包含在#if!DEBUG ... #endif中,但我更喜歡它)。 – 2009-10-30 15:12:45

3

如果你使用NUnit,你可以讓你的單元測試方法條件:

[System.Diagnostics.Conditional("DEBUG")] 
public void UnitTestMethod() 
{ 
    // Tests here 
} 

這樣只會在DEBUG執行的基礎之上。我沒有很多有關Visual Studio單元測試的經驗,但我很確定這也適用於VS。

編輯:其他人提到了條件編譯指令。我認爲這不是一個好主意,原因有很多。要詳細瞭解條件編譯指令和條件屬性之間的區別,請閱讀Eric Lippert's excellent article here

+2

我使用MSTest的,它看起來像條件​​屬性不被測試引擎榮幸... – 2009-10-30 12:01:19

+0

你可以把條件屬性上DoUnitTestMethod helper方法,你會從UnitTestMethod調用。然後這將成爲一個總是通過發佈模式進入的空測試。儘管如此,獲取像ExpectedException這樣的事情會更棘手。最簡單的就是在整個測試用例中使用#if DEBUG。 – yoyo 2014-07-08 23:44:45

0

如果您使用的xUnit,您可以通過擴展屬性其實用下面的方法as described by Jimmy Bogard

public class RunnableInDebugOnlyAttribute : FactAttribute 
{ 
    public RunnableInDebugOnlyAttribute() 
    { 
     if (!Debugger.IsAttached) 
     { 
      Skip = "Only running in interactive mode."; 
     } 
    } 
} 

,然後你可以使用這個如下:

[RunnableInDebugOnly] 
public void Test_RunOnlyWhenDebugging() 
{ 
    //your test code 
} 
相關問題