現在テストされていない大量のレガシーコードを処理している場合、将来の仮想的な大規模な書き換えを待つのではなく、今すぐテストカバレッジを取得するのが正しい方法です。単体テストの作成から始めることはできません。
自動テストなしでは、コードに変更を加えた後、アプリが機能することを確認するために手動でエンドツーエンドのテストを行う必要があります。それを置き換える高レベルの統合テストを書くことから始めます。アプリがファイルを読み込んで検証し、何らかの方法でデータを処理し、すべてをキャプチャするテストが必要な結果を表示する場合。
理想的には、手動テスト計画からのデータを取得するか、使用する実際の実稼働データのサンプルを取得できるようにします。そうでない場合、アプリは本番環境にあるので、ほとんどの場合、本来あるべきことをしているので、すべてのハイポイントにヒットするデータを作成し、出力が今のところ正しいと仮定します。小さな機能を実行すること、それが名前のとおりに機能していること、またはコメントが実行すべきであることを示唆していることを想定し、正常に機能していると想定してテストを作成することよりも悪くありません。
IntegrationTestCase1()
{
var input = ReadDataFile("path\to\test\data\case1in.ext");
bool validInput = ValidateData(input);
Assert.IsTrue(validInput);
var processedData = ProcessData(input);
Assert.AreEqual(0, processedData.Errors.Count);
bool writeError = WriteFile(processedData, "temp\file.ext");
Assert.IsFalse(writeError);
bool filesAreEqual = CompareFiles("temp\file.ext", "path\to\test\data\case1out.ext");
Assert.IsTrue(filesAreEqual);
}
アプリの通常の操作と最も一般的なエラーのケースをキャプチャするためにこれらの高レベルのテストを十分に作成したら、コード以外のことを実行してコードからエラーをキャッチしようとするためにキーボードを叩く時間を費やす必要がありますあなたはそれがするべきだと思っていたので、将来のリファクタリング(または大規模な書き直し)がはるかに簡単になります。
単体テストの対象範囲を拡大できるので、統合テストの大部分を削減したり、廃止することさえできます。アプリのファイルの読み取り/書き込みまたはDBへのアクセスの場合、それらの部分を分離してテストし、それらをモックアウトするか、ファイル/データベースから読み取ったデータ構造を作成してテストを開始することから始めるのは明らかです。実際にそのテストインフラストラクチャを作成するには、一連の迅速でダーティなテストを作成するよりもかなり時間がかかります。統合テストでカバーされたものの一部を手動で30分テストする代わりに、2分の統合テストセットを実行するたびに、すでに大きな勝利を収めています。