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