如何对参数列表中的每个项目运行 pytest 测试

FBi*_*idu 6 python testing pytest

假设我有一个 HTTP URL 列表,例如

endpoints = ["e_1", "e_2", ..., "e_n"]
Run Code Online (Sandbox Code Playgroud)

我想运行n测试,每个端点一个。我怎样才能做到这一点?

一次测试所有端点的简单方法是

def test_urls():
    for e in endpoints:
        r = get(e)
        assert r.status_code < 400
Run Code Online (Sandbox Code Playgroud)

或类似的东西。但正如您所看到的,这是针对所有n端点的一次测试,我希望比这更详细一些。

我尝试过使用类似的固定装置

@fixture
def endpoint():
    for e in endpoints:
        yield e
Run Code Online (Sandbox Code Playgroud)

但是,显然,Pytest 并不真正喜欢固定装置中的“多次产量”并返回yield_fixture function has more than one 'yield'错误

hoe*_*ing 9

按照参数化夹具和测试函数中的示例,您可以将测试实现为:

import pytest

endpoints = ['e_1', 'e_2', ..., 'e_n']

@pytest.mark.parametrize('endpoint', endpoints)
def test_urls(endpoint):
    r = get(endpoint)
    assert r.status_code < 400
Run Code Online (Sandbox Code Playgroud)

这将运行test_urls n一次,每个端点一次:

test_spam::test_urls[e_1] PASSED
test_spam::test_urls[e_2] PASSED
...
test_spam::test_urls[e_n] PASSED
Run Code Online (Sandbox Code Playgroud)