pytest中params中fixture的输出

output of fixture in params in pytest

我今天坐下来更好地学习 py.test,发现带有文档的站点已关闭 (pytest.org),所以如果在那里找到这个问题的答案,我深表歉意。

我想做的是将两个灯具的输出传递给参数化,如下所示:

import pytest

@pytest.fixture()
def make_1():
    return 1

@pytest.fixture()
def make_2():
    return 2

@pytest.mark.parametrize('arg', [make_1, make_2])
def test_main(arg):
    assert isinstance(arg, int)

但是测试失败了,因为没有将固定装置的输出分配给参数 "arg",而是传递了固定装置(函数)本身。

如何以这种方式参数化各种灯具的输出?

这个 [ugly/massive hack] 会成功吗?我很欣赏它远非理想 - 我不知道是否有办法创建一个 lazy-evaluated 夹具,让你做你想做的事。

import pytest

@pytest.fixture
def make_1():
    return 1

@pytest.fixture
def make_2():
    return 2

@pytest.fixture
def all_makes(make_1, make_2):
    return (make_1, make_2)

def _test_thing(make):
    # Run your test
    pass

def test_main(all_makes):
    for make in all_makes:
        try:
            _test_thing(make)
        except AssertionError:
            print "Failed for make {}".format(make)
            raise

一个可能更好的选择可能是参数化夹具本身(如果可能的话)——参考文档:https://pytest.org/latest/fixture.html#parametrizing-a-fixture

@pytest.fixture(params=[1, 2])
def make(request):
    return request.param

def test_make(make):
    # Run your test
    pass

如果您的不同 'make' 固定装置是 super-different,您可能有类似的东西:

def build_make_1():
    return 1

def build_make_2():
    return 2

@pytest.fixture(params=[build_make_1, build_make_2])
def make(request):
    return request.param()

def test_make(make):
    # Run your test
    pass