无法在代码中获得正确的 SpecFlow+ 目标值

Unable to get correct SpecFlow+ Target value in code

我正在尝试使用 here 中描述的 SpecFlow+ 目标功能,尽管我已经设法让其他场景显示在测试资源管理器中 window标签,当 运行 并行时,我无法从特定 thread/scenario.

的转换 App.config 中获得正确的 'Target' 值

例如

场景如下所示...

@Browser_Chrome
@Browser_Edge
Scenario:[Apprentice Management] Navigate to add new apprentice
    Given The user is logged into the Smart End Point Assessment website
    When The user is on the Apprentice -> Add Apprentice page
    Then The user will be on the Apprentice Details page

.srprofile 文件中的目标部分如下所示...

<Targets>
    <Target name="Edge">
      <Filter>Browser_Edge</Filter>
      <DeploymentTransformationSteps>
        <EnvironmentVariable variable="Test_Browser" value="Edge" />
      </DeploymentTransformationSteps>
    </Target>
    <Target name="Chrome">
      <Filter>Browser_Chrome</Filter>
      <DeploymentTransformationSteps>
        <EnvironmentVariable variable="Test_Browser" value="Chrome" />
      </DeploymentTransformationSteps>
    </Target>
  </Targets>

调整重定位配置文件中值的转换...

<add key="browser" value="{Target}" 
xdt:Locator="Match(key)" 
xdt:Transform="SetAttributes(value)" /> 

在测试资源管理器中针对每个目标显示的场景 window。目前一切正常...

问题是,如果我尝试 运行 将这两种情况放在一起,在代码中我将无法访问正确的 浏览器 app.config每个 运行ning 线程的值。

这里有 2 个选项用于尝试在代码中检索该值...

string testBrowserOne = ConfigurationManager.AppSettings["browser"];
string testBrowserTwo = Environment.GetEnvironmentVariable("Test_Browser");

Debug.WriteLine($"Test Thread {Thread.CurrentThread.ManagedThreadId}. testBrowserOne = {testBrowserOne}");
Debug.WriteLine($"Test Thread {Thread.CurrentThread.ManagedThreadId}. testBrowserTwo = {testBrowserTwo}");

运行这两个 threads/scenarios 的输出如下....

Test Thread 21. testBrowserOne = Edge   
Test Thread 21. testBrowserTwo = Chrome
Test Thread 20. testBrowserOne = Edge
Test Thread 20. testBrowserTwo = Chrome

我不知道为什么这两种不同的检索值的方法会返回不同的值,但这在很大程度上是无关紧要的。问题是两个线程都返回相同的值,这意味着我不能同时有一个场景 运行 一个 chrome 测试,一个场景 运行 一个边缘测试。他们要么 运行 作为 Chrome 要么都 运行 作为 Edge.

这可能是什么问题?

其他相关.srprofile设置如下

  <Execution stopAfterFailures="0"
             testThreadCount="3"
             testSchedulingMode="Random"
             retryFor="Failing"
             retryCount="1"
             apartmentState="MTA"  />
  <VSTest testRetryResults="Unified"
          passRateAbsolute="1" />
  <Environment testThreadIsolation="SharedAppDomain" platform="x86"/>

我担心这是使用 SharedAppDomain 的症状,并且没有解决方案。

你是对的。问题是 SharedAppDomain testThreadIsolation。 EnvironmentVariable Deploymentstep 仅适用于 Process testThreadIsolation 模式。

您只能在进程级别设置环境变量。在同一个进程中,它们会一直被覆盖。

将 testThreadIsolation 模式更改为 Process,它应该会按预期工作。


完全披露:我是 SpecFlow 和 SpecFlow+ 的开发者之一