我有几个功能文件和一些场景。我需要忽略几个场景或功能,标有一些@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
类中的某些方法会忽略当前的情况?
答案 0 :(得分:24)
您至少有3个选项:
Configure使用missingOrPendingStepsOutcome="Ignore"
将待处理步骤视为忽略的规范,然后您可以写:
if(IgnoreTests)
{
ScenarioContext.Current.Pending();
}
根据您对待处理步骤的要求,这可能不是您想要的。
使用内置方法的单元测试框架在运行时忽略测试。所以如果你正在使用例如NUnit然后使用Assert.Ignore():
if(IgnoreTests)
{
Assert.Ignore();
}
我认为这是最干净/最简单的解决方案。
或者,如果你想要一个与测试框架无关的方式,你不怕乱丢Specflow内部,那么你可以使用IUnitTestRuntimeProvider
接口:
if (IgnoreTests)
{
var unitTestRuntimeProvider = (IUnitTestRuntimeProvider)
ScenarioContext.Current
.GetBindingInstance((typeof (IUnitTestRuntimeProvider)));
unitTestRuntimeProvider.TestIgnore("ignored");
}
即使您更改了单位测试提供商,这也会有效,但不保证此API不会在将来中断。