忽略跳过NUnit测试用例而不会引发异常

问题描述

我需要在该月的某些时间运行一个测试用例,我想在适用时忽略或跳过相关的测试。到目前为止,我发现唯一有意义的属性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);
}

解决方法

如您所发现的,使用Assert.Ignore不会导致删除操作被跳过。 (如果确实如此,那将是一个NUnit错误,因为如果已运行安装程序,则必须始终运行拆卸程序)

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

  • 仅返回即可导致测试通过,而没有任何特殊消息。

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

  • Assert.Ignore发出“忽略”警告,并允许您指定原因。警告会传播,因此整个运行的结果也是“警告”。

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

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

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

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

从NUnit的设计角度来看,Assume.That是产生结果的最自然的方法。通常,您可以将其放置在测试的开头或SetUp方法的前面,然后放置在任何其他代码之前。

,

您可以只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;
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...