4

このasp.netでは、デッドロックが発生する可能性があります。コードがそれらを適切に処理することを確認したいので、デッドロックをトリガーする NUnit テストを作成しようとしています.....

DAO はエンティティごとに分割されます。各エンティティには一連のテストがあり、これらは Startup() および Teardown() メソッドで囲まれています。これらのメソッドは、トランザクション スコープを作成し、テストが完了した後にロールバックします。これは他のすべての場合にうまく機能しますが、デッドロックにはまったく役に立ちません。

TransactionScope と SQL2000 (つまり、MSDTC が関係している) を使用して、確実に再現できる "デッドロック" テストをセットアップして実行するにはどうすればよいですか? 詳細: 2 人のユーザーが異なる特定のデータ値を使用して 2 つの関数を呼び出すと、デッドロック発生する状況があることはわかっています。NUNIT内でこれをシミュレートするにはどうすればよいですか?そしてデッドロックを常に発生させますか?

はい、私は「そもそもデッドロックが発生するのを止めてみませんか」という行動計画から始めましたが、デッドロックが発生する可能性のあるコードを制御することはできません。関数を呼び出すだけで、デッドロックが発生する可能性があります。 .

4

6 に答える 6

2

デッドロックによって例外がスローされる場合は、モック オブジェクトを使用して、スローされる例外をエミュレートします。

基本的な考え方は、モック オブジェクト フレームワーク (私はTypeMockが好きです) に代わりに例外をスローするように指示することです。たとえば、次のようになります。

MockObject mo = MockManager.MockObject(typeof(MyDeadlockException));
mock.ExpectAndThrow("MyMethod", (MyDeadlockException)mo.Object); 

考え方は基本的に他のモッキングフレームワークと同じです。

于 2008-10-08T21:36:54.150 に答える
1

これらのソリューションのほとんどには、複数のスレッドが含まれます。これはそうではないものです。

これらの抜け穴を閉じる-データベースエラーを再現する

著者はアレックス・クズネツォフです。

于 2008-10-10T03:17:22.920 に答える
0

テーブルを手動でロックし、常にロックしたままにした場合はどうなりますか?次に、そのテーブルに対して実行したアクションによって、デッドロック状態が発生しますか?

于 2008-10-07T15:29:16.953 に答える
0

単体テストでは、実際にデータベースを使用することは避けたいと思うでしょう。デッドロックがあることをどのようにして知ることができますか。デッドロックがあることを示す条件をテストし、テストでそれを作成する必要があります。

モックは、サービスを呼び出してエラーが返された場合を模倣する理想的な方法です。モックが期待するエラーを返すようにするだけです。タイムアウトなどを待っている場合は、同じことが当てはまります。

一般に、単体テストはテスト対象のコードでのみ実行し、他のコードやコンポーネントに依存しないようにする必要があります。そうは言っても、データベースは本質的に別のコンポーネントであり、おそらく nunit を使用してそれらを駆動する何らかの機能テストを行っているでしょう。

その場合、実際にはデッドロック状態を作成する必要がありますが、レコードまたはテーブルをロックしてから、同じレコードを使用しようとするコンポーネントを呼び出して応答を処理する必要があります。

于 2008-10-09T01:03:34.937 に答える
0

この盲点に来ていますが、TestSetup メソッドで実際にデータベースへの SQLConnection を作成することは可能ですか? 次に、それを使用して、コマンドを発行してテーブルをロックするか、何らかのアクションを実行してレコードまたはページをロックできますか? そうすれば、あなたが行っている他のトランザクションの範囲外になりますか? ただし、これはすでに検討済みのオプションのようです。あなたの状況について何が欠けていますか?

于 2008-10-07T16:20:51.777 に答える
0

トランザクションの途中でテストの 1 つが 5 分間だけ「待機」した場合はどうなるでしょうか? または、トランザクションを開始し、新しいレコードを作成し、コミットせずにそのレコードを更新するテストを書くだけです。次に、新しいトランザクションを開始し、作成されて現在更新中のレコードを読み取ろうとします。そこで行き詰まります。

于 2008-10-07T15:18:52.107 に答える