4

Amazon Web Services スタックの上に Web アプリを構築していますが、今のところ気に入っています。

また、テスト駆動開発をフルに活用しており、それも素晴らしいことが証明されています。

Amazon SimpleDB の「結果整合性」に関連して遭遇した問題について、誰かが私を助けてくれることを願っています。

発生する問題の最も良い例は、ユーザーを追加し、新しく追加されたユーザーをフェッチする呼び出しを行うことによって、ユーザーが正常に追加されたことを確認する単体テストです。

簡単に先に進み、そのためのテストを作成するだけで、すべて正常に動作する可能性がありますが、「結果整合性」と、ユーザーを取得するための呼び出しを行ったときに、ユーザーが実際にはそうではない可能性があることを認識しています。まだ追加されています。fetch user 関数が呼び出され、ユーザーがシステムに存在しない場合は、false または失敗が返されます。

私が知りたいのは、これを処理する最善の方法は何ですか? リクエスト間で 5 秒間スリープし、10 回試行する関数を作成するという提案を見てきました。指数バックオフを使用したソリューションも見てきました。最適なソリューションは何ですか?

4

3 に答える 3

5

独自のコードの単体テストに実際の SimpleDB サービスを使用しないことをお勧めします。コード + SimpleDB クライアント + ネットワーク + SimpleDB 自体をテストします。必要なのは、単体テストを実行するための SimpleDB クライアントのモックです。この方法では、テストする必要があるコードのみをテストしています。テスト駆動開発では、コードの単体テストでデータベースが機能するかどうかをテストしないように求められます。

独自の SimpleDB クライアント コードをテストする場合は、モック SimpleDB サービスまたはローカルで実行できる SimpleDB クローンであるM/DBのようなものを使用できます。

しかし、これはより大きな問題を引き起こします。SimpleDB は結果整合性を提供し、書き込みの一貫性を提供しないためです。コードは、新しく追加されたアイテムが get またはクエリからすぐに返されないという事実を確実に処理できる必要があります。

あなたのコードがそれを処理できないと考える理由はありません。原則として、テストでこのような問題が発生した場合は、テスト対象のコードで考慮する必要がある問題を示唆していると言っているだけです。アプリ コードと SimpleDB の間の一般的なキャッシュ レイヤーが必要な場合や、読み取りと書き込みの一貫性を提供できるセッション キャッシュが必要な場合があります。

于 2009-09-11T17:23:17.080 に答える
0

データベースをテストしているのか、それともデータベースに反するコードをテストしているのか。データベースに反するコードをテストする場合は、コードがユーザーを追加し、ランダムな時間が経過するまでユーザーを返さないことを期待するテストを行う必要があります。明らかに、これは、最後のリクエストからの時間を追跡し、最初のリクエストが経過してから指定された時間が経過した後にのみ期待値を返す偽の DB を使用して最も簡単に設定できます。偽物が値を決して返さない、すぐに返すように設定するなどの同様のテストがあります。インタラクションを追跡するために偽物をインストルメントし、テストでコードをどのように設定するかを設定できますコードが期待される動作に従うように動作します (たとえば、少なくとも 2 回のポーリング)。

于 2009-09-05T13:44:36.860 に答える
0

まず、@Mocky が述べたように、単体テストで実際のデータベースにアクセスするのは間違っています。統合テストでそれを行うこともできますが、すべての単体テストに合格するため、これらは機能します。

結果整合性を意識した単体テストに関しては、次のようなアイデアがあります。

  1. ユーザーが書き込み後に simpledb から返されることをテストします (ec の影響はありません) put user get user test sameness

  2. ユーザーが書き込み後に simpledb から返されないことをテストします (ec 効果) put user get user エラーを受け入れます

  3. ec からのエラーが処理されることをテストする get user + エラーを受け入れる テスト エラーが処理される

memcache (または elasticcache) のレイヤーを使用してキャッシュされたユーザーを提供することを考えていたので、ユーザーが simpledb に書き込まれると、キャッシュにも送信されます。simpledb エラーが発生すると、そのようなユーザーが実際には存在しないとコードが判断する前に、次にキャッシュがチェックされます。

(実際には、最後の段落についてどう思うか聞きたいです)

于 2011-12-09T11:00:05.343 に答える