Параметризация тестов

Как параметризуются тесты?

подробнее

Тесты параметризуются 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