FlexUnit4 統合テストの間にデータベースを既知の状態にリセットする最良の方法は?

StackOverflow https://stackoverflow.com/questions/4009099

質問

背景:

BlazeDS 経由で Java バックエンドと通信する Flex Web アプリがあります。Flex クライアントは、ビューとプレゼンテーション モデルを保持する flex-client モジュールと、モデル (値オブジェクト) とサービス オブジェクトを保持する別個の flex-service モジュールで構成されます。

私は、FlexUnit4 を使用して、フレックスサービス モジュールの RemoteObjects の非同期統合テストを作成中です。一部のテストでは、テスト データを変更し、クエリを実行してすべてが機能するかどうかを確認します (ここで示す手法は次のとおりです)。 http://saturnboy.com/2010/02/async-testing-with-flexunit4)

質問:

各 FlexUnit4 テスト メソッド (またはテスト メソッド チェーン) の前にデータベースを既知の状態にリセットするにはどうすればよいですか?私の Java サーバー統合テストでは、DBUnit と Spring Test のトランザクション (各テスト メソッドの後にロールバック) を組み合わせてこれを実行しました。ただし、これらの Flexunit 統合は複数のリクエストにまたがるため、複数のトランザクションにまたがります。

バックエンドに統合テスト サービス API を実装する以外に、これをどのように実現できるでしょうか。他の人も同様にこれに遭遇したことがあるでしょうか?同様の質問が以前にもありました ( 統合 (Selenium) テスト後のデータベースのロールバック )、しかし満足のいく答えはありません。

役に立ちましたか?

解決

いくつかのオプションがあります。

  1. 主キーにシーケンスを使用する場合:データベースにテスト データがロードされたら、シーケンス ジェネレータを削除し、次で始まるシーケンス ジェネレータに置き換えます。 -1 そしてカウントダウン。テスト後は、主キーが 0 未満のオブジェクトを削除できます。既存のデータを変更するテストの場合は中断します。

    同様のアプローチは、特別なユーザーを作成することです。 created タイムスタンプ列の場合、初期データは過去のある日付より前のものである必要があります。ただし、追加のインデックスが必要です。

  2. すぐに消去できるサーバー上のデータベースを使用します (H2, 、 例えば)。DB をリセットするためにクライアントから呼び出すことができるサービス API を追加します。

  3. Web アプリに Undo を追加します。これはかなりの労力ですが、非常に優れた機能です。

  4. Lotus Notes など、単一のコマンドで過去に戻ることができるデータベースを使用してください。

  5. データベースは一切使用しないでください。代わりに、正しい入力に正しい出力で応答するプロキシ サーバーを作成します。実サーバーにコードを追加して、交換されたデータをファイルに書き込み、そこからテストを作成します。

    または、実サーバーに対して実行し、これらのファイルを作成するテスト ケースを作成します。これにより、サーバーまたはクライアント上のコードを変更するときにどのファイルが変更されるかを追跡できるようになります。

    サーバー上で、DB の変更が正しく行われることを確認するテストを作成します。

  6. 「データベースをまったく使用しない」のと同様に、DB にアクセスするすべてのコードを DB レイヤーに隠し、インターフェイスを使用してアクセスします。これにより、実際のデータベースのように動作し、データをメモリに保存するモックアップ レイヤーを作成できます。簡単そうに聞こえますが、通常は大変な作業です。

他のヒント

テストデータベースのサイズに応じて、あなたはあなたが各テストの実行に持っていた正確な環境を与えてきれいなバックアップ/リストアを自動化することができます。

私は私の現在のプロジェクト(異なるプラットフォーム)の上にそのアプローチをしましたし、同じアプローチで、私たちも、テストデータスキーマ変更スクリプトます。

私は脱水だ(短期欠点のための私のfav言い訳)。この答えが近すぎるあなたが望んでいなかったことを応答「バックエンドの統合テストサービスAPI」にあるのであれば申し訳ありません。

は、セットアップのFlexUnitの年齢前に "行った選択と作成したソリューションは、当社のアーキテクチャに基づいていることをチームは、そのうちのいくつかは、当社のインフラストラクチャに適用されます。考慮事項: 1)私たちのバックエンドのすべてのメソッドは、同じリモートでマッピングされたクラスを返します。 2)ほとんどの私たちのすべてのメソッドは、メソッドへを伝える(またはしないようにすることを抽象化法)(メソッドの開始時に、「トランザクションを開始」を実行し、最後に「トランザクションのコミット」を持っていないことを確認、あなたのデシベルチャンクの)ます。

後者はおそらく、ほとんどのオブジェクト指向のソリューションではありませんが、ここでは非同期ユニット・テスト・コールが何をするかだ:、すべてのユニットテストは、同じ方法で、ラッパーを呼び出して、我々はパスでメソッド名/パッケージロケールプラス[...]引数。 AのbeginTransactionが行われます。この方法は、(のbeginTransactionとのcommitTransaction行を無視する)FEユニットテストのための方法に虚偽を渡し、呼ばれ、すべてが実行され、メインの応答 "クラスが生成され、ユニットテストメソッドに返されます。 DB-ロールバックが実行され、応答は、ユニットテストに戻される。

は、当社のユニットテストのすべてがロールバックされたトランザクションに基づいています。私はジャイブを設定するとき、彼らが持っていたことを問題のことを伝えることができなかったが、それはどのようにschtuff作品の私の一般的な理解です。

希望に役立ちます。そうでない場合は理解できます。 運のベスト、 --jeremy

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top