【发布时间】:2009-10-30 11:22:24
【问题描述】:
我有一个单元测试来测试是否抛出异常,但是这个异常只在调试模式下抛出(通过 [Conditional("DEBUG")] 属性)。如果我在发布模式下运行此测试,它会失败。我尝试在测试中应用相同的属性,但没有考虑在内。
如何在发布模式下排除测试?在发布模式下运行单元测试是否有意义,还是应该坚持调试模式?
【问题讨论】:
标签: .net unit-testing debugging
我有一个单元测试来测试是否抛出异常,但是这个异常只在调试模式下抛出(通过 [Conditional("DEBUG")] 属性)。如果我在发布模式下运行此测试,它会失败。我尝试在测试中应用相同的属性,但没有考虑在内。
如何在发布模式下排除测试?在发布模式下运行单元测试是否有意义,还是应该坚持调试模式?
【问题讨论】:
标签: .net unit-testing debugging
至于您的大部分问题,这在一定程度上取决于您使用的单元测试工具。但是,一般来说你想要的是preprocessor directives
//C#
#ifndef DEBUG
//Unit test
#endif
也许适合你的情况
//C# - for NUnit
#if !DEBUG
[Ignore("This test runs only in debug")]
#endif
但至于是否在发布版本中留下单元测试?我会给出一个响亮的NO。我建议将你所有的单元测试移到它自己的项目中,而不是在你的版本中包含它。
【讨论】:
试试这个:
#if DEBUG
// here is your test
#endif
【讨论】:
如果你使用 NUnit,你可以让你的单元测试方法有条件:
[System.Diagnostics.Conditional("DEBUG")]
public void UnitTestMethod()
{
// Tests here
}
这样它只会在 DEBUG 构建中执行。我在 Visual Studio 单元测试方面没有太多经验,但我很确定这也应该在 VS 中工作。
编辑:其他人提到了条件编译指令。出于多种原因,我认为这不是一个好主意。要详细了解条件编译指令和条件属性之间的区别,请阅读Eric Lippert's excellent article here。
【讨论】:
如果你使用的是 XUnit,你可以通过扩展 fact 属性来使用下面的方法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
}
【讨论】:
NUnit 框架的类似解决方案(仅调试测试有效):
public class DebugOnlyAttribute : NUnitAttribute, IApplyToTest
{
private const string _reason = "Debug only";
public void ApplyToTest(Test test)
{
if (!Debugger.IsAttached)
{
test.RunState = RunState.Ignored;
test.Properties.Set(PropertyNames.SkipReason, _reason);
}
}
}
[DebugOnly]
[Test]
public void TestMethod()
{
//your test code
}
【讨论】: