Я понимаю, что так можно. Наиболее весомым аргументом для меня является то, что фикстура должна быть подготовкой, а не хелпером. Если сравнить минусы моего варианта с минусами варианта Тишки:
Вариант Тишки(хелпер в отдельном файле, дёргает его фикстура):
- Фикстура использующая этот хелпер может дёргаться только из теста, соответственно нельзя использовать хелпер в другом хелпере, а если попытаться под это сделать ещё фикстуры - мы придём как раз к тому самому нагромождению и излишней унификации.
- Всё раскидано на файлы
conftest.py и
misc.py(например).
- 10 часто использующихся хелперов == 10 передач фикстур для их выполнения в каждый тест... Конечно можно сделать класс с огромным количеством хелперов и передавать его инстанс, но в этом есть свои минусы(см. конец текста с примером).
Вариант мой(с
inspect'ом):
- В коде хелпера мы жёстко привязываемся к имени фикстуры.
Теперь плюсы второго варианта:
- Мы импортируем хелпер в файл с тестами и просто дёргаем его
- Можем использовать где угодно... Пример: 30 из 100 тестов начинаются с 3 одинаковых запросов для достижения определённого состояния, это можно легко вынести в отдельный файл
repeatable_steps.py(например) и использовать функцию
send_request 3 раза(с фикстурой так не выйдет)
- На уровне файла с тестами идёт импорт хелперов и потом их банальное использование.. Напомню: моей задачей было избежать регулярный проброс большого количества фикстур в вспомогательные функции для тестов - оба варианта с этим справляются, но вариант Тиши приводит к регулярному пробросу фикстур в тест-кейсы.
Пример, где второй вариант поведёт себя лучшим образом.
код хелпера:
async def send_request(
from_: aiohttp.test_utils.TestServer,
data: dict,
query: dict = None,
path: str = None,
method: str = 'GET'
):
service = get_fixture_by_name('service')
clt = get_fixture_by_name('client')
# get specific route+hdrs for req
# do req: specific stub -> testing service
В
conftest.py 11 заглушек, с которыми общается тестируемый сервис. С этой функцией мы передаём только заглушку и она может быть любой.