2012-02-02 15 views
4

私は小さなコマンドラインアプリケーション(約6k行)を持っています。私はそれらを書く方法を知らなかったので、単体テストはありません。私は遡及的にいくつか追加しています。私はthis tutorialを読んでいますが、このモジュールを使ってアプリケーション全体をテストする方法については困惑しています。実際には、私がしたいことを「単体テスト」と呼んでいるかどうかはわかりません。回帰テストPythonのアプリケーション全体

特に、特定のパラメータでアプリケーションを実行すると、特定の出力ファイルが生成されます。これらの出力ファイルが変更されていないことを確認したい。すなわち

、自分のアプリケーションの次のコマンドライン呼び出し:

main.py config1.txt 100 15 
main.py config2.txt def 10 qa 
etc..... 

いくつかの小さな出力テキストファイル(< 10メガバイトごと)を作成し、名前の個々のフォルダ(1呼び出しあたりそれぞれ)、にそれらを置きますこうした:

output/config1.100.15.201202011733/ 
output/config2.def.10.qa.201202011733/ 
etc... 

各フォルダには、いくつかの小さなテキストファイル(< 10メガバイトごと)が含まれています。コードの変更が繰り返されるたびに、私は数十種類のコマンドラインパラメータでアプリケーションを実行し、出力ファイルが異なる場合に注意してください。 (理想的には、私はそれ以上のことをしたいと思います;例えば、いくつかの出力ファイルでは、それらをタブで区切られたテーブルと特定の主キーと比較して、行の順序が変わっても同等と評価されます。クリティカル)。

これを設定するにはどうすればよいですか?

答えて

11

ステップ1.アプリを2つに分割します。

  1. コマンドラインオプションを解析するoptparse(又は​​)を使用ピース。

  2. 本物の作品です。

「メイン」スクリプトは、パート1ですべてのオプションを取得し、パート2を呼び出して実際の作業を行います。

これは「テスト容易化設計」と呼ばれ、ユニットテストの重要な部分です。

ステップ2. 2つの部品があれば、実際の作業を行う部品をテストします。

ライトユニットテストスクリプトfrom the_app import the_function_or_class_that_does_real_work

テストその関数やクラスまたは何でもそれが実際の作業を行います。

class Test_With_File(TestCase): 
    def assertFileMatches(self, expected, actual, error=None): 
     # use difflib or whatever to compare the two files. 

class TestMain_Sample_File1(Test_With_File): 
    def test_should_produce_known_output(self): 
     with open("temp","w") as target: 
      the_function_that_does_real_work('config1.txt', arg2=100, arg3=15, out=target) 
     self.assertFileMatches("output/config1.100.15.201202011733", "temp") 

"TestMain_Sample_File1"クラスにバリエーションを書き込んで、興味深いものを多くのテストケースに含めることができます。

+1

S.Lottが言ったことは、次のようにも読むことができます。出力を検証するためにファイルを使用しないでください。リファクタリングして、関数の戻り値や副作用を確認するアプリケーションです。そして私は同意する。まだユニットテストではありません(アプリケーション全体がうまく動作していることを確認したいだけでなく、そのパーツやユニットを確認したい場合もありません)。 – pkoch

関連する問題