使用SpecFlow + SpecRunner时在线程之间共享数据

时间:2019-03-25 15:36:01

标签: c# specflow

我正在研究使用SpecFlow + SpecRunner和XUnit的测试服实现。我们正在尝试执行并行测试执行,我想知道是否有一种方法可以在测试运行开始时运行钩子并将令牌值存储在静态变量中,以便可以在线程之间共享

总结一下,specflow提供了一种在并行执行期间在线程之间共享数据的机制。

2 个答案:

答案 0 :(得分:1)

您可以使用上下文注入在并行执行期间共享数据。这样可以允许线程之间共享状态。

import lxml.html
tree = lxml.html.fromstring(sample)
images = tree.xpath("//img/@image-file")
print(images)

答案 1 :(得分:-1)

我们可以使用以下任一方法共享数据

  1. 场景上下文
  2. 上下文注入

在这里,方法1和2在多线程中不会有任何问题。因此,上下文注入生命是特定于场景级别的。

方法1:,我们可以在 BeforeScenario 挂钩中定义令牌生成步骤,并且可以在<platform name="android"> <custom-preference name="android-manifest/application/@android:allowBackup" value="false" /> 中更新生成的令牌值。

我们可以在下面的任意位置直接从场景上下文中访问令牌

此处,令牌将在每个方案运行之前生成,并且不会影响并行执行。有关更多详细信息,请Parallel-Execution

  

场景及其相关的挂钩(场景之前/之后,场景阻止,步骤)在执行过程中被隔离在不同的线程中,并且彼此之间不会相互阻塞。每个线程都有一个单独的(和隔离的)ScenarioContext。

挂钩类:

ScenarioContext

步骤类:

public class CommonHooks
{
    [BeforeScenario]
    public static void Setup()
    {
        // Add Token Generation Step
        var adminToken = "<Generated Token>";
        ScenarioContext.Current["Token"] = adminToken;
    }
}

如果您希望在多个Step中共享同一令牌,则可以在构造函数中分配此令牌值,并且可以使用

例如,

[Given(@"I Get the customer details""(.*)""")]
public void WhenIGetTheCustomerDetails(string endpoint)
{
   if(ScenarioContext.Current.ContainsKey("Token"))
   {
       var token = ScenarioContext.Current["Token"].ToString();
       //Now the Token variable holds the token value from the scenario context and It can be used in the subsequent steps
   }
   else
    {
        Assert.Fail("Unable to get the Token from the Scenario Context");
    }
}

方法2:上下文注入的详细信息可以在下面的链接中以示例的方式引用

Context Injection