t.me/atinfo_chat Telegram группа по автоматизации тестирования

Specflow параллельный запуск Outline Parallelizable(ParallelScope.Children)

Теги: #<Tag:0x00007fc0fe45d0a0> #<Tag:0x00007fc0fe45cfb0> #<Tag:0x00007fc0fe45cee8> #<Tag:0x00007fc0fe45ce20> #<Tag:0x00007fc0fe45cd58> #<Tag:0x00007fc0fe45cc68>

Добрый день! У меня написаны тесты для одного кейса несколько тестовых даных.

Feature: GoalPurchase

@runable
Scenario Outline: Goal Purchase
Given Открыт экран DeltaProDev Выбор роли

When Выбор клиента Фамилия <LastName> Имя <Name> Отчество <MiddleName> 
When Изменить этап сделки <DealStage>

Examples: 
| sotr            | N | LastName  | Name       | MiddleName | DealStage |
| Сотрудник | 0 | Булочкина | Кристина | Сергеевна   | 12              |
| Сотрудник | 0 | Уотсон       | Эмма       | Сергеевна   | 1                |

Появилась необходимость в параллельных запусках тестов. Я хочу, чтобы одновременно запускались эти два теста. Использую для этого такой способ:

[assembly: Parallelizable(ParallelScope.Children)]
[assembly: LevelOfParallelism(4)]

Но тесты выпадают в ошибку :
Message: System.ArgumentException : An item with the same key has already been added.
TearDown : System.NullReferenceException : Object reference not set to an instance of an object.

В SpecFlow параллельный сейчас запуск только для фикстур, не для тестов (касается NUnit3).

Как вариант - это написать свой плагин, который будет добавлять атрибут [Parallelizable] методам в сгенеренных классах, либо руками править сгенеренные классы.

Вы не подскажите ссылку, как это делать ?

Для этого надо знать программирование :slight_smile:

Вы попробуйте руками для начала добавить атрибуты. Может оно вообще не взлетит.

Я просто не понимаю, куда именно это нужно добавить. в feature после сценария ? Или куда?

После сохранения изменений в фф, у вас рядом генерится класс этого фф.

Вот там методам с тестами и надо добавить атрибут руками (но уже не трогать сам фф, ибо он перегенерит и сотрёт)

namespace MarsTests.Specflow.Features.ApplicationScanarios._3_Calculations
{
using TechTalk.SpecFlow;

[System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "2.4.0.0")]
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[TechTalk.SpecRun.FeatureAttribute("Scenario3.0.CorrectionCalculations", Description="\t\t Корректировка процентной ставки и расчет ПСК. ", SourceFile="Specflow\\Features\\ApplicationScanarios\\3.Calculations\\Scenario3.0.CorrectionCalcu" +
    "lations.feature", SourceLine=0)]
[NUnit.Framework.Parallelizable(NUnit.Framework.ParallelScope.Children)]

Что-то такое?

Yes.

Нет, это не помогает)

Тогда стоит смириться с параллельностью только фикстур.
Либо менять раннер

какой ранер лучше выбрать ?

Понятия не имею, какой больше нравится - такой и выбирайте. Можете попробовать их раннер.

Лично для меня NUnit вне конкуренции, но не в рамках SpecFlow, наверное.

Выбирайте SpecRun, если хотите использовать все фичи Specflow
для паралельного запуска тестов идем в файлик *.srprofile, настраиваем блок:

<Execution
stopAfterFailures="-1"
retryFor=“None”
testThreadCount=“30”
testSchedulingMode=“Random”
/>

посмотрите в документации о возможностях разных опций этого файла.

1 симпатия

И в чём практический смысл писать что-то такое, если [assembly: Parallelizable(ParallelScope.Children)] делает то же самое?

Это 5 :rofl:

@li_neizvestnaya
SpecFlow, действительно не поддерживает работу с Parallelizable.Children из-за своей текущей архитектуры.

Помимо [assembly: Parallelizable(ParallelScope.Fixtures)]
У SpecFlow в конфиге можно указать
<generator markFeaturesParallelizable="true"/>
который благополучно проставит Parallelizable