Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Помогите сделать параметры командной строки

pytest
python
Теги: #<Tag:0x00007f7b68e802c0> #<Tag:0x00007f7b68e80180>

(Вадим) #1

Всем привет !

Хочу установить параметры командной строки которые, в зависимости от запуска, вызывали разные браузеры. Но не получается, прочитал про добавление фикстур - https://docs.pytest.org/en/latest/example/simple.html , но не получается, при использовании структуры
примерно такой + файлик conftest.py как в документации
class Test_1:
def test_answer(cmdopt):
pass

def test_answer1(cmdopt):
    pass

При использовании класса, он вызывает вот такой объект -
cmdopt = <test_sample.Test_a object at 0x10d262c50>, а не “type” прописаный в фикстурах
Подскажите, как правильно настроить фикстуру.
Или, если возможно, грамотно прописать в Environment variables
Подскажите идеи, спасибо

Selenium-Webdriver-in-different-browsers


(Maxim Andryushchenkov) #2

Функу и фикстуру надо добавить в conftest.py
Сначала надо добавить функу на кастомные ключи:

def pytest_addoption(parser):
    """
    Метод добавляет кастомные ключи в запуск тестов
    Ключи:
    --browser: chrome/firefox - браузер для тестирования
    :param parser: парсер ключей pytest
    """
    parser.addoption('--browser', action='store',
                     default='chrome')

Затем написать фикстуру получения экземпляра класса вебдрайвера:

@pytest.fixture()
def web_driver(request):
    """
    Инициализация веб драйвера в зависимости от ключа "--browser"
    :return: объект класса webdriver
    """
    browser = request.config.getoption('--browser')
    driver_name = dict(
        firefox='geckodriver',
        chrome='chromedriver'
    )[browser]
    driver_path = path.join(drivers_dir, driver_name)
    if browser == 'firefox':
        driver = webdriver.Firefox(executable_path=driver_path,
                                   log_path=log_path,
                                   firefox_options=ff_opts)
    elif browser == 'chrome':
        driver = webdriver.Chrome(executable_path=driver_path,
                                  service_log_path=log_path,
                                  chrome_options=ch_opts)
    driver.delete_all_cookies()
    def driver_finalizer():
        driver.quit()
    request.addfinalizer(driver_finalizer)
    return driver

Далее вам необходимо использовать эту фикстуру в тесте чтобы получить вебдрайвер нужного браузера

В консоли вызов будет:

pytest --browser=chrome
pytest --browser=firefox

PS: Я там повырезал в коде много строк чтобы была понятнее суть. Так что не спрашивайте что там за переменные неопределенные)

UPD: Вообще в тесты получать через фикстуру вебдрайвер - не комильфо, я лично создаю фикстуру на быстрые переходы по страницам и сразу кидаю оъект страницы в тест тем самым цепочкой фикстур подготавливая стенд:

@pytest.fixture()
def login_page(web_driver) -> LoginPage:
    """
    Фикстура для быстрого перехода на страницу авторизации
    :param web_driver: фикстура инициализации веб драйвера
    :return: экземпляр класса LoginPage
    """
    page = LoginPage(web_driver)
    page.navigate()
    return page

(Вадим) #3

Спасибо, сейчас буду пробовать


(Nikita Barchugov) #4

Не комильфо - это кто сказал?


(Вадим) #5

Проделал вышеуказанные манипуляции. Пытаюсь запустить командой **

  • python3 -m pytest --fixtures --browser=firefox simple.py

**
При этом получаю ошибку simple.py:39: no docstring available
И еще вопрос, фикчу надо прописывать на каждый тестовый метод (и передавать ее в параметры), или можно навесить на тестовый класс ?


(Maxim Andryushchenkov) #6
  1. Вот так должно работать
pytest --browser=firefox simple.py
  1. На класс нельзя вроде

(Maxim Andryushchenkov) #7

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


(Евгений Бухгаммер) #8

scope=‘class’

Должно работать :slight_smile:


(Maxim Andryushchenkov) #9

Немного подробнее изучил вопрос касаемо классового скоупа, есть хорошая статья:


Написав достаточно большое количество тестов в pytest у меня не разу не было потребности в создании класса для тестов и подозреваю что это делается для кастомных сетапов и тирдаунов. Какие еще есть плюсы в создании классов?


(Евгений Бухгаммер) #10

Подозреваю, что возможность работы с классами была добавлена как обратная совместимость с class based тестами на unittest, и чтобы малой кровью можно было обойтись и не рефакторить всю ту же логику, перетаскивая методы в модульный скоуп


(Nikita Barchugov) #11

Тот же самый вопрос. Уже несколько месяцев мучаюсь, пытаясь найти подсказки. Рили же удобно без классов


(Maxim Andryushchenkov) #12

Мне тоже оказались не нужны, собираю в скоупы по -k и -m. И больше ничего не требуется