Параллельный запуск автотестов с одинаковыми ролями pytest

Дано:

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

Так вот, тестовый прогон 40 тестов занимает долгое время, решено было запускать через pytest -n4. Это запускает тесты в 4 потока, но они падают по причине повторной авторизации, соответственно, вопрос - как правильно реализовать параллельный запуск тестов?

Тестовые пользователи хранятся так:

USER_MAIN_L = os.getenv('USER_MAIN')
USER_MAIN_P = os.getenv('USER_MAIN_PASSWORD')
USER_MAIN_E = os.getenv('USER_MAIN_EMAIL')

Фикстура авторизации выглядит так:

@pytest.fixture(scope='function')
@allure.title('Авторизация пользователя')
def authorization(open_env):
    driver = open_env
    login_obj = LoginForm(driver)
    account_obj = Account(driver)
    with allure.step('Заполнить поле "Логин или email"'):
        login_obj.focus_on_login_and_input(USER_MAIN_L)
    with allure.step('Заполнить поле "Введите пароль"'):
        login_obj.focus_on_password_and_input(USER_MAIN_P)
    with allure.step('Нажать кнопку "Начать работу"'):
        auth_button = driver.find_element(*login_obj.id_login_button)
        auth_button.click()
        time.sleep(5)
    with allure.step('Ожидать появления email пользователя при авторизации'):
        login_obj.wait_element_present(account_obj.user_email[1])
    yield driver
    with allure.step('Нажать "Перейти к сметам"'):
        main_tab = MainTab(driver)
        btn_back_to_est = driver.find_element(*main_tab.back_to_estimates)
        main_tab.click(btn_back_to_est)
    with allure.step('Вызвать меню, нажав на почту пользователя'):
        btn_email = driver.find_element(*account_obj.user_email)
        account_obj.click(btn_email)
    with allure.step('Нажать "Выйти из аккаунта"'):
        btn_logout = driver.find_element(*account_obj.logout)
        account_obj.click(btn_logout)

Стоит попробовать разные профили браузера для каждого пользователя, например для хрома Chromium Docs - User Data Directory
Также

Хм… Начнём с того, что os.getenv() вернёт того пользователя, который прописан в системной переменной. Таким образом, все 4 теста попытаются авторизоваться с 1 юзером, что и приведёт к проблеме.
Для того, чтобы её решить, есть несколько способов:

  1. Создаём 4-х юзеров, настраиваем их ручками, после чего запихиваем их креды в какой-нить расшаренный внешний ресурс для тестов (простейшая реализация: текстовый файл) и отдаём последовательно в каждый тест. Расшаренный ресурс нужен для того, чтобы каждый тест знал, какой юзер уже используется и брал следующего в списке.
    Минус этого способа: плохая масштабируемость. Если надо добавить больше или меньше пользователей - придётся переконфигурировать систему. Плохо и для CI подходит не оч.
  2. Нормальный способ :slight_smile: Уникальные рандомные юзера и их профайлы создаются фикстурой через API или вообще через SQL запрос в БД. Каждый юзер создаётся на before_test и удаляются (также через API или SQL) на tear_down. В этом случае решается проблема как авторизации, так и масштабирования. Создание юзеров на сравнительно низком уровне гарантирует их создание и удаление вне зависимости от успешности UI тестов (проблемы с удалением возникнут только в случае изменения API / таблицы в БД).
1 Like