15

我有几个带有某些场景的功能文件。我需要忽略几个场景或功能,@tag根据某些条件标有一些。我已经阅读了 specflow 文档,但没有找到对我的解决方案有用的东西。我想使用类似的东西

[BeforeScenario("sometag")]
public static void BeforeScenario()
{
    if(IgnoreTests)
    {
       // This is the hot spot
       Scenario.DoSomethingToIgnoreScenarioIfConditionButRunScenarioIfConditionFalse();
    }        
}

我也尝试动态添加或删除标签

[BeforeScenario("sometag")]
public static void BeforeScenario()
{
    if(IgnoreTests)
    {
       ScenarioContext.Current.ScenarioInfo.Tags.ToList().Add("ignore");
    }        
}

但它没有用。也许还有其他方法可以动态添加或删除标签?或者ScenarioContext类中的某些方法会忽略当前场景?

4

1 回答 1

29

您至少有 3 个选项:

  1. 配置Specflow 以将待处理的步骤视为忽略,missingOrPendingStepsOutcome="Ignore"然后您可以编写:

    if(IgnoreTests)
    {
        ScenarioContext.Current.Pending();
    } 
    

    根据您对待处理步骤的要求,这可能不是您想要的。

  2. 使用内置的单元测试框架方法在运行时忽略测试。因此,如果您使用例如 NUnit,则使用Assert.Ignore()

    if(IgnoreTests)
    {
        Assert.Ignore();
    }
    

    我认为这是最干净/最简单的解决方案。

  3. 或者,如果您想以一种与测试框架无关的方式进行测试,并且您不怕弄乱 Specflow 内部结构,那么您可以使用该IUnitTestRuntimeProvider接口:

    if (IgnoreTests)
    {
        var unitTestRuntimeProvider = (IUnitTestRuntimeProvider) 
        ScenarioContext.Current
           .GetBindingInstance((typeof (IUnitTestRuntimeProvider))); 
        unitTestRuntimeProvider.TestIgnore("ignored");
    }
    

    即使您更改了单元测试提供程序,这也将起作用,但不能保证此 API 将来不会中断。

于 2012-09-25T19:08:28.900 回答