Я вот сказал, что лучше, чем в pytest, параметризацию вряд ли получится сделать. Давайте немного расскажу, почему она хороша:

  • Pytest на этапе импорта тестов знает, сколько будет кейсов. Это помогает оценивать время работы, лучше распараллеливать тесты с pytest-xdist и всё такое. Со всякими менеджерами контекста и циклами такого не добиться.
  • Это не добавляет вложенности. В питоне код часто пытается убежать вправо, и если есть возможность не добавлять отступов, стоит этим воспользоваться.
  • Туда можно передать переменную с кейсами, которая создаётся где-то ещё. Причём у меня даже был интересный случай, когда в parametrize передавалась переменная со списком правил валидации чего-то там, а сам тест проверял, что каждое правило покрыто отдельным тестом. Тест для тестов 🙃

Так что если прям сильно не нравится, что выходит какой-то страшный длинный декоратор, просто создайте отдельную переменную, и всё будет отлично:

  ...,
  ...,
)

@pytest.mark.parametrize('given, expected', USER_CASES)
def test_user(given, expected):
    ...```