関数がデータベースからデータを引き出す以外に興味深いことを行う場合は、取得を別の関数に抽出してモックする必要があります。そうすれば、残りをテストできます。
これでも、データベース アクセスをテストするタスクが残ります。そのための単体テストを実際に行うことはできません。これは、定義によりデータベースにアクセスせず、必要と思われるSQLステートメントを送信するかどうかをテストできますが、SQLステートメントが実際に機能するかどうかはテストできません。
だからデータベースが必要
さまざまなオプションがあります。
1) テストによって変更されない、そのようなテスト用の固定データベースを作成します。
長所: 概念的に簡単 短所: 保守が難しい。テストは同じデータに依存するため、相互依存になります。更新、挿入、または削除を行うものをテストする方法はありません (DDL は言うまでもなく)
2) テスト中にデータベースを作成します。ここで、テスト用のデータベースのセットアップとデータの入力という 2 つの問題があります。
セットアップ:
1)テストを実行する必要があるすべての人(少なくとも開発者+ ci-server)のユーザー/スキーマ/データベースを使用して、データベースサーバーを実行します。スキーマは、休止状態や展開に使用するスクリプトなどを使用して作成できます。
うまく機能しますが、昔ながらの DBA を夢中にさせます。アプリケーションはスキーマ名に依存してはなりません。アプリで複数のスキーマが使用されている場合にも問題が発生します。このセットアップはかなり遅いです。高速ディスクに入れるのに役立ちます。RAM ディスクのように
2) インメモリデータベースを持っています。コードから簡単に開始でき、高速です。ただし、ほとんどの場合、本番データベースと同じように動作します。違いを隠そうとするものを使用する場合、これはあまり問題になりません。私はよく、最初のビルド段階でインメモリ データベースを使用し、2 番目の段階で実物を使用します。
テストデータのロード
1) 人々は私に dbunit を使うように言います。XML が大量にあり、列や制約が変更されたときに維持するのが難しいとは思えません。
2) 通常のアプリケーション コードを好みます。私の場合は(Java + Hibernate)ですが、本番環境でデータをデータベースに書き込むコードは、多くの場合、テスト用のテストデータを書き込むのに適しているはずです。すべての外部キーなどを満たすための詳細を隠す、少し特別なAPIがあると役立ちます。-1-one-to-rule-them/