gpt4 book ai didi

python - pytest 如何同时使用 getoption 和 parameterize

转载 作者:行者123 更新时间:2023-12-03 23:47:43 27 4
gpt4 key购买 nike

我已经测试在某些可执行文件上运行子进程并测试标准输出结果。

所以我用

#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

这样我就可以使用命令行 arg 来设置传递可执行文件。我希望将其用作所有测试中的全局变量。但是,我在需要 @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'

如果您不喜欢两个测试中的代码重复,请将其提取到一个fixture 中并将其用作测试参数,就像内置的 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'

关于python - pytest 如何同时使用 getoption 和 parameterize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61543761/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com