Как выполнить до и после запуска теста только один раз при параллельном выполнении specflow

Мне нужно запускать сценарии БД до и после выполнения теста, но если я упомянул в разделе «Перед выполнением теста», он запускается несколько раз для каждого потока, но мне нужно запускать только один раз при выполнении теста, что означает, что он должен быть выше всех потоков.

Например: файл хуков

[BeforeTestRun]
public static void BeforeTestrun()
{
    Console.WriteLine("run before test");
}

[AfterTestRun]
public static void AfterTestrun()
{
    Console.WriteLine("run after test");
}

В Default.srprofile количество потоков = 3

При запуске сборки это отображается так

  • Thread0: "запустить перед тестом"
  • Thread1: "запустить перед тестом"
  • Thread2: "запустить перед тестом"
  • Thread0: "запустить после теста"
  • Тема 1: "запустить после теста"
  • Тема 2: "запустить после теста"

Но я должен запускать только один раз над всеми потоками и после всех потоков


person sri    schedule 04.02.2020    source источник
comment
Это дубликат stackoverflow.com/questions/14775574/ — принятый ответ охватывает оба сценария   -  person Michael Jones    schedule 04.02.2020
comment
Спасибо за ответ, Майкл, но как мы можем использовать эти методы в проекте specflow? пожалуйста, помогите мне   -  person sri    schedule 05.02.2020
comment
Я почти уверен, что вы можете буквально заменить [BeforeTestRun] на [AssemblyInitialize] и [AfterTestRun] на [AssemblyCleanup].   -  person Greg Burghardt    schedule 05.02.2020
comment
Вы используете MSTest? Какой поставщик модульных тестов вы используете? Это будет иметь значение.   -  person Greg Burghardt    schedule 05.02.2020
comment
Я не использую MSTest, и я делаю это для автоматического тестирования, модульного теста нет.   -  person sri    schedule 05.02.2020
comment
Я пишу это [BeforeTestrun] и [AfterTestrun] в файле Hooks specflow.   -  person sri    schedule 05.02.2020
comment
вы можете использовать [OneTimeSetUp] для запуска скриптов БД, если его нужно запустить один раз для всего кода. или в NUnit есть ITestAction, который вы можете использовать перед запуском теста. Пожалуйста, дайте мне знать, если требуется дополнительная информация   -  person Krunal Patel    schedule 06.02.2020
comment
Спасибо krunal, я должен упомянуть об этом в файле ловушек specflow? Если я хочу запустить и после выполнения, это работает? Я не использую NUnit в своей структуре   -  person sri    schedule 06.02.2020
comment
Как вы добиваетесь параллельного выполнения?   -  person Sandesh A D    schedule 06.02.2020
comment
Путем изменения testThreadCount в Default.srprofile   -  person sri    schedule 06.02.2020
comment
Если вы делаете это для автоматического тестирования, вам следует использовать какой-либо поставщик модульных тестов, например MSTest или NUnit. Можете ли вы перечислить пакеты NuGet, установленные для вашего проекта selenium?   -  person Greg Burghardt    schedule 06.02.2020
comment
Да, я вижу MSTest.TestFramework в пакете NuGet, но где я могу реализовать это, извините, я новичок в этом   -  person sri    schedule 07.02.2020


Ответы (1)


Если вы используете SpecFlow+Runner с режимом изоляции тестового потока Process или AppDomain, выполнение хуков BeforeTestRun`AfterTestRun` будет происходить для каждого потока.

Это предполагаемое поведение. Причина этого в изоляции памяти между потоками в этих режимах изоляции.

Чтобы что-то выполнялось только один раз за весь тестовый прогон, вы должны использовать свой собственный шаг развертывания. Пример здесь: https://github.com/SpecFlowOSS/SpecFlow.Plus.Examples/tree/master/CustomDeploymentSteps

Если это происходит для других тестовых прогонщиков или в SharedAppDomain, пожалуйста, создайте проблему на GitHub.


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

person Andreas Willich    schedule 06.02.2020
comment
Спасибо, Андреа, но похоже, что для этого нам нужно установить WinApp, если нужно установить его только для конкретной системы, как этого добиться без этого приложения? - person sri; 06.02.2020
comment
Это пример написания пользовательского шага развертывания. В нем используется драйвер WinApp. Вы можете изменить эту часть на то, что вам нравится. Это не требуется для функциональности пользовательского шага. - person Andreas Willich; 06.02.2020
comment
О, хорошо, если мы напишем пользовательское развертывание, будет ли он запускать файл Hooks так же, как раньше? потому что я делаю некоторые другие действия в сценариях до и после. - person sri; 06.02.2020
comment
Не могли бы вы дать ответ на это также stackoverflow.com/q/60044416/5968601 - person sri; 06.02.2020