3

バックグラウンド:

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

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

質問:

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

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

4

3 に答える 3

5

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

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

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

  2. すばやくワイプできるサーバー上のデータベースを使用します(たとえば、H2 )。クライアントから呼び出してDBをリセットできるサービスAPIを追加します。

  3. Webアプリに元に戻るを追加します。それはかなりの努力ですが、非常にクールな機能です。

  4. Lotus Notesのように、1つのコマンドで時間を遡ることができるデータベースを使用します。

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

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

    サーバー上で、正しいDB変更が行われることを確認するテストを記述します。

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

于 2010-11-01T16:42:50.563 に答える
1

テストデータベースのサイズに応じて、各テスト実行で使用した正確な環境を提供するクリーンなバックアップ/復元を自動化できます。

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

于 2010-11-01T18:12:16.970 に答える
0

私は脱水状態です(私のお気に入りの欠点の言い訳)。この回答が「バックエンドでの統合テストサービスAPI」の応答に近すぎて、望まない場合は申し訳ありません。

「何年も前に」flexUnitをセットアップしたチームは、私たちのアーキテクチャに基づいて選択を行い、ソリューションを作成しました。その一部は、私たちのインフラストラクチャにのみ適用されます。考慮事項:1)すべてのバックエンドメソッドは、リモートでマップされた同じクラスを返します。2)ほとんどすべてのメソッドには、メソッドの最初に「トランザクションの開始」を実行し、最後に「トランザクションのコミット」を実行する(または実行しない)ようにメソッドに指示する抽象化されたメソッドがあります(dbチャンクは不明) 。

後者はおそらく最もオブジェクト指向のソリューションではありませんが、非同期の単体テスト呼び出しが行うことは次のとおりです。すべての単体テストは同じメソッドラッパーを呼び出し、method-name/package-localeに加えて[ ...]args。beginTransactionが実行されます。メソッドが呼び出され、FEユニットテストのメソッドにfalseが渡され(beginTransactionおよびcommitTransaction行を無視するため)、すべてが実行され、メインの「response」クラスが生成されてユニットテストメソッドに返されます。db-rollbackが実行され、応答が単体テストに返されます。

すべての単体テストは、ロールバックトランザクションに基づいています。そのジャイブをセットアップするときに彼らが抱えていた問題についてはあなたに話すことができませんでしたが、それはschtuffがどのように機能するかについての私の一般的な理解です。

お役に立てば幸いです。そうでなければ理解できます。幸運を祈ります、-jeremy

于 2010-10-29T20:27:40.537 に答える