如何将灯具传递给pytest.mark.parameterize?

New*_*Guy 5 python pytest

我试图将三个不同的灯具传递给我的pytest.mark.parameterize装饰器,如下所示:

@pytest.mark.parametrize("credentials, return_code", [
    (user1, 200),
    #(user2, 200),
    #(user3, 401)
])
def test_login():
    assert True
# Actual test uses response.return_code == return_code
Run Code Online (Sandbox Code Playgroud)

但是,我收到的错误是:

NameError: name 'user1' is not defined
Run Code Online (Sandbox Code Playgroud)

这不正确,我已将其定义为conftest.py:

user1_info = [('user1', 'password')]
@pytest.fixture(params=user1_info)
def user1(request):
    return request.param
Run Code Online (Sandbox Code Playgroud)

如果我将测试更改为如下,则夹具可以工作:

def test_login(user1):
    assert True
# Actual test uses response.return_code == return_code
Run Code Online (Sandbox Code Playgroud)

问题是,如果我这样做,我必须编写三个单独的测试,每个测试一个,每个status_code检查.如果我可以使用parameterize,我可以使用一个函数并检查用户/预期的返回代码.

如何利用我的灯具是pytest.mark.parameterize装饰者的一部分?

dam*_*mon 6

要将fixture作为参数化参数传递,请将它们作为字符串引用并使用关键字参数indirect=True.

然后使用参数名称credentials和return_code测试函数的参数.

@pytest.mark.parametrize('credentials, return_code', [
  ('user1', 200),
  ('user2', 200),
  ('user3', 401),
], indirect=True)
def test_login(credentials, return_code):
    return True
Run Code Online (Sandbox Code Playgroud)

  • 这个例子似乎不完整。您仍然需要一个“credentials”固定装置,将字符串“userX”转换为“userX”对象。按原样运行此示例会导致“未找到固定装置'凭据'”错误消息。 (11认同)