【发布时间】:2019-06-01 22:28:19
【问题描述】:
我正在尝试将参数从 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,这是不可取的。而48359957 和40880259 似乎更多地处理 pytest 的命令行参数,而不是将命令行参数传递给主代码。
我不需要 pytest 来获取命令行参数,参数可以在特定测试中硬编码。但是这些参数需要作为参数传递给主代码。你能给我一个 test_sample.py,它用一些参数调用 main.main() 吗?
【问题讨论】:
-
你可以使用猴子补丁。
def test_case01(monkeypatch): with monkeypatch.context() as m: m.setattr(sys, 'argv', ['my', 'dummy', 'args']); main()。在上下文块中,sys.argv列表使用您的值进行了猴子补丁。 -
你在测试哪个 - 命令行界面,或者它背后的代码 - 使用解析的
args的函数和类? -
@hpaulj:我正在测试使用已解析参数的函数。
-
@hoefling:我已经接受了另一个答案,它对我来说只需最少的代码更改。但是我没看懂你的评论,能否给你补充一个详细的答案,以便我以后可以使用你的解决方案?
标签: python-3.x pytest argparse