为主功能测试设置命令行参数

问题描述 投票:0回答:4

我在 python 中有一个 main() 函数,它获取命令行参数。 有没有办法让我为这个函数编写 pytest 测试并在代码中定义参数?

例如

def main():
    # argparse code
    args, other = arg_parser.parse_known_args()
    return args.first_arg


def test_main():
    res = main() # call with first_arg = "abc"
    assert(res == "abc")
python pytest argparse
4个回答
16
投票

添加到前面的答案,而不是修改

sys.argv
使用可以掩盖和保护底层对象的上下文管理器更安全。一个例子是

with unittest.mock.patch('sys.argv', ['program_name', '--option1', 'inputFile']):
    main()

这只适用于 python3。对于 python2,Mock 库可以解决这个问题。

我在不同的 stackoverflow 帖子这里找到了这个解决方案。


7
投票

parse_args
采用
argv
参数。文档在示例中重复使用了这一点

parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='store_true')
parser.add_argument('bar')
parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])

字符串列表复制从命令行获取的

sys.argv[1:]
。如果参数是
None
(或省略),则解析器使用
sys.argv[1:]

那么如果

def main(argv=None):
    # argparse code
    args, other = arg_parser.parse_known_args(argv)
    return args.first_arg

你可以测试

main(['foo', '-f','v'])

unittesting
argparse.py
文件使用了这种方法,以及直接修改
sys.argv
的方法。

https://docs.python.org/3/library/argparse.html#beyond-sys-argv

https://docs.python.org/3/library/argparse.html#partial-parsing


5
投票

到目前为止我发现的最好的解决方案是这个

def test_main():
    sys.argv = ["some_name", "abc"]
    res = main()

对于旗帜:

sys.argv.append("-f")
sys.argv.append("v")

0
投票

对于entrypoint.py,添加额外参数可能特别简单。在这种情况下

--disable-warnings

import sys

import pytest


if __name__ == "__main__":
    exit_code = pytest.main(sys.argv[1:] + ["--disable-warnings"])

© www.soinside.com 2019 - 2024. All rights reserved.