如何使用TechTalk.SpecFlow和C#以编程方式忽略一些验收测试?

Dmy*_*tro 13 c# acceptance-testing specflow

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

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

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

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

但它不起作用.也许是否有其他方法可以动态添加或删除标签?或者ScenarioContext类中哪些方法会忽略当前场景?

nem*_*esv 24

您至少有3个选项:

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

    if(IgnoreTests)
    {
        ScenarioContext.Current.Pending();
    } 
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    if(IgnoreTests)
    {
        Assert.Ignore();
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 或者如果你想要一个与测试框架无关的方式,你不怕乱丢Specflow内部,那么你可以使用IUnitTestRuntimeProvider界面:

    if (IgnoreTests)
    {
        var unitTestRuntimeProvider = (IUnitTestRuntimeProvider) 
        ScenarioContext.Current
           .GetBindingInstance((typeof (IUnitTestRuntimeProvider))); 
        unitTestRuntimeProvider.TestIgnore("ignored");
    }
    
    Run Code Online (Sandbox Code Playgroud)

    即使您更改了单元testprovider,这也会有效,但不保证此API不会在将来中断.