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

时间:2012-09-25 15:19:51

标签: c# specflow acceptance-testing

我有几个功能文件和一些场景。我需要忽略几个场景或功能,标有一些@tag,具体取决于某些条件。我看过specflow documentation,但没有找到对我的解决方案有用的东西。我想使用像

这样的东西
[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类中的某些方法会忽略当前的情况?

1 个答案:

答案 0 :(得分:24)

您至少有3个选项:

  1. Configure使用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不会在将来中断。