为主函数测试设置命令行参数



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

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

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

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

我在这里的另一个堆栈溢出帖子中找到了这个解决方案。

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'])

argparse.pyunittesting文件既使用此方法,也使用直接修改sys.argv的方法。

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

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

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

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

对于标志:

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

最新更新