Как при помощи автотестов на python+selenium можно имитировать 100+ юзеров?

Рейтинг: 0Ответов: 2Опубликовано: 23.02.2023

Задача: Масштабировать написанные автотесты (python + selenium) до 100 параллельных потоков. В каждом потоке должны прокидываться свои логин и пароль для юзера.

Цель: Имитировать поведение 100+ реальных юзеров на сайте. Нет цели снимать метрики и проводить нагрузочное тестирование в классическом понимании. Это скорее демонстрация для продукт-менеджеров.

Пробовал настроить Selenoid. Идея запускать каждый поток в отдельном контейнере подходит. Но не понятно как можно поднять сразу много браузеров одной версии при этом прокидывать в каждый контейнер свои логин и пароль.

Еще нашел Ggr (от создателей того же Selenoid), но пока не понятно подходит ли он для решения моей задачи.

Ответы

▲ 0

Вы можете запускать экземпляры браузера в несколько потоков при помощи модуля threading

Например вот так:

import threading
from selenium import webdriver

def run_test(username, password):
    driver = webdriver.Chrome()
    #Действия на сайте
    driver.quit()

# создание 100 потоков
for i in range(100):
    username = "логин"
    password = "пасс"
    t = threading.Thread(target=run_test, args=(username, password))
    t.start()
▲ 0

Рассмотрите, пожалуйста этот вариант. С использованием фрейма для автотестеров. Думаю данный опыт Вам всё равно не помешает

Прокидывать логин и пароль также реализуемо через фикстуру @pytest.mark.parametrize, и в параметрах указать 2 переменные - логин и пароль. Тяну эти кучу данных лично я с .json файла, т.к. для меня это удобно, кто-то это делает с xml как будет Вам удобно. В параметрайзе я прописываю индексы .json, например (0,0) тем самым задаю автотесту какими данными пользоваться.

@pytest.mark.parametrize("bin_index, iin_index",
            [
                (0, 0), (1, 1), (2, 2),
                (3, 3), (4, 4), (5, 5),
                (6, 6), (7, 7), (8, 8)
            ]
        )

То есть все эти цифры, это есть индексы к .json файлу, в котором прописаны данные пользователей. Если у Вас имеется возможность создать самому 100 аккаунтов, советую сразу реализовывать это с последующей записью в .json, из которого Вы будете тянуть эту информацию, дабы не писать это всё ручками))))

Сама функция позволяющая тянуть что-либо из json выглядит так:

def inf(name: str, index: int) -> dict:
    path = open(r'Полный путь к .json')
    data = json.load(path)
    j = data[name][index]
    return j

А обращение к этой функции выглядит так:

page.something(inf('bin', bin_index))

Почитайте про параметризацию в пайтесте Также советую все данные в проекте хранить в .json или xml, чтобы в будущем не нарваться на рутину с переписанием половины Ваших автотестов.

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