Невозможно получить правильное значение SpecFlow + Target в коде - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь использовать функциональные возможности SpecFlow +, как описано здесь , и хотя мне удалось получить дополнительный сценарий ios, который будет отображаться в окне тестового проводника для моих различных тегов при параллельной работе я не могу получить правильное значение 'Target' из преобразованного файла App.config для этого конкретного потока / сценария.

Например,

Сценарий выглядит следующим образом. ..

@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)" /> 

Сценарий, отображаемый для каждой цели в окне тестового проводника. Пока все нормально ...

enter image description here

Проблема в том, что если я попытаюсь запустить эти 2 сценария ios вместе, в коде я не удалось получить доступ к правильному значению browser app.config для каждого запущенного потока.

Вот 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}");

Результат выполнения этих 2 потоков / сценария ios выглядит следующим образом ....

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

Я понятия не имею, почему эти 2 разных метода для получения значения возвращают разные значения, но это в значительной степени не имеет значения. Проблема в том, что оба потока возвращают одни и те же значения, что означает, что у меня не может быть одного сценария, запускающего тест 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 , и нет никакого решения.

1 Ответ

1 голос
/ 29 января 2020

Вы правы. Проблема в SharedAppDomain testThreadIsolation. Шаг EnvironmentVariable Deployments работает только в режиме Process testThreadIsolation.

Переменные среды можно устанавливать только на уровне процесса. В этом же процессе они будут все время перезаписываться.

Измените режим testThreadIsolation на Process, и он должен работать как положено.


Полное раскрытие: я один из разработчики на SpecFlow и SpecFlow +

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...