2009-05-26 16 views
1

ファイルパスを入力とし、長時間の処理後に出力を標準出力に書き出す外部プロセスを起動するソフトウェアをテストドライブする方法を理解しようとしていますファイル?この種の状況でテストを書く上で、いくつかの共通のパターンがありますか?テストで実際のツールを起動したり、結果を調べたりせずに、外部ツールの正しい使用状況を確認できる高速実行テストを作成するのは難しいです。外部コマンドラインツールを使用するソフトウェアをテストドライブする方法

答えて

5

外部プロセスをメモすることができます(http://en.wikipedia.org/wiki/Memoization)。 Rubyに入力ファイルのmd5の合計を計算し、それを既知のチェックサムのデータベースと照合するラッパーを記述します。一致する場合は、正しい出力をコピーします。それ以外の場合は、ツールを正常に呼び出します。

+0

興味深いアプローチ.. – JtR

+0

+1素敵な最適化のトリック。 – Gishu

2

外部プログラムが十分にテストされていると仮定して、プログラムが正しいデータを渡しているかどうかをテストするだけです。

+0

ツール自体からそのデータの結果を得ることなく、データが正しいことを確かめるのは難しいです。問題のツールを使用して同じ入力に対して結果が常に同じになるため、最初の実際の実行後にどのデータが渡されているかを確認するだけで十分です。 – JtR

3

あなたの境界までテストしてください。あなたの場合、境界は外部プログラムを呼び出すために構築するコマンドラインです(これは猿のパッチ適用で取得できます)。そのプログラムの標準出力に自分自身を貼り付ける場合(またはファイルを読み込んでその結果を処理する場合)は別の境界です。テストは、あなたのプログラムがその "入力"を処理できるかどうかです。

1

ユニットテストでよくある問題は、統合がうまくいくかどうかによって正確性が決まると思います。単体テストはどのように役立ちますか?

基本的な答えは、ユニットテストでは、コマンドラインツールに渡す予定のパラメータが実際に渡されていることをテストし、戻ってくると思われる結果が実際に処理する方法で処理されるということですそれら。

次に、実際のユーティリティが呼び出される機能レベルにある自動化されていてもいなくてもかまいません(可能であれば実用的かどうかに依存します)。あなたが渡そうとしているものと戻ってくるものが実際に何が起こっているのかを見ることができます。

仮説を確定する外部ツール(おそらく別のスケジュールで実行される、またはそれらのツールをアップグレードするときのみ)を「テストする」一連のテストには何も問題はありません。生の出力を取り戻すと主張します。そうすれば、ツールをアップグレードすると、あなたに影響を与える可能性のある動作の変更をキャッチすることができます。

これらのテストの最後のセットが価値あるものかどうかを判断する必要があります。それは非常に多くのツールに依存します。

3

90%のケースでは、外部コマンドラインツールを擬似して、正しい入力が2つのインターフェイス間の分割インターフェイスでそれらに渡されていることを確認します。これは、テストスイートを高速に保つのに役立ちます。また、「テスト中のコード」ではないため、コマンドラインツールを使用する必要はありません。コードの変更やコマンドの動作の変更によってユニットテストが失敗する可能性がありますラインユーティリティ。

しかし、あなたは「正しい入力」を定義するのに問題があるようです。この場合、Memoization(Daveの示唆)のような最適化を使用すると、両方の世界の利点が得られるかもしれません。

関連する問題