ファイルパスを入力とし、長時間の処理後に出力を標準出力に書き出す外部プロセスを起動するソフトウェアをテストドライブする方法を理解しようとしていますファイル?この種の状況でテストを書く上で、いくつかの共通のパターンがありますか?テストで実際のツールを起動したり、結果を調べたりせずに、外部ツールの正しい使用状況を確認できる高速実行テストを作成するのは難しいです。外部コマンドラインツールを使用するソフトウェアをテストドライブする方法
答えて
外部プロセスをメモすることができます(http://en.wikipedia.org/wiki/Memoization)。 Rubyに入力ファイルのmd5の合計を計算し、それを既知のチェックサムのデータベースと照合するラッパーを記述します。一致する場合は、正しい出力をコピーします。それ以外の場合は、ツールを正常に呼び出します。
外部プログラムが十分にテストされていると仮定して、プログラムが正しいデータを渡しているかどうかをテストするだけです。
ツール自体からそのデータの結果を得ることなく、データが正しいことを確かめるのは難しいです。問題のツールを使用して同じ入力に対して結果が常に同じになるため、最初の実際の実行後にどのデータが渡されているかを確認するだけで十分です。 – JtR
あなたの境界までテストしてください。あなたの場合、境界は外部プログラムを呼び出すために構築するコマンドラインです(これは猿のパッチ適用で取得できます)。そのプログラムの標準出力に自分自身を貼り付ける場合(またはファイルを読み込んでその結果を処理する場合)は別の境界です。テストは、あなたのプログラムがその "入力"を処理できるかどうかです。
ユニットテストでよくある問題は、統合がうまくいくかどうかによって正確性が決まると思います。単体テストはどのように役立ちますか?
基本的な答えは、ユニットテストでは、コマンドラインツールに渡す予定のパラメータが実際に渡されていることをテストし、戻ってくると思われる結果が実際に処理する方法で処理されるということですそれら。
次に、実際のユーティリティが呼び出される機能レベルにある自動化されていてもいなくてもかまいません(可能であれば実用的かどうかに依存します)。あなたが渡そうとしているものと戻ってくるものが実際に何が起こっているのかを見ることができます。
仮説を確定する外部ツール(おそらく別のスケジュールで実行される、またはそれらのツールをアップグレードするときのみ)を「テストする」一連のテストには何も問題はありません。生の出力を取り戻すと主張します。そうすれば、ツールをアップグレードすると、あなたに影響を与える可能性のある動作の変更をキャッチすることができます。
これらのテストの最後のセットが価値あるものかどうかを判断する必要があります。それは非常に多くのツールに依存します。
90%のケースでは、外部コマンドラインツールを擬似して、正しい入力が2つのインターフェイス間の分割インターフェイスでそれらに渡されていることを確認します。これは、テストスイートを高速に保つのに役立ちます。また、「テスト中のコード」ではないため、コマンドラインツールを使用する必要はありません。コードの変更やコマンドの動作の変更によってユニットテストが失敗する可能性がありますラインユーティリティ。
しかし、あなたは「正しい入力」を定義するのに問題があるようです。この場合、Memoization(Daveの示唆)のような最適化を使用すると、両方の世界の利点が得られるかもしれません。
- 1. EFで共有する外部キーを使用する方法
- 2. 外部キーを使用してオブジェクトを選択する方法
- 3. pythreejsを使用して外部ジオメトリをインポートする方法
- 4. Javaコード内から外部ソフトウェアのGUIを処理する方法
- 5. フラッシュのプリローダーとして外部swfを使用する方法
- 6. hubpiplelineの外部でSignalRハブインスタンスを使用する方法
- 7. 外部リンクに$ ionicLoading.show()を使用する方法
- 8. AS2の外部swfからSharedObjectを使用する方法
- 9. 外部jspファイルをオーバーレイとして使用する方法
- 10. sencha touch2で外部Webサービスを使用する方法
- 11. マイクロコントローラで外部メモリを使用する方法
- 12. Eclipseのウォッチ式で外部クラスを使用する方法
- 13. 変数に外部JavaScriptスクリプトを使用する方法は?
- 14. extbase/fluidに外部データベースを使用する方法
- 15. Dictionary <>をLinqと外部で使用する方法は?
- 16. フラグメント内で外部ライブラリを使用する方法は?
- 17. CMakeプロジェクトで外部DLLを使用する方法
- 18. codeigniterのアクティブなレコードで外部データベーステーブルを使用する方法
- 19. ブラックベリー・エクリプス・プラグインで外部jarファイルを使用する方法
- 20. コマンドラインツールをサンドボックスにする方法は?
- 21. コマンドラインツールをそのまま使用する
- 22. javascriptを使用して外部部門を削除する方法
- 23. Apache Igniteで外部キーを使用してWrite-behindを使用する方法
- 24. キーボードのフックを外してC#を使用してキーストロークを変更するソフトウェアを開発する方法
- 25. cを使用して外部アプリケーションを閉じる方法
- 26. PIGを使用して外部jarファイルを含める方法
- 27. Chromeでソフトウェアwebgl engineを使用する方法18
- 28. コマンドラインツールsqlite3を使用してメモリ内SQLiteデータベースをブラウズする方法
- 29. 外部ジャーを使用するユーザーライブラリーを使用する
- 30. php exec()で外部Windowsソフトウェアのコマンドラインを実行するには?
興味深いアプローチ.. – JtR
+1素敵な最適化のトリック。 – Gishu