Specflow 2.0.0使用ScenarioContext.Current的替代方法是什么?

时间:2016-02-01 10:31:53

标签: specflow

我已升级到Specflow 2.0.0。使用NUnit 3(也尝试使用XUnit),我希望能够并行执行测试用例,以减少运行测试所用的时间。

在尝试并行执行测试时,会返回一个错误,指出我无法使用FeatureContext.Current和ScenarioContext.Current。

测试使用这些来提取附加日志记录的功能和方案的名称。

测试还使用标签来控制测试。

例如: 我知道可以将标签放在属性

[Binding]
public class SpecFlowHooks
{
    public ScenarioContext context;

    public SpecFlowHooks(ScenarioContext scenarioContext)
    {
        context = scenarioContext;
    }

    [BeforeScenario("SpecialCase")]
    public void BeforeScenario_SpecialCase() {
        do some stuff
    }

    [BeforeScenario]
    public void BeforeScenario() {
        do different stuff
    }
}

问题在于BeforeScenario始终运行。如果标签“SpecialCase”不存在,我不希望它运行,因为应用程序将不处于正确的状态。因此,如果标签“SpecialCase”存在,我会提取标签并执行不同的操作。

如何在不使用

的情况下找到标签列表
List<String> tags = ScenarioContext.Current.ScenarioInfo.Tags.ToList();

1 个答案:

答案 0 :(得分:1)

并行执行的替代方法是允许specflow使用的依赖注入系统为您提供ScenarioContext实例。为此,您的步骤类接受ScenarioContext的实例并将其存储在字段中:

[Binding]
public class StepsWithScenarioContext
{
    private readonly ScenarioContext scenarioContext;

    public StepsWithScenarioContext(ScenarioContext scenarioContext)
    {
        if (scenarioContext == null) throw new ArgumentNullException("scenarioContext");
        this.scenarioContext = scenarioContext;
    }

    [Given(@"I put something into the context")]
    public void GivenIPutSomethingIntoTheContext()
    {
        scenarioContext.Set("test-value", "test-key");
    }
}

可以找到有关如何使用并行执行的更全面的解释here

需要采用类似的方法来获取标签。再次添加一个构造函数,它将ScenarioContext带到包含[BeforeScenario]方法的类中,并将ScenarioContext保存在字段中并使用此字段而不是ScenarioContext.Current