pytest:设置主要功能测试的命令行参数

时间:2017-04-13 10:39:32

标签: pytest argparse

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

e.g。

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")

3 个答案:

答案 0 :(得分:5)

要添加到先前的答案,而不是修改sys.argv使用可以掩盖和保护底层对象的上下文管理器更安全。一个例子是

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

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

我在另一个stackoverflow帖子here上找到了这个解决方案。

答案 1 :(得分:3)

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的{​​{1}}文件同时使用这种方法,并直接修改argparse.py

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

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

答案 2 :(得分:2)

我到目前为止找到的最佳解决方案是

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

和标志:

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