pytest 如何使用getoption和参数化两种方式

我有一个测试,可以在某个可执行文件上运行子进程并测试stdout结果。

所以我使用

#conftest.py
def pytest_addoption(parser):
    parser.addoption("--executable", action="store")


@pytest.fixture(scope="session", autouse=True)
def pass_executable(request):
    try:
        return request.config.getoption("--executable")
    except AttributeError:
        pass

这样,我就可以使用命令行参数来设置传递的可执行文件。我希望在我所有的测试中使用这个全局变量。然而,我在测试中遇到了麻烦,因为这些测试需要@pytest.mark.parametrize装饰器。所以我的解决方案是创建一个 test_update_path(pass_executable) 来更新一个全局变量PATH,这工作。

# test.py
PATH = 'defaultpath/app'


def test_update_path(pass_executable):
    global PATH 
    PATH = pass_executable
    print("Gloabl path is update to: ")
    print(PATH)

def test_1():
    # This will work 
    print("Now next")
    print(PATH)
    cmd = [PATH]
    stdout, stderr = run_subprocess(cmd)
    assert stdout == 'some expected result'


@pytest.mark.parametrize("args", [1, 2, 3])
def test_2(path, args):
    print("Now next")
    print(PATH)
    cmd = paramparser(PATH, args)
    stdout, stderr = run_subprocess(cmd)
    assert stdout == 'some expected result'

if __name__ == '__main__':
    pytest.main()

pytest --executable=newpath/app -s 会正常工作,但这是一个丑陋的黑客。更重要的是,它运行的测试并没有做任何实际的测试。 它也是有问题的,因为参数不是可选的。如果不设置–executable。路径将是一个 NoneType 而不是原来的默认路径。

请问有什么建议吗?

欣赏。

解决方案:

你不需要全局变量,只需要使用 request fixture作为测试参数来访问命令行参数,就像您在 pass_executable. 这就是我对这两个测试的修改方法。

def test_1(request):
    cmd = [request.config.getoption("--executable")]
    stdout, stderr = run_subprocess(cmd)
    assert stdout == 'some expected result'


@pytest.mark.parametrize("arg", [1, 2, 3])
def test_2(request, arg):
    cmd = paramparser(request.config.getoption("--executable"), arg)
    stdout, stderr = run_subprocess(cmd)
    assert stdout == 'some expected result'

如果你不喜欢这两个测试中的代码重复,把它提取到一个夹具中,并把它作为测试参数,就像内置的 request:

@pytest.fixture
def executable(request):
    return request.config.getoption("--executable")


def test_1(executable):
    cmd = [executable]
    stdout, stderr = run_subprocess(cmd)
    assert stdout == 'some expected result'


@pytest.mark.parametrize("arg", [1, 2, 3])
def test_2(executable, arg):
    cmd = paramparser(executable, arg)
    stdout, stderr = run_subprocess(cmd)
    assert stdout == 'some expected result'

给TA打赏
共{{data.count}}人
人已打赏
未分类

Laravel Nova App/Model在创建资源后没有找到.

2022-9-17 6:25:31

未分类

需要调取当月所有未缴费的学生名单

2022-9-17 6:25:33

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索