2009-10-30 29 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 
} 
相关问题