3

私は多くの単体テストがあり、それぞれがデータベースを「デフォルト」状態にする必要があるWebサイトで作業しています。テストごとにデータベースを破棄し、SQLスクリプトを使用してデフォルトの状態をロードしていることを知っておいてください。そして、それは非常に遅いです。そのため、各テストの開始時に、そのデフォルト状態を保存してデータベースを復元できれば便利だと思いました。これは可能ですか?そうでない場合、なぜ私はプロセスを加速するために行うことができますか?データベース全体を削除して再作成することを知っています。行だけを削除した場合、パフォーマンスは向上しませんか?

4

2 に答える 2

3

すべてのテストの前にデータベースをデフォルト状態に設定してから、各テストをトランザクションでラップすることができます。テストが終了したら、トランザクションをロールバックするだけです。

このアプローチは、共有状態に依存しないため、テストを同時に実行する場合に特に適しています。

ただし、適合しないユースケースがあります。たとえば、統合テストの一般的なケースである、テストシナリオに関係するデータベースにアクセスする複数のプロセスがある場合。

このような状況の実際の例:テストランナー(プロセス#1)がデータベースにデータを設定し、ファントムがバックグラウンドで実行されてアプリサーバーにリクエストを送信します(プロセス#2)。テストランナーとアプリサーバーの両方が単一のデータベーストランザクションを共有することはできません。

于 2012-07-24T09:16:23.930 に答える
1
  1. 現在のテーブルを一時的なテーブルの後ろに隠すことができます。

    CREATE TEMPORARY TABLE foo
    PRIMARY KEY (a),
    UNIQUE  KEY (b),
    FOREIGN KEY (c) REFERENCES bar (c)
    SELECT a, b, c FROM foo
    

    接続が切断されると、一時テーブルは破棄されます(したがって、元の影響を受けていないテーブルのみが残ります)。

  2. 依存性注入を使用して、データベースをシミュレートしたり、テストデータベースに接続したり、その他の必要な初期化(上記の一時テーブルの作成など)を実行したりします。

于 2012-07-24T09:15:35.670 に答える