Запуск теста в несколько потоков Py.test + Selenium

Сегодня посмотрел доклад Михаила “От идеи до Selenium теста всего лишь один шаг — Python”

На 39-й минуте было показано, как запускать тесты в несколько потоков.

Такой командой py.test -n2 test.py запустить тест в 2 потока не получается. Запускаются последовательно тесты (сначала один, потом другой)

В самом тесте я использую unittest(т.е. наследуюсь от unittest.TestCase). Запускаю через selenium grid (создал два инстанса firefox)

Вот мой BaseTestCase.py https://github.com/Vadim-Kovrizhkin/Test_Portfolio/blob/master/BaseTestCase.py

Запускаю вот такой тест https://github.com/Vadim-Kovrizhkin/Test_Portfolio/blob/master/Test_Portfolio.py
py.test -n2 Test_Portfolio.py
И этот тест идет 2 раза по очереди.

Что не так делаю? :frowning:

Это уже второй доклад, где я вижу про использование такой команды, для запуска тестов в несколько потоков

У вас стоит?

да, конечно

В последнее время тема стала звучать довольно часто. Может стоит написать кому то мануал по распараллеливанию тестов?

1 лайк

Я могу))
Только нужно узнать как это сделать))

1 лайк

А скажите версии pytest, pytest-xdist и приложите содержимое Pages.BaseClass плиз
Да и вообще интересно, зачем вы наследуетесь от BaseClass

pytest(2.9.1) и pytest-xdist поставил буквально 3 дня назад.
Вот baseclass Screenshot by Lightshot

Только что поставил всю эту связку py.test + pytest-xdist, проверил на своих тестах, работает - агонь, параллелит как надо ))

как так:)
А есть пример теста?

Может у вас проблема в том, что вы запускаете 1 тест в 2 потока, он и срабатывает 2 раза последовательно.
Хотя я для теста запустил один тест в 2 потока, сработал 1 раз в 1 поток )
Попробуйте запустить 2 теста.

Да, я пытаюсь запустить 1 тест в 2 потока, ожидая что у меня запустится два инстанса браузера. Т.е. например запустить 1 тест сразу на нескольких браузерах.
Пока я пытаюсь делать все на FireFox, предполагая, что запустится 2 инстанса FF.

Нет, так 2 инстанса не запустится. Для разных браузеров скорее надо ковырять Selenium Grid. В данной ситуации попробуйте сделать еще один простенький тест и запустить в 2 потока. Должно работать.

1 лайк

Таки да. Запустилось 2 теста, не совсем одновременно, но все же не по очереди:)
Спасибо большое.

Я все же надеялся, что это решит проблему с запуском теста сразу на нескольких браузерах.
У Вас нет случайно предположений, как это можно сделать?
например нельзя ли как-то сделать так, чтобы например такой командой запускать тест
py.test -n2 test1.py platform = WINDOWS, browser = CHROME, FIREFOX, SAFARI, IE – 1 команда
py.test -n2 test1.py platform = MAC, browser = CHROME, FIREFOX, SAFARI - 2 команда

затем создать две джобы в дженкинсе, чтобы каждая запускала тест на 1 платформе для нескольких браузеров:)

хоть какой-то бы примерчик того, как это реализовать в коде
если это реально

И тут на сцену выходит отказ от unittest.TestCase (вообще не вижу причин вам его использовать, он накладывает некоторые ограничения на функционал pytest), и использование фикстур/параметризации тестов. Много-много чтива на этот счёт, например, здесь Parametrizing tests — pytest documentation

Я вам не могу привести простой пример своего когда из-за очень брутального взаимосвязанного огорода :slight_smile: Но на пальцах, я использую параметризованную фикстуру driver, и тесты выглядят так

def test_something(driver):
    driver.get(myurl)
    # lot's of code here

всё, что делается в ваших сетап и тиардаун методах спрятано как раз в driver. Ну и запускаю тесты с нужными параметрами командной строки (в том числе браузеры и платформы)

1 лайк

Спасибо большое
Буду исследовать)

А unittest понравился тем, что похож на джавовский Junit. И после джавы было удобней переместиться на него.