pytest:如何传递值并从命令行创建测试夹具?

时间:2015-09-24 19:09:34

标签: python testing pytest

我有一个简单的测试,如下所示:

# contents of test_example
def test_addition(numbers):

    assert numbers < 5

以下是我的最烦恼

# contents of conftest
import pytest

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

但是现在我想测试数字5和6但不必明确硬编码。在命令行上,我想用数字5和6覆盖数字测试夹具,以便:

py.test test_example.py --numbers=[5, 6]

我希望上面调用的结果用我在命令行创建的测试夹具覆盖conftest数字测试夹具,并且仅在5和6上运行test_addition()。

我将如何做到这一点?

1 个答案:

答案 0 :(得分:2)

阅读here你可以

tests/conftest.py

def pytest_addoption(parser):
    parser.addoption("--numbers", action="store", dest="numbers",
                 default="1,2,3,4")

def pytest_generate_tests(metafunc):
    if 'number' in metafunc.fixturenames:
        metafunc.parametrize("number", metafunc.config.option.numbers.split(','))

tests/test_1.py

def test_numbers(number):
    assert number

这样:

$ py.test tests/ -vv
=========================================
collected 4 items

test_1.py::test_numbers[1] PASSED
test_1.py::test_numbers[2] PASSED
test_1.py::test_numbers[3] PASSED
test_1.py::test_numbers[4] PASSED

$ py.test tests/ -vv --numbers=10,11
=========================================
collected 2 items

test_1.py::test_numbers[10] PASSED
test_1.py::test_numbers[11] PASSED

无论如何请注意here

  

警告:

     

此函数必须在插件中实现,并在测试运行开始时调用一次。

     

强烈建议不要在conftest.py文件中实现此挂钩,因为conftest.py文件被延迟加载并且可能会出现奇怪的未知选项错误,具体取决于调用目录py.test。

所以如果你运行

这个代码是有效的
py.test tests/

但不是

cd tests
py.test