3

_createAccount()以下の2つのパラメータを取る方法

def _createAccount(self,username,emailID):
    <statements to create account with respect to received emailID>

unittestを使用してこのメ​​ソッドをテストする必要があります。つまり、単一のテストメソッドを使用して、同じemailIDと異なるユーザー名で一度に2つのリクエストを送信したいと思います。2つのリクエストのうちの1つは、このemailIDで作成されたアカウントのようにレスポンスを取得する必要があります。createAccount requestsユニットテストと並行して送信する方法。

4

1 に答える 1

1

このコードはWebアプリケーション内で実行されるため、一度に複数のリクエストを処理できると思います。

1つの方法は、テストでスレッドを作成し、別のスレッドでメソッドを実行して結果を確認することですが、これには多くの注意事項があります。スレッドを並行して実行するとすぐに、実行の順序は決定論的ではなくなりますが、代わりにスケジューラーに依存します。スケジューラーは多かれ少なかれランダムであると見なすことができます。つまり、特定の状況下で(正確な順序または実行で)メソッドが失敗したとしても、それがそれらの状況を再現できることを確認する方法はありません。つまり、テストに合格しても、メソッドの有効性については何もわかりません。

この種の同期の問題では、2回発生させたくないことができないようにコードを記述する必要があります。そのためには、作成/検証コードがアトミックであることを確認する必要があります。

たとえば、SQLデータベースを使用している場合は、usernameまたはemailID列に一意性制約を指定して、2番目の要求が失敗するようにすることができます(SQLトランザクションはアトミックです)。それ以外の場合は、ロックを使用して、1つのスレッドだけが「存在するかどうかを確認し、存在しない場合は作成する」部分を実行していることを確認する必要があります。

于 2012-11-20T10:34:32.870 に答える