由conftest.py中的cmdline选项生成的列表的测试的Pytest参数化

时间:2019-02-09 03:44:05

标签: python-3.x pytest

  

我正在尝试参数化由   conftest.py中的cmdline选项。

#!/usr/bin/env python

import pytest
import test



def pytest_addoption(parser):
    parser.addoption("--low", action="store", type=int, help="low")
    parser.addoption("--high", action="store",type=int,  help="high")


@pytest.fixture(scope="session", autouse=True)
def user(request):
    return request.config.getoption("low")


@pytest.fixture(scope="session", autouse=True)
def rang(request):
    return request.config.getoption("high")




#test_file.py

def data(low, high):
    return list(range(low, high))

@pytest.mark.parametrize("num", data(10, 20))
def test(num):
    assert num < 1000

我想运行类似“ pytest --low = 10 --high = 100 test_file.py”的命令。对于@x和y之间的值范围,使用@ pytest.mark.parametrize(“ num”,data(x,y))可以正常工作。除了低和高之外,我不想在参数化中提供任何值。如果我编写类似@ pytest.mark.parametrize(“ num”,data(low,high))之类的代码,则会引发错误。有什么办法可以使我完成这项参数化工作?我知道当我们在方法外部生成列表时代码可以工作。但是我想写一种生成列表并在参数化中使用该列表的方法。

有什么办法可以在test_file.py中的任何地方访问这些高低cmdline选项吗?

1 个答案:

答案 0 :(得分:0)

您可以使用pytest_generate_tests挂钩对测试进行参数化。有了这个钩子,您将可以访问命令行args。

# conftest.py
def pytest_addoption(parser):
    parser.addoption("--low", action="store", type=int, help="low")
    parser.addoption("--high", action="store",type=int,  help="high")


def pytest_generate_tests(metafunc):
    if 'num' in metafunc.fixturenames:
        lo = metafunc.config.getoption('low')
        hi = metafunc.config.getoption('high')
        metafunc.parametrize('num', range(lo, hi))


# test_file.py

def test_spam(num):
    assert num

另一种可能性是通过pytest.config访问args,尽管请注意,这是一个已弃用的功能,将很快删除:

import pytest


def data():
    lo = pytest.config.getoption('low')
    hi = pytest.config.getoption('high')
    return list(range(lo, hi))


@pytest.mark.parametrize('num', data())
def test_spam(num):
    assert num