gpt4 book ai didi

python-3.x - 如何将命令行参数从pytest传递给代码

转载 作者:行者123 更新时间:2023-12-01 00:14:40 25 4
gpt4 key购买 nike

我正在尝试将参数从 pytest 测试用例传递给正在测试的模块。例如,使用 Python boilerplate 中的 main.py ,我可以从命令行运行它:

$ python3 main.py
usage: main.py [-h] [-f] [-n NAME] [-v] [--version] arg
main.py: error: the following arguments are required: arg
$ python3 main.py xx
hello world
Namespace(arg='xx', flag=False, name=None, verbose=0)

现在我正在尝试对 pytest 做同样的事情,使用以下 test_sample.py

( 注意: main.py 需要命令行参数。但是这些参数需要在特定测试中硬编码,它们不应该是 pytest 的命令行参数。pytest 测试用例只需将这些值发送为main.main() 的命令行参数。)
import main
def test_case01():
main.main()
# I dont know how to pass 'xx' to main.py,
# so for now I just have one test with no arguments

并将测试运行为:
pytest -vs test_sample.py

这将失败并显示错误消息。我试图查看其他答案以获得解决方案,但无法使用它们。例如, 42778124建议创建一个单独的文件 run.py,这是不可取的。和 4835995740880259似乎更多地处理 pytest 的命令行参数,而不是将命令行参数传递给主代码。

我不需要 pytest 来获取命令行参数,参数可以在特定测试中硬编码。但是这些参数需要作为参数传递给主代码。你能给我一个 test_sample.py,它用一些参数调用 main.main() 吗?

最佳答案

如果您无法修改 main 的签名方法,您可以使用 monkeypatching用测试数据临时替换参数的技术。示例:想象为以下程序编写测试:

import argparse


def main():
parser = argparse.ArgumentParser(description='Greeter')
parser.add_argument('name')
args = parser.parse_args()
return f'hello {args.name}'


if __name__ == '__main__':
print(main())

从命令行运行它时:
$ python greeter.py world
hello world

测试 main带有一些自定义数据的函数,monkeypatch sys.argv :
import sys
import greeter

def test_greeter(monkeypatch):
with monkeypatch.context() as m:
m.setattr(sys, 'argv', ['greeter', 'spam'])
assert greeter.main() == 'hello spam'

parametrizing 结合使用时技术,这允许在不修改测试函数的情况下轻松测试不同的参数:
import sys
import pytest
import greeter

@pytest.mark.parametrize('name', ['spam', 'eggs', 'bacon'])
def test_greeter(monkeypatch, name):
with monkeypatch.context() as m:
m.setattr(sys, 'argv', ['greeter', name])
assert greeter.main() == 'hello ' + name

现在你得到三个测试,每个参数一个:

$ pytest -v test_greeter.py

...

test_greeter.py::test_greeter[spam] PASSED
test_greeter.py::test_greeter[eggs] PASSED
test_greeter.py::test_greeter[bacon] PASSED

关于python-3.x - 如何将命令行参数从pytest传递给代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54071312/

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