2017-04-13 139 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