私は誰かとウェブアプリケーションとのユニット/統合テストについて話し合ったことがありますが、1つのコアアイデアについて意見の相違があります。問題は、私が話している人が、単体テストで使用するデータベースにデータが事前に入力されている必要があり、テストが実行される前後に完全に空である必要があると考えていることです。
データベースにデータが事前入力されていることに対する私の懸念は、データが良好な状態に維持されていることを確認する方法がないことです。テスト自体がデータベース内のデータを作成、削除、および変更するため、テストを開始する前にデータベースにデータがあることがどのように良いかわかりません。
データベースの機能をテストする最良の方法は、次の設定を行うことです。
テスト対象のデータが適切なテスト可能なテストであることを確認する他の方法はありません。
ここで何か不足していますか?これはデータベース関連の機能をテストする最良の方法ではありませんか? (テストを開始する前でも、テストが完了した後でも)データベースに常に存在する事前入力されたデータベースを使用する利点はありますか?私のプロセスを異なる方法で説明して私のポイントをよりよく伝えるためのアイデアの助けも素晴らしいです(つまり、私のポイントにメリットがある場合)。
私にとって、単体テストはデータベースを扱うべきではなく、統合テストはデータベースを扱います。
データベースを処理する統合テストには、実際にはティアアップとティアダウンのアプローチを備えた空のデータベースが必要です。トランザクションベースのアプローチを使用するのが非常に良い方法です(つまり、セットアップ時にトランザクションを作成し、ティアダウン時にロールバックします)。
友人がやりたいように聞こえるのは、「回帰」の観点からテストすることです。つまり、実際のデータがあり、システムがどのように反応するかを確認します。ドメインモデルのいくつかの癖。
あなたのベストプラクティスは、進むべき道であり、私がしがちなことは、悪いデータのシナリオを見つけた場合、その正確なシナリオでセットアップとティアダウンを行う統合テストを書くことです。
テストがデータベースに依存している場合、データベースが空であるよりも、気になるデータがテストの既知の状態であることがより重要だと思います。優れたテストの指標の1つは、各テストが1つの理由で失敗し、他のテストが同じ理由で失敗しないことです。
したがって、テストでデータの状態を考慮している場合は、データをその既知の状態にして、テストの実行後にデータをその状態に戻し、テストを再現できるようにします。
モックによってデータの状態からテストを切り離すことができれば、それも良いことです。ユニット/統合テストを行っているとおっしゃっていますが、もちろんこれら2つは個別に検討する必要があります。ユニットテストは可能な限りデータベースから切り離し、統合テストはデータベースを既知の状態でテストする必要があります。
まあ、データベースが事前に入力されていることには1つの利点があります。必要なデータを挿入するコードを記述する必要がないためです。それ以外の場合は欠点があります。多分誰かがデータベースのテストデータを変更しましたか?たぶん誰かがデータを更新しようとしましたか?しかし、さらに悪いことは、1つのテストケースがデータベースをひどく台無しにしてしまうことです...データベース全体を手動で数回再作成することになります。
私は何も切り捨てないことを除いて、あなたはテストがどのように書かれるべきかについて正しいです:
さて、そのシナリオは単体テストに最適です。単体テストと統合テストの両方にデータが必要な場合、すべてのテストケースに共通する1つの大きなセットアップフェーズ(すべての「挿入」を1つの静的メソッドに再グループ化)も非常にうまく機能することがわかりました。それはあなたのアイデアとあなたの友達のアイデアの中間点のようなものです。唯一の欠点は、既存のテストケースを壊さないように新しいデータを追加するときは十分に注意する必要があることです(ただし、このようにテーブルごとに2〜3行追加する場合は問題ありません)。
同僚と例を絞り込んで、それらが正確に何を意味するのかを知る必要があると思います。両方とも同じページにいる可能性があります。
例:アカウントトランザクションテーブルの確認
手順1と2を実行してこれを達成するか、すでにこの状態のデータベースから開始する(バックアップを復元する)かどうか、それが重要かどうかはわかりません。私にそれをスクリプト化するというあなたの考えは、必要な変更を管理することをより簡単にします(管理者アカウントを作成するのを忘れて、新しいユーザーのためにそれを必要とする場合のように)。スクリプトファイルは、一部のバックアップファイルよりもソース管理に簡単に配置できます。これは、このアプリを配布するかどうかにも影響されます。
いくつかの回答の側面をまとめて描画し、私の2pを追加するには...
注:私のコメントは特にデータベーステストに関するものであり、UIテストではありません(明らかに同様です)。
データベースは、フロントエンドアプリケーションと同様にテストの必要性がありますが、「フロントエンドで動作するか」に基づいてテストされる傾向があります。または「レポートは正しい結果を生成しますか?」、これは私の意見ではデータベース開発のプロセスの非常に遅い段階でテストされており、あまり堅牢ではありません。
通常のUAT /パフォーマンス/その他に加えて、データウェアハウスデータベースのユニット/統合/システムテストを利用する多くのクライアントがいます。テスト。彼らは、継続的な統合と自動テストにより、従来のUATに到達する前に多くの問題を取り上げ、UATの時間を節約し、UATが成功する可能性を高めていることを発見しました。
フロントエンドやレポートのテストと同様に、データベースのテストにも同様の厳格さが適用されることにほとんどの人が同意すると思います。
テストで重要なことは、エンティティの複雑な組み合わせに進む前に、小さな単純なエンティティをテストしてその正確性を確認し、より広いシステムに拡張する前にそれらの正確性を確認することです。
だから私の答えにいくつかのコンテキストを与える...
単体テスト
これを行う利点は、テストに対するすべての外部依存関係を削除し、正確さを証明するために最小限のテストを実行することです。明らかに、これらのテストは本番データベースでは実行できません。ユニットのタイプによっては、次のようなさまざまなタイプのテストが行われる場合があります。
(ユニット)統合テスト
私は このSEの投稿 がさまざまな種類のテストについて話すのに役立つことを発見しました。
単体テストからこれらの統合テストに移行する場合、さまざまなテストケースをテストするために、データが少し増えることがよくあります。明らかに、これらのテストは本番データベースでは実行できません。
次に、System Testing、System Integration Testing(aka end- 2エンドテスト)。データ量とスコープが増加します。これらすべてのテストは、回帰テストフレームワークの一部になるはずです。 これらのテストの一部は、ユーザーによってUATの一部として実行されるように選択される場合がありますが、UATはusers、ITの定義ではない-よくある問題!
だから私はいくつかのコンテキストを与えたので、あなたの実際の質問に答えるために