Nunit 忽略基于条件的测试或测试夹具

Nunit 忽略基于条件的测试或测试夹具,nunit,Nunit,我们的解决方案中有一些集成测试。要运行这些测试,必须在开发人员PC上安装仿真软件。但是,并非每个开发人员PC上都安装此软件。如果未安装仿真软件,则应跳过这些测试,否则==>NullRefException 我现在正在寻找一种对测试/测试装置执行“条件忽略”的方法。 差不多 if(simulationFilesExist) do testfixture else skip testfixture NUnit提供了一些有用的东西,如忽略和显式,但这不是我所需要的。在测试或夹具设置方法中使用一些代

我们的解决方案中有一些集成测试。要运行这些测试,必须在开发人员PC上安装仿真软件。但是,并非每个开发人员PC上都安装此软件。如果未安装仿真软件,则应跳过这些测试,否则==>NullRefException

我现在正在寻找一种对测试/测试装置执行“条件忽略”的方法。 差不多

if(simulationFilesExist) 
do testfixture
else skip testfixture

NUnit提供了一些有用的东西,如忽略和显式,但这不是我所需要的。

在测试或夹具设置方法中使用一些代码,检测是否安装了模拟软件,如果没有,则调用

[设置]
公共void TestSetUp()
{
如果(!TestHelper.SimulationFilesExist())
{
Assert.Ignore(“未安装模拟文件。忽略”);
}
}

[TestFixtureSetUp]
public void FixtureSetUp()
{
如果(!TestHelper.SimulationFilesExist())
{
Assert.Ignore(“未安装模拟文件。忽略夹具”);
}
}

在和更高版本中,您必须使用
OneTimeSetUp
属性,而不是
TestFixtureSetUp

NUnit还提供了提供类别属性的选项。根据您启动测试的方式,可能适合将所有需要模拟器的测试标记为已知类别(例如[category(“RequireSimulationSoftware”)])。然后,您可以从NUnit Gui中选择排除某些类别。您可以从NUnit命令行运行程序执行相同的操作(指定/排除:requireSimulationSoftware,如果适用)

希望这(或tvanfosson之前的回答)能有所帮助


您可以在
TestFixtureSet属性中使用这种类型的条件。但是,如果这个装置有参数化测试,那么如果您想忽略这个装置的参数化测试,那么这将进入无限循环,您的测试将被挂起。因此,对于if条件,您可以更好地使用setup属性。

我不想重复
断言。在每个测试用例中忽略
条件,因此我最终使用了一个自定义
属性
类,该类是我从
NUnitAttribute
类派生的:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class SimulatorOnlyAttribute : NUnitAttribute, IApplyToTest
{
    public void ApplyToTest(Test test)
    {
        if (test.RunState == RunState.NotRunnable)
        {
            return;
        }

        if (!Helper.RunsOnSimulator)
        {
            test.RunState = RunState.Ignored;
            test.Properties.Set(PropertyNames.SkipReason, "This test should run only on simulator");
        }
    }
}
现在我可以用新属性标记所需的测试用例:

[SimulatorOnly]
public void Test()

为了便于参考,您可以研究

的源代码,感谢您的快速响应!但这会导致测试失败,而不是我想要的。测试没有执行并不意味着它应该表明失败(在我的例子中)。Assert.Fail将导致测试失败。Assert.Ignore()完全执行您希望它执行的操作。它会导致在运行时忽略测试。引用文档中的话:“Assert.Ignore方法为您提供了在运行时动态忽略测试或套件的能力。”您是对的。当您仅运行testfixture时,它将指示失败,但当您同时运行一组testfixture时,testfixture将被忽略,最终结果是成功!!非常感谢。根据您使用的NUnit框架的版本,还有Assert.Inconclusive。这也将导致一个成功的结果,但标志着这些测试可能在其他条件下失败。嘿,我想到了这个解决方案。此解决方案的缺点是它是特定于调用方的。我们有时从VStudio内部执行测试,有时从脚本执行测试。两者都应进行更改和维护。+1。与“Assert.Ignore”相比,我更喜欢它,因为在我的例子中,它只是CLI的属性和附加标志。我认为这对解决方案没有帮助。因为运行时基于值(输入)的可用性,所以测试的输出是不同的。这为您的测试提供了正确的度量。然而,在运行时不能更改类别。
[SimulatorOnly]
public void Test()