2012-04-12 38 views
2

私はコマンドライン引数を受け付けるモジュールのunittestを書いています。私はモジュールでoptparseを使ってargsを受け入れました。あるpythonモジュールから別のpythonモジュールにコマンドライン引数を渡す方法

私が直接モジュールを実行するときだから、僕は入力します。 -

module.py -e 42 -g 84 

これまでのところ、私のユニットテストでは、私は単に、特定のメソッド呼び出してテストするモジュールのインスタンスを作成します -

instance = module.className() 
instance.method() 

unittestのような別のモジュールからcommand.py argsをmodule.pyに渡す方法を教えてもらえますか?

私のunittestでoptparseを使用していますが、何とかmodule.pyのインスタンスを生成するときに組み込みますか?

ありがとうございます。

+2

なぜモジュールのコマンドラインインターフェイスをテストする必要があると思いますか? optparseのテストはあなたの仕事ではなく、あなたのフラグを指定するときに間違って行うことはほとんどありません。また、アプリケーション全体をエントリポイントから終了値まで実行すると、単体テストではありません。 – delnan

+0

@delnan返事をありがとう。申し訳ありませんが、私はまったくフォローしません。私はoptparseをテストしようとはしていないので、unittestから特定のフラグ値をモジュールに渡す方法を知りたいので、コマンドラインから呼び出されたかのように効果的にモジュールをテストします。モジュールは、コマンドライン値を操作する必要があります。 – user788462

+0

コードをテストする場合は、コマンドライン引数を指定してコードをテストし、コードをテストするのではなく、コードをテストします。これは簡単で詳細な情報を提供します。たとえば、結果を計算する際に役割を果たす関数が2つある場合は、それぞれを個別にテストします。または、少なくともそれを単体テストと呼ぶのをやめてください。 – delnan

答えて

2

は、あなただけのリストsys.argvを変更する必要が代わりに呼び出す関数を呼び出しsys.argvの

3を必要に応じて(そしておそらくworkalikeベクトル))の周りに渡しましたコマンドライン引数のリストを表します。このリストはPythonインタプリタにとってはグローバルなので、渡す必要はありません。

import sys 
from optparse import OptionParser 

parser = OptionParser() 
parser.add_option("-e") 
parser.add_option("-g") 

print sys.argv # unmodified 
(options, args) = parser.parse_args() 
print (options, args) 

sys.argv = ['module.py','-e','42','-g','84'] # define your commandline arguments here 

(options, args) = parser.parse_args() 
print (options, args) 

注:​​に可能なスイッチが(:http://docs.python.org/library/argparse.html#module-argparseを参照)ので、もしはOptionParserモジュールが推奨されていません。必要なのはPython 2.7だけです。

+0

ありがとうマッシュ、それは私が後にした答えです。私はsys.argvがコマンドライン引数を実装するための変更可能な関数であることに気づいていませんでした。シンプルにするために、sys.argvは、複数のモジュールに関連する複数のコマンドライン入力を格納できるグローバル関数です。 – user788462

1

3つの選択肢:

1)いくつかのシェルを使用して、代わりに100%のPythonに固定の。

2)あなたのコマンドラインオプションのディスパッチャが

+0

返事をありがとう。 Python unittestでshellを使うことは可能ですか?申し訳ありませんが、合理的にPythonに新しいので、それを知らないです。私は単体テスト内にすべてのコードを保管したいと思います。私はsys.argvをどうやって渡すのか分かりませんが、それを読むでしょう。 optparseは、モジュールがインスタンス化されたときに呼び出されるmodule.pyのinitで定義され、定義されます。それはあなたが意味することですか? – user788462

関連する問題