Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Selenium + py.test: прогнать один набор тестов на разных вебсайтах основываясь на файле опций

fixtures
parameterized
pytest
selenium
python
Теги: #<Tag:0x00007fedb7dc6598> #<Tag:0x00007fedb7dc6390> #<Tag:0x00007fedb7dc5f08> #<Tag:0x00007fedb7dc5cd8> #<Tag:0x00007fedb7dc5b20>

(Spasley) #1

Есть ли возможность реализовать то, что мне нужно в один запуск py.test?

Тестируемый проект представляет собой кастомизируемый портал (меняются название фирмы, логотипы) и нужно один и тот же набор тестов запустить последовательно на разных урлах.

{
“host_urls”: [“url1”, “url2”]
}

Простым решением мне кажется отдельный скрипт, который будет парсить файл опций вперед конфтеста и следом будет запускать py.test в зависимости от того, сколько и каких урлов нашел, но мне такой подход кажется неправильным и есть ощущение, что это можно решить манипуляциями в conftest.py

В нижеследующий код вставил в робкой надежде, что проканает, но не проканало.

if is_multiportal_run == 'yes':_
       for portal in options['host_urls']:
def app(request):
    global fixture
    global options
    if options is None:
        config_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), request.config.getoption("--options"))
        with open(config_file) as f:
            options = json.load(f)
    is_multiportal_run = request.config.getoption("--multiportal")
    if is_multiportal_run == 'yes':_
_        for portal in options['host_urls']:_
            if fixture is None or not fixture.is_valid():
                fixture = Application(host_url=portal)
            return fixture
def pytest_addoption(parser):
    parser.addoption("--options", action="store", default="options.json")
    #  run py.test with option '--multiportal yes' to run test over all portal hosts set in options.json
    #  otherwise only first portal in list will be tested
    parser.addoption("--multiportal", action="store", default="no")

(Sergey Pirogov) #2

Чего не этим добьетесь? Какую проблему хотите решить?


(Spasley) #3

Я хочу прогнать один набор тестов на разных версиях портала, избежав создания дополнительных конфигов и скриптов.


(Sergey Pirogov) #4

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


(Spasley) #5

Почему вы считаете последовательный перебор параметров из файла избыточно сложным?
Речь идет не о запуске два раза, сейчас порталов уже 4, а сколько будет в итоге - не известно. В то же время, новый добавляется сравнительно редко, его хост известен и не меняется.


(zub_test) #6

Как вариант, можно параметризировать сами тесты:

@pytest.mark.parametrize("base_url", Config.get_base_url_list())
def test_something(self, base_url):
       driver.get(base_url)
       firther_actions()

тест выполнится для каждого base_url из списка.

Но лично я бы тоже сделал отделал отдельные билд конфигурации для каждого портала.
Такой подход, например, поможет ускорить ответ на вопрос: “А как там у нас дела на портале x?”.
Вы запустите тесты только для портала х и получите результаты. При Вашем подходе Вы будете ждать пока тесты пройдут для всех порталов. Если вдруг что-то упадёт придется лезть в отчёт, чтобы посмотреть не на портале х ли это упало.


(Spasley) #7

Этот случай я хотел решить через дополнительный параметр для запуска пайтеста. На данный момент все различия порталов - в урле, поэтому пока возможно, хочу избежать дополнительных файлов.
Подумаю на тему того, чтобы хранить конфиги в одном файле разве что и доставать по ключу.