17

状態に大きく依存しているデータベースバックエンド開発用のテストコードを書くための良いヒントを誰かが持っていますか?

具体的には、データベースからレコードを取得するコードのテストを作成したいのですが、答えはデータベース内のデータによって異なります(時間の経過とともに変化する可能性があります)。

人々は通常、「凍結された」データベースを使用して別の開発システムを作成し、特定の関数が常にまったく同じ結果セットを返すようにしますか?

これは新しい問題ではないと確信しているので、他の人の経験から学ぶことに非常に興味があります。

Webベースの開発のこの問題を一般的に論じている良い記事はありますか?

私は通常PHPコードを記述しますが、これらの問題はすべて言語やフレームワークに依存しないものであると思います。

4

10 に答える 10

6

DBUnit を調べるか、同等の PHP を探してください (そこにあるはずです)。これを使用して、テスト データを表す特定のデータ セットを含むデータベースを準備できます。したがって、各テストは、データベースや既存の状態に依存しなくなります。このように、各テストは自己完結型であり、それ以降のデータベースの使用中に中断することはありません。

更新: 簡単な Google 検索で、PHPUnitのDB ユニット拡張が表示されました。

于 2008-08-05T22:03:29.750 に答える
3

データレイヤーのテストに主に関心がある場合は、この本をチェックしてください: xUnitテストパターン:テストコードのリファクタリング。私自身はいつも確信が持てませんでしたが、この本はパフォーマンスや再現性などの懸念を列挙するのに役立ちます。

于 2008-08-06T04:14:42.433 に答える
2

使用しているデータベースにもよると思いますが、Red Gate (www.red-gate.com) は SQL Data Generator というツールを作成しています。これは、実用的なテスト データでデータベースを満たすように構成できます。また、乱数ジェネレーターで常に同じシードを使用するように指示して、「ランダム」データが毎回同じになるようにすることもできます。

その後、単体テストを記述して、この信頼できる再現可能なデータを利用できます。

Web 側のテストに関しては、現在 Selenium (selenium.openqa.org) を調べています。これは、機能のテストに役立つクロスブラウザ対応のテスト スイートのようです。しかし、これらすべての Web サイト テスト ツールと同様に、これらのツールがすべてのブラウザでどれだけ適切に表示されるかを人間の目で確認せずにテストする方法はありません。

于 2008-08-06T13:44:48.443 に答える
2

インメモリ データベース (hsql : http://hsqldb.org/ ) を使用します。Hibernate ( http://www.hibernate.org/ ) を使用すると、単体テストをテスト用データベースに簡単に向けることができ、稲妻のようにすばやく実行できるという追加のボーナスが得られます..

于 2008-09-10T12:02:14.610 に答える
1

これが私の戦略です(私はJUnitを使用していますが、PHPで同等の方法があると確信しています):

特定のDAOクラスのすべての単体テストの前に実行されるメソッドがあります。devデータベースを既知の状態にします(すべてのテストデータなどを追加します)。テストを実行するとき、既知の状態に追加されたデータを追跡します。このデータは、各テストの最後にクリーンアップされます。クラスのすべてのテストが実行された後、別のメソッドがdevデータベース内のすべてのテストデータを削除し、テストが実行される前の状態のままにします。これをすべて行うのは少し手間がかかりますが、私は通常、すべてのDAOテストクラスがアクセスできるDBTestCommonクラスでメソッドを記述します。

于 2008-08-11T13:30:32.457 に答える
1

3 つのデータベースを使用することを提案します。1 つの実稼働データベース、1 つの開発データベース (各開発者にとって意味のあるデータで満たされている)、および 1 つのテスト データベース (空のテーブルと、常に必要ないくつかの行を含む)。

データベース コードをテストする方法は次のとおりです。

  1. 状態を初期化するために (SQL を使用して) いくつかの行を挿入します。
  2. テストする関数を実行します
  3. 期待される結果と実際の結果を比較します。ここでは、通常の単体テスト フレームワークを使用できます。
  4. 変更された行をクリーンアップします (そのため、次の実行では前の実行が表示されません)

クリーンアップは、DELETE * FROM table.

于 2008-08-19T18:40:33.063 に答える
1

私は自分の仕事でまったく同じ問題を抱えており、最善のアイデアはデータベースを再作成するための PHP スクリプトを用意し、次にクレイジーなデータを投げてそれが壊れるかどうかを確認する別のスクリプトを作成することです。

単体テストなどを使用したことがないので、うまくいくかどうかはわかりません。

于 2008-08-05T22:03:33.260 に答える
1

テストを実行する前に既知の量でデータベースをセットアップし、最後に破棄できる場合は、どのデータを使用しているかがわかります。

次に、Selenium のようなものを使用して、UI から簡単にテストし (ここでは Web ベースを想定していますが、他の UI フレーバー用の UI テスト ツールがたくさんあります)、データベースから引き戻された特定のレコードの存在を検出できます。

データベースのテスト バージョンをセットアップすること、またはテスト スクリプトを使用して、テストの一部として既知のデータをデータベースに入力することは、間違いなく価値があります。

于 2008-08-05T22:08:11.050 に答える
1

http://selenium.openqa.org/を試すことができます。これは、データ レイヤー テスト アプリケーションというよりも GUI テスト用ですが、アクションを記録し、それを再生してさまざまなプラットフォーム間でテストを自動化できます。

于 2008-08-06T12:06:28.597 に答える
1

一般的に、Peter に同意しますが、テスト データの作成と削除には SQL を直接使用しません。製品で使用される CRUD API を使用して、できるだけ製品に似たデータを作成することを好みます...

于 2008-09-10T11:31:15.260 に答える