Как передать параметры в фикстуру pytest

Есть вариант как можна передать параметры в фикстуру не используя вложеную функцию?

@pytest.fixture
def my_fixture():

  def _method(a, b):
    return a*b

  return _method

def test_me(my_fixture):
  result1 = my_fixture(2, 3)
  assert result1 == 6

  result2 = my_fixture(4, 5)
  assert result2 == 20

Вот такой вариант я знаю, но он не очень подходит, по другому можно как то?

У вас неправильное понятие о том зачем нужна фиктура, в вашем примере подойдет для такого любая функция. Фикстура же должна, например, готовить тестовый стенд или открывать коннект к базе и тд, но не тупо исполнять код с аргументами из тестов. Исполняться она должна до теста и содержать в себе результат ее работы. А передать в нее параметры для реализации логики можно хоть в параметризации к тесту, хоть маркером к нему же.

1 лайк

У меня обыкновенная фикстура на логин, и я не хочу писать о 10 фикстур под 10 ролей которые будут отличатся только емейл и паролем, вот для этого я и хочу переменную.

В вашем случае стоит завести yaml файл с конфигурациями юзеров:

user1:
  login: email1@test.com
  pass: Password1
user2:
  login: email2@test.com
  pass: Password2
...
userN:
  login: emailN@test.com
  pass: PasswordN

И далее фикстуру:

@pytest.fixture()
def user_session(request):
    username = request.node.get_closest_marker('session').args[0]
    return session(username)

где session - функа на сессию юзера, в API это может быть requests.Session, в UI это может быть залогиненый на сайте юзер. Реализовать ее вам нужно самому. Ну и тест будет выглядеть примерно так:

@pytest.mark.session("user1")
def test_1(user_session):
    pass

То есть в тест вы получите сессию юзера, указанного в маркере.

2 лайка

Передача параметров командной строки в PyTest.