在parametriz中使用fixture作为参数的pytest

2024-05-14 22:51:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用fixture作为pytest.mark.parametrize的参数或具有相同结果的参数。

例如:

import pytest
import my_package

@pytest.fixture
def dir1_fixture():
    return '/dir1'

@pytest.fixture
def dir2_fixture():
    return '/dir2'

@pytest.parametrize('dirname, expected', [(dir1_fixture, 'expected1'), (dir2_fixture, 'expected2')]
def test_directory_command(dirname, expected):
    result = my_package.directory_command(dirname)
    assert result == expected

fixture param s的问题是,fixture的每个参数在每次使用时都会运行,但我不希望这样。我想能够选择哪些设备将使用取决于测试。


Tags: importpackage参数returnpytestmydeffixture
3条回答

如果您使用的是Pytest3.0或更高版本,我认为您应该能够通过沿着以下几行编写一个fixture来解决这个特定的场景:

@pytest.fixture(params=['dir1_fixture', 'dir2_fixture'])
def dirname(request):
    return request.getfixturevalue(request.param)

这里的文档: http://doc.pytest.org/en/latest/builtin.html#_pytest.fixtures.FixtureRequest.getfixturevalue

但是,如果试图动态加载的设备是参数化的,则不能使用此方法。

或者,您可以使用pytest_generate_tests钩子找出一些问题。不过,我还没来得及调查那么多。

pytest当前不支持此操作。但是有一个开放的特性请求:https://github.com/pytest-dev/pytest/issues/349

目前,我唯一的解决方案是创建一个fixture,返回fixture字典。

import pytest
import my_package

@pytest.fixture
def dir1_fixture():
    return '/dir1'

@pytest.fixture
def dir2_fixture():
    return '/dir2'

@pytest.fixture
def dir_fixtures(
    dir1_fixture,
    dir2_fixture
    ):
    return {
        'dir1_fixture': dir1_fixture,
        'dir2_fixture': dir2_fixture
    }

@pytest.mark.parametrize('fixture_name, expected', [('dir1_fixture', 'expected1'), ('dir2_fixture', 'expected2')]
def test_directory_command(dir_fixtures, fixture_name, expected):
    dirname = dir_fixtures[fixture_name]
    result = my_package.directory_command(dirname)
    assert result == expected

不是最好的,因为它不使用pytest中内置的解决方案,但它对我有效。

相关问题 更多 >

    热门问题