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