Как при помощи автотестов на python+selenium можно имитировать 100+ юзеров?
Задача: Масштабировать написанные автотесты (python + selenium) до 100 параллельных потоков. В каждом потоке должны прокидываться свои логин и пароль для юзера.
Цель: Имитировать поведение 100+ реальных юзеров на сайте. Нет цели снимать метрики и проводить нагрузочное тестирование в классическом понимании. Это скорее демонстрация для продукт-менеджеров.
Пробовал настроить Selenoid. Идея запускать каждый поток в отдельном контейнере подходит. Но не понятно как можно поднять сразу много браузеров одной версии при этом прокидывать в каждый контейнер свои логин и пароль.
Еще нашел Ggr (от создателей того же Selenoid), но пока не понятно подходит ли он для решения моей задачи.
Ответы (2 шт):
Вы можете запускать экземпляры браузера в несколько потоков при помощи модуля 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()
Рассмотрите, пожалуйста этот вариант. С использованием фрейма для автотестеров. Думаю данный опыт Вам всё равно не помешает
Прокидывать логин и пароль также реализуемо через фикстуру @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, чтобы в будущем не нарваться на рутину с переписанием половины Ваших автотестов.
Условно говоря лично я так пишу, может не правильно, может некрасиво, возможно я ошибаюсь, но как вариант рабочий, предлагаю строить свой фреймворк примерно таким образом.