5

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

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

つまり、私のアプリケーションの次のコマンドライン呼び出し:

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

いくつかの小さな出力テキストファイル(それぞれ<10 MB)を作成し、次のような名前の個別のフォルダー(呼び出しごとに1つ)に配置します。

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

各フォルダには、いくつかの小さなテキストファイル(それぞれ<10MB)が含まれています。コードを変更するたびに、数十のコマンドラインパラメーターを使用してアプリケーションを実行し、出力ファイルが異なる場合に注意したいと思います。(理想的には、それ以上のことをしたいと思います。たとえば、一部の出力ファイルについては、特定の主キーを持つタブ区切りのテーブルとして比較し、行の順序が変更された場合でも同等と評価されるようにします。ただし、そうではありません。致命的)。

これを設定する良い方法は何ですか?

4

1 に答える 1

12

手順1.アプリを2つに分割します。

  1. コマンドラインオプションを解析するためにoptparse(または)を使用する部分。argparse

  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」クラスのバリエーションを記述して、興味のあるテストケースをいくつでもカバーできます。

于 2012-02-02T02:24:44.193 に答える