Параметризация тестов
Как параметризуются тесты?
подробнее
Тесты параметризуются 2-я способами:
- Через фикстуру
@pytest.fixture(params=[...])подробнее (параметризация-фикстур) - Через декоратор
@pytest.mark.parametrize("имя_аргумента/ов", [список значений/кортежей_значний])
Пример:@pytest.mark.parametrize("x, y", [(1, 2), (3, 4)])
Параметризация тестов через декоратор
@pytest.mark.parametrizeсоздаёт отдельный тест для каждого значения.
Комбинирование параметров
подробнее
Если повесить два декоратора
parametrizeна один тест, pytest создаст декартово произведение (каждый с каждым).
Пример
@pytest.mark.parametrize("user", ["admin", "guest"])
@pytest.mark.parametrize("page", ["home", "login"])
def test_access(user, page):
# Будет 4 теста: admin-home, admin-login, guest-home, guest-login
...
Как изменить имена тестов при параметризации?
подробнее
Используется параметр
idsсо списком строк или с функцией. Если функция вернетNone- то Pytest возьмётIDпо умолчанию. И стоит в этом случае возвращать короткие строки. В отчёте вместоtest_func[1-2]будетtest_func[success_case].
Примеры
@pytest.mark.parametrize(
"user, status",
[("admin", 200), ("guest", 403), ("banned", 403)],
ids=["ADMIN_ACCESS", "GUEST_FORBIDDEN", "BANNED_FORBIDDEN"]
)
def test_access(user, status):
assert get_response(user) == status
# В консоли: test_access[ADMIN_ACCESS], test_access[GUEST_FORBIDDEN] и т.д.
# Пример передачи функции в ids
def make_id(val):
return f"UserType:{val}"
@pytest.mark.parametrize("user", ["admin", "guest", "root"], ids=make_id)
def test_login(user):
pass