忽略(跳过)NUnit 测试用例而不抛出异常

Ignoring (skipping) an NUnit test case without throwing an exception

我有要求 运行 在一个月中的某些时间进行测试用例,我想忽略或跳过相关测试适用的。到目前为止,我发现唯一有意义的属性是 Assert.Ignore();。不幸的是,触发此方法会引发 IgnoreException ,因此不会触发 NUnit TearDown。这并不理想,因为我有我想在每个测试用例 测试结果无关 之后执行的代码。 我的假设不正确,请在下面找到评论...

在理想情况下,我希望我可以在我忽略/跳过的代码部分中设置测试结果,例如:

else
{
    //it's after the 25th of the month let's skip this test case
    TestContext.CurrentContext.Result.Outcome == ResultState.Ignored;
}

但我知道 TestContext.CurrentContext.Result.Outcome 只是一个 Get 是有充分理由的,它很可能只是打开一堆蠕虫,人们只是将他们的测试设置为通过,而他们不应该等。 .

[Test]
[TestCase(TestName = "Test A")]
[Description("Test A will be testing something.")]
[Category("Regression Test Pack")]
public void Test_Case_1()
{
    sessionVariables = new Session().SetupSession(uiTestCase: true);

    if (DateTime.Now.Day <= 25)
    {
        //let's test something!
    }
    else
    {
        //it's after the 25th of the month let's skip this test case
        Assert.Ignore();
    }
}

[TearDown]
public void Cleanup()
{
    sessionVariables.TeardownLogic(sessionVariables);
}

您可以 return 而不是进行断言。

public void Test_Case_1()
{
    sessionVariables = new Session().SetupSession(uiTestCase: true);

    if (DateTime.Now.Day <= 25)
    {
        //let's test something!
    }
    else
    {
        //it's after the 25th of the month let's skip this test case
        return;
    }
}

如您所见,使用 Assert.Ignore 不会导致跳过拆解。 (如果是这样,那将是一个 NUnit 错误,因为如果设置是 运行,则拆卸必须始终是 运行)

因此,您选择如何结束测试取决于您希望如何显示结果...

  • 简单的返回会导致测试通过,没有任何特殊消息。

  • Assert.Pass 做同样的事情,但允许您包含一条消息。

  • Assert.Ignore 发出“已忽略”警告并允许您指定原因。传播警告,以便 运行 作为一个整体的结果也是“警告”。

  • Assert.Inconclusive 给出了一个“不确定”的结果,这意味着由于某些外部因素,测试不能 运行。您也可以指定具体原因,总体运行结果不受影响。

  • 作为 Assert.Inconclusive 的替代方法,您可以使用 Assume.That 进行适当的测试。例如,以下代码将在当月 25 日之后触发“不确定”结果:

    Assume.That(DateTime.Now.Day <= 25);

就其价值而言,“不确定”结果正是针对这种情况而设计的。这意味着测试无法 运行 由于无法控制的原因。 “忽略”结果旨在被视为最终由团队解决的问题,尽管许多人使用它的方式不同。

从 NUnit 的设计观点来看,Assume.That 是产生结果的最自然的方式。您通常会将它放在测试或 SetUp 方法的开头,在任何其他代码之前。