无法在代码中获得正确的 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+ 的开发者之一
我正在尝试使用 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+ 的开发者之一