7

私はこの状況全体に本当に不満を感じています。その理由は次のとおりです。

多くの異なるクライアントデータベースと1つのマスターデータベース(異なるスキーマを持つ)の同期を維持するために、完全にテストされていないレガシーシステムを継承しました。システムは私に渡されたときに部分的にしか完成しておらず、多くの欠陥があり、90%の確率で正しく機能していませんでした。

このシステムでは、6種類の同期が許可されており、データベースはかなり大きくなる可能性があるため、それぞれが異なる(場合によっては重複する)テーブルを同期します。クライアントは、状態に応じて最も重要なテーブルに優先順位を付けることができます。

いくつかのエンドツーエンドのテストから始め、特定のデータを使用してマスターデータベースといくつかのクライアントデータベースをローカルにセットアップし、さまざまな同期メソッドを呼び出して、適切なデータが適切な形式で適切なデータベースに表示されることを確認しました。

私は時間に追われていました。このシステムには、データベース間でデータを移動する方法が少なくとも100通りあり、コードは数千行しかないため、エンドツーエンドのテストをどんどん行っていきました。基本的に、プロジェクトを引き継いだときに存在した欠陥ごとに1〜2個。私は16の単体テスト(追加したコードからTDDを実行)と113のエンドツーエンドテストでシステムを完成させました。これらのテストの多くは、以前の欠陥に直接基づいていました。

私はシステムを完成させました、そしてそれは何事もなく数ヶ月間生産されました。

最近、クライアントデータベースを新しいデータベースに変換することを決定しました。新しいデータベースでテスト(この間ずっとCIサーバーで毎晩実行されていました)を実行すると、113のうち約100が失敗しました。(もちろん、ユニットテストはすべて合格です)。

私は失敗したエンドツーエンドのテストを修正してきましたが、率直に言って、ほとんどの場合、1つまたは2つの単純な理由で失敗しました(新しいデータベースの丸めの日付が異なるなど)が、テストが非常に脆弱であるという事実に不満を感じています。それらは正しく失敗しましたが、100ではなく1つか2つしか必要ありませんでした。問題は、ほとんどの場合、日付に基づいて1つのテーブルからデータを選択するだけなので、単体テストするコードがそれほど多くないことです。別のデータベースから同じデータを選択し、2つをマージしてから、適切に挿入/更新します。

これらのテストなしでこのシステムを完成させる方法はありませんが、それらを維持することの苦痛は基本的に私をこの質問に導くものです:私がどのように進めるべきか/または私がより良くできたかもしれない何か提案?これらのエンドツーエンドのテストを初めて作成するのに多くの時間を浪費しましたか?「レガシーコードを効果的に使用する」を読みましたが、「リファクタリングしてより多くの単体テストを作成する」以外は、私が感じていた種類の痛みについては、あまり良い答えがないように感じました。このシステムのユニークな性質に対して、コードが非常に少なく、データベースの変換が多いというオプションがあります。

4

1 に答える 1

4

データベースプロキシクラスを作成して、それらが実際のデータベースと通信する唯一のクラスであることを確認できます。依存性注入を使用して、実際のデータベースと通信せずにすべてのロジックコードを単体テストします。プロキシがデータベースに対して正しく読み取り/書き込みできることを確認するために、エンドツーエンドのテストをできるだけ少なく作成します。

エンドツーエンドのテストは通常​​、本質的に脆弱です。したがって、それらをできるだけ少なく作成し、多くを作成する必要がある場合は、フィクスチャとアサーションを設定するための抽象化レイヤーを作成できます。 テストケースでの複製は、コードでの複製と同じように維持するのが困難です。

レガシーコードを効果的に使用することは良いスタートです。xUnitテストパターンをお勧めします。これは基本的に、データベースを使用したテストに関するセクションを含む、多くの優れたアドバイスを備えたユニットテストのバイブルです。

編集: TDDはすべてロジックを分離することです。つまり、制御フローステートメント、正規表現、アルゴリズム、数学は、プロキシの外部に配置して、簡単に単体テストできるようにする必要があります。113のテストがあり、抽出して単体テストできるロジックがあるのではないかと思います。

SQLコマンドを作成している場合は、Builderパターンを使用してコマンドが正しく作成されていることを確認できます。SQLダイアレクトを変更する必要がある場合は、変更を加える場所が1つだけです。

コードをテスト可能にすると、ある程度積極的にリファクタリングする必要があるかもしれません。難しいのは、プロジェクトの重要性と寿命に基づいて、どれだけの価値があるかを判断することです。

于 2012-02-08T19:14:09.073 に答える