C# 微软单元测试。是否可以从测试方法主体中跳过测试?

C# 微软单元测试。是否可以从测试方法主体中跳过测试?,c#,unit-testing,mstest,C#,Unit Testing,Mstest,所以,当我需要从测试方法体中跳过当前测试时,我会遇到这种情况。 最简单的方法是在测试方法中编写类似的内容 if (something) return; 但我有很多复杂的测试,我需要一种从我在当前测试方法体中调用的方法中跳过测试的方法。 可能吗?您不应该以这种方式跳过测试。最好做以下事情之一: 通过[Ignore]属性将测试标记为已忽略 从测试中抛出NotImplementedException 写入Assert.Fail()(否则您可能会忘记完成此测试) 删除此测试 还要记住,您的测试不应

所以,当我需要从测试方法体中跳过当前测试时,我会遇到这种情况。 最简单的方法是在测试方法中编写类似的内容

if (something) return;
但我有很多复杂的测试,我需要一种从我在当前测试方法体中调用的方法中跳过测试的方法。
可能吗?

您不应该以这种方式跳过测试。最好做以下事情之一:

  • 通过
    [Ignore]
    属性将测试标记为已忽略
  • 从测试中抛出
    NotImplementedException
  • 写入
    Assert.Fail()
    (否则您可能会忘记完成此测试)
  • 删除此测试
还要记住,您的测试不应该包含条件逻辑。相反,您应该创建两个测试—为每个代码路径创建单独的测试(使用名称,它描述您正在测试的条件)。因此,与其写:

[TestMethod]
public void TestFooBar()
{
   // Assert foo
   if (!bar)
      return;
   // Assert bar
}
编写两个测试:

[TestMethod]
public void TestFoo()
{
   // set bar == false
   // Assert foo
}

[Ignore] // you can ignore this test
[TestMethod]
public void TestBar()
{
   // set bar == true
   // Assert bar
}

您可以忽略一个测试,并在代码中保持它完全不变

[TestMethod()]
[Ignore()]    //ignores the test below
public void SomeTestCodeTest()
{
   //test code here

}

对于其他答案(以及建议的):我建议使用
Assert.Inconclusive
而不是
Assert.Fail
,因为原始海报的情况不是明确的失败案例


因此,使用
非决定性的
可以清楚地表明,您不知道测试是成功还是失败,这是一个重要的区别。不证明成功并不总是失败

有一个
Assert.Inconclusive()
方法,您可以使用它很好地跳过当前测试。检查一下。基本上,它将抛出一个异常,并将此方法显示为跳过的

我将其用作测试方法中代码的编程检查:

if (!IsEnvironmentConfigured())
{
   Assert.Inconclusive("Some message");
}
结果如下:

! ShouldTestThisMethod [31ms]

Test Run Successful.
Total tests: 92
     Passed: 91
    Skipped: 1
 Total time: 1.2518 Seconds

我完全本能的反应是问为什么您可以始终执行
Assert.Pass()
Assert.Fail()。但除此之外。。。测试将在那里运行。=)为什么不参加考试?您是否应该返回Assert.Fail()或Assert.Inconclusive()?我建议
Assert.Inconclusive
而不是
Assert.Fail
,因为这不是一个明确的失败案例
Inconclusive
更清楚地表明,您不知道测试是成功还是失败。
Assert.Inconclusive
是我要找的东西。谢谢。我想他的意思是从测试内部以编程方式决定这一点,类似于NUnit的假设。为了简洁起见:[TestMethod,Ignore]许多年后,MSTest->TFS最终将Assert.Inconclusive识别为“其他”,而不是“失败”。查看详细信息,了解这对您是否和对我一样重要:-)……非常好的选择,我一直在寻找这个,无论如何谢谢Sergey..投了赞成票。