2017-04-13 766 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_argsargvパラメータを取ります。ドキュメントは、それの例

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.pyためunittestingファイルは、このアプローチ、および直接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ライブラリがそのトリックを行います。

このソリューションは、別のstackoverflow投稿hereで見つかりました。

関連する問題