Параллельные тесты с Gherkin, Specflow и Selenium

Я настраиваю автоматические приемочные тесты для проекта Asp.Net MVC с использованием сценариев Gherkin, шагов Specflow и удаленного веб-драйвера Selenium. Цель состоит в том, чтобы запустить тесты из Jenkins параллельно на нескольких узлах, используя серверный концентратор Selenium.

На данный момент я пытаюсь заставить их работать параллельно локально и возникают некоторые трудности. Возможно ли запустить эти тесты параллельно с настройкой Gherkin / Specflow, или тот факт, что сценарии Gherkin повторно используют одни и те же шаги Specflow для аналогичных сценариев, делает невозможным их одновременное выполнение?

Если это не невозможно, то как именно это можно сделать? А если это невозможно, что еще можно сделать, чтобы ускорить процесс тестирования?


person Sh3mm    schedule 10.11.2015    source источник


Ответы (2)


Это не имеет ничего общего с

тот факт, что сценарии Gherkin повторно используют одни и те же шаги Specflow для аналогичных сценариев, делает невозможным их одновременное выполнение

Вполне возможно запустить ваши MSTest дела параллельно. Насколько мне известно, максимальное количество зависших тестов не должно превышать 5. Однако для этой цели я использовал специальный инструмент, создавая каждый тест в отдельном потоке, это легко сделать с помощью TPL.

person ekostadinov    schedule 10.11.2015
comment
Может, я тогда неправильно его настроил. Когда я запускаю их по отдельности или вместе, но без параллельного выполнения, они работают нормально. Когда я включаю параллельное выполнение, я сталкиваюсь с проблемами. Например, если я запускаю два сценария для проверки того, что разные ссылки загружают соответствующие страницы, второй не удастся, поскольку он получит результат первого. Возможно, они пытаются работать параллельно с одним и тем же экземпляром драйвера или что-то в этом роде. - person Sh3mm; 10.11.2015
comment
Я предполагаю, что вы смешиваете экземпляр IWebDriver. Каждый драйвер связывается с одним соответствующим экземпляром браузера через свой идентификатор сеанса. Посмотрите еще раз на свой дизайн :) - person ekostadinov; 10.11.2015
comment
У меня есть план сценария для проведения 5 подобных тестов. У меня есть метод BeforeScenario для создания нового RemoteWebDriver и AfterScenario для его разрушения. Когда я запускаю более одного теста с параллельным выполнением, метод AfterScenario для выхода из драйвера завершает оставшиеся тесты. Как мне создать новый драйвер для каждого запуска сценария? - person Sh3mm; 11.11.2015
comment
Дизайн с точки зрения BDD звучит примерно правильно, но метод AfterScenario для выхода из драйвера убивает оставшиеся тесты. сообщает мне, что, возможно, вы передаете один и тот же экземпляр драйвера между методами MSTest, поэтому какой тест завершается первым, убивает его. Можете ли вы попробовать добавить этот атрибут в свой метод BeforeScenario - [TestInitialize]. - person ekostadinov; 11.11.2015
comment
Кажется, есть два разных результата. Во-первых, при некоторых прогонах сразу же генерируется исключение Item с уже добавленным таким же ключом. Второй результат - это ссылка на объект, которая не соответствует экземпляру ошибки объекта. Похоже, что существует только один экземпляр драйвера, как только запускается второй тест, первый браузер останавливается. Если я проведу два теста, второй будет пройден, так как он перехватит драйвер из первого. Если я запускаю 3+ теста, как только один тест завершается, больше не будет запускаться или завершаться. Я полагаю, что элемент с таким же ключом является ссылкой на драйвер? - person Sh3mm; 11.11.2015
comment
Все указывает на то, что, скорее всего, у вас есть модель, которая дважды содержит одно и то же свойство (драйвер). Возможно, вы используете new, чтобы скрыть базовое свойство. - person ekostadinov; 11.11.2015
comment
Я столкнулся с этим ответом по другому вопросу, поскольку вы сказали, что он указывает на это, но я не вижу, где драйвер используется дважды, если каждый тест не пытается создать один и тот же драйвер. В каком случае, как обеспечить создание уникального драйвера при каждом запуске сценария? - person Sh3mm; 11.11.2015
comment
Это вопрос дизайна. По возможности избегайте наследования драйвера в тестах. Может быть, когда ваши дочерние тесты получают свойство Driver из базы - эта проблема возникает. Дважды проверьте, как вы создаете экземпляры производных классов. - person ekostadinov; 11.11.2015
comment
Драйвер не передается по наследству. Он создается в настройке. - person Sh3mm; 11.11.2015
comment
Я имел в виду, если вы передадите этот драйвер в некоторых иерархически структурированных объектах страницы или в тестовых. - person ekostadinov; 11.11.2015
comment
Я добавил код, может он немного прояснит ситуацию. - person Sh3mm; 11.11.2015
comment
Мне кажется, я не могу найти никаких недостатков в вашем коде. - person ekostadinov; 11.11.2015

Для этого вам нужно будет использовать сетку селена, и я бы порекомендовал разместить сетку на другом компьютере или виртуальной машине, если сможете.

Вы можете запустить один и тот же тест в нескольких браузерах, используя комбинацию 1) параллельной библиотеки задач и 2) класса динамических объектов. Я написал здесь об особенностях http://blog.dmbcllc.com/running-selenium-in-parallel-with-any-net-unit-testing-tool/

person Dave Bush    schedule 11.11.2015