データベース全体をクリーンアップし、指定された状態を設定するため、シリアルに実行する必要がある C# ユニット テストがいくつかあります。これを並行して行うと、予期しない動作が発生します。そのため、XML で並列テストの数を 1 に設定しようとしましたが、それでも並列テストが実行されました。したがって、私の次のアプローチは、メソッド/拡張機能を使用[TestInitialize()]
し[TestCleanup()]
てシリアル処理を強制することでした。
これが私のコードです:
static Object exclusiveDbAccess = new Object();
//Use TestInitialize to run code before running each test
[TestInitialize()]
public void MyTestInitialize()
{
lock (exclusiveDbAccess)
{
Monitor.Enter(exclusiveDbAccess);
}
}
//
//Use TestCleanup to run code after each test has run
[TestCleanup()]
public void MyTestCleanup()
{
lock (exclusiveDbAccess)
{
Monitor.Exit(exclusiveDbAccess);
}
}
これはほとんどの場合うまくいくように見えますが、(これでもめったにありませんが) まだいくつかの並列テストが実行されているように見える効果がありました。これはコンピュータに多くの負荷がかかるときに常に発生するため、「lock()」のタイムアウト (たとえば 10 秒または 30 秒後) が原因ではないかと考えていました。たとえば、ロックの取得に x 秒間失敗した後に lock () ブロックがスキップされると、これらの問題が発生する可能性があります。
したがって、その「ロック」ステートメントの正確な動作を専門家に教えてもらいたいと思います。「推測」だけを投稿しないでください。lock() がタイムアウトすることがわかっている場合、経験報告はもちろん大歓迎です...