2017-04-13 55 views
1

我有一个python中的main()函数,它获取命令行参数。 有没有办法让我为这个函数编写pytest测试并在代码中定义参数?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") 

回答

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文件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

2

我迄今发现的最好的解决办法是这样的

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

和标志:

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

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

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

这只适用于python3。对于python2来说,Mock库就可以实现。

我发现这个解决方案在不同的计算器后here