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

问题描述 投票:11回答:1

我有几个功能文件和一些场景。我需要忽略几个场景或功能,标有一些@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类中的一些方法会忽略当前的情况?

c# specflow acceptance-testing
1个回答
24
投票

您至少有3个选项:

  1. 使用Configure将待处理步骤视为忽略的missingOrPendingStepsOutcome="Ignore" Specflow然后你可以写: 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"); } 即使您更改了单元testprovider,这也会有效,但不保证此API不会在将来中断。
© www.soinside.com 2019 - 2024. All rights reserved.