Добрый день! Есть необходимость после завершения теста регистрации пользователя удалять только что созданного пользователя. Проблема заключается в том, что функции удаления необходимо передавать логин/пароль для удаления а он генерируется рандомно, и вызвать фикстуру с нужными параметрами у меня не получатся. Подскажите как действовать в таком случае:
фикстура
логин это номер телефона и генерируется рандомно перед началом теста (далее заполняет все поля через интерфейс и регистрируется - после успешной регистрации пользователь авторизуется автоматически) и заранее знать я не могу какой логин, для этого мне и нужно его передать в тердаун!
Понимаю вас, вы еще можете столкнуться с массой таких ситуаций и решите это одним способом - сделайте себе тест-менеджер в синглтоне и собирайте в него то, что вам нужно. К примеру:
class PyTestManager:
delete_user = {} # Конфигурация юзера для удаления
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(PyTestManager, cls).__new__(cls)
return cls.instance
И далее в тесте заполните delete_user свойство и воспользуйтесь им в фикстуре. Плюс в этом тест-менеджере вы можете заполнить еще кучу полезных переменных.
фикстура сама генерировала рандомного пользователя, хранила его данные и выдавала в тест его.
после теста (после yield) проходимся по массиву пользователей (есть все данные: логины пароли) и удаляем.
выглядит примерно так:
@pytest.fixture(scope="function")
def arrange_user():
users = [] # здесь храним созданных пользователей в течение теста (кстати можно в таком случае и для сессии\модуля это делать)
def generate_user(**kwargs):
user = ... # тут ваша логика по созданию пользователя. если нужно какого-то специфичного сгенерировать - можно через kwargs пробросить параметры
users.append(user)
return user
yield generate_user # вместо пользователя возвращается функция для генерации пользователя, но зато можно генерировать несколько и кастомых
# тут удаляем
for u in users:
delete_user(u.login, u.password)
в тесте вызов генерации пользователя выглядит так:
female_user = arrange_user(sex='female')
# можно создавать сколько хочешь и каких хочешь - сами удалятся в конце теста
Раньше тоже думал что удаление пользователя после теста - обязательный тирдаун. Ан нет, общался с лидами разных компаний и почти все в один голос говорят - не удаляйте юзера после прохождения теста, особенно после его падения. И решил всегда создавать юзера с определенным префиксом чтобы потом просто почистить базу. В вашей же реализации вы будете чистить всех, даже тех на котором тест упал. Но это уже от проекта зависит наверное.
По поводу удаления согласен, но это же вопрос одного if - проверил статус теста и удалил если passed. Я отвечал в первую очередь на топик стартер.
Либо ещё мне нравится вариант, когда очищаешь перед прогоном, а не после. Так выглядит даже логичнее - если на том же окружении пытаешься ещё раз запустить тесты, то старые результаты уже не нужны точно.
Можно ключиками при запуске конфигурировать - для временных окружений, которые после тестов удаляются, смысла чистить нет, только время тратить, а для стейдж лайк энвов оставляешь данные от упавших тестов. Но это всё опять же зависит от конкретного проекта, задач, процессов и сложностей в реализации не представляет.
Да, такое тоже реализовывал как то. Особенно это актуально для проектов с регистрацией по смс, когда ты не можешь себе позволить много юзеров и удаляешь перед тестом уже имеющегося в базе.