我有一个单元测试,用于测试是否抛出异常,但是此异常仅在调试模式下抛出(通过[条件(“DEBUG”)]属性)。如果我在发布模式下运行此测试,则会失败。我尝试在测试中应用相同的属性,但没有考虑到它。
如何在发布模式下排除测试?在Release模式下运行单元测试甚至是否应该坚持调试模式是否有意义?
答案 0 :(得分:13)
至于你的大多数问题,它在某种程度上取决于你使用的单元测试工具。但是,一般来说,你想要的是preprocessor directives
//C#
#ifndef DEBUG
//Unit test
#endif
也许适合你的情况
//C# - for NUnit
#if !DEBUG
[Ignore("This test runs only in debug")]
#endif
但是关于是否在发布版本中保留单元测试?我会给出一个响亮的NO。我建议将所有单元测试移到它自己的项目中,而不是在你的发行版中包含它。
答案 1 :(得分:6)
试试这个:
#if DEBUG
// here is your test
#endif
答案 2 :(得分:5)
如果您正在使用NUnit,则可以使您的单元测试方法成为条件:
[System.Diagnostics.Conditional("DEBUG")]
public void UnitTestMethod()
{
// Tests here
}
这样它只会在DEBUG版本中执行。我没有很多Visual Studio单元测试的经验,但我很确定这也适用于VS.
编辑:其他人提到了条件编译指令。出于多种原因,我认为这不是一个好主意。要了解有关条件编译指令与条件属性之间差异的更多信息,请阅读Eric Lippert's excellent article here。
答案 3 :(得分:1)
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
}
答案 4 :(得分:0)
如果您正在使用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
}