私は非常に奇妙な問題を扱っています。最初は、これはテスト データのクリーンアップに問題があると思っていましたが、テスト データのクリーンアップ コードを完全にリファクタリングした後も、まったく同じ動作が見られます...途方に暮れています。
さまざまなクラスに 245 個の単体テスト メソッドがあります。各クラスには独自のテスト データがあり、それらのオブジェクトを初期化します。次に、通常、各テスト メソッドでそのデータがデータベースに挿入され、テストで操作されます。各テスト クラスには、データベースからすべてのテスト データをクリーンアップする ClassCleanup メソッドがあり、その ClassCleanup は TestInitialize でも実行され、他のテスト メソッドが実行される前にすべてがクリーンアップされるようにします。
VS 2012 テスト エクスプローラーを使用して「すべて実行」すると、22 個のテストが失敗します。それらはすべて、主キー制約違反のいくつかのバリエーションで失敗します。つまり、これらのテストのデータを初期化するときに、データはそのクラスの以前のテスト メソッドからクリーンアップされませんでした。すべてのテストを再実行すると、毎回同じテストが失敗します。これはかなり再現性があります。すべてのテストを何回実行しても。これらの同じ 27 のテストは、主キー違反で失敗します。
ただし、奇妙なことに、失敗したテストのみを再実行すると、9 つのテストしか失敗しません。これも再現可能です。つまり、以前に失敗した 27 個のテストだけを何度実行しても、14 個は失敗し、残りは成功します。これは、失敗したテストのみを実行し、失敗したテストがなくなるまで続きます。また、各テスト クラスを個別に実行すると、すべてがパスすることにも注意してください。
私はこれがどのように見えるか知っています。
「明らかに、テスト データをクリーンアップしていません。」その場合は、何があっても、すべての実行で同じテストが失敗するはずです。これらの 27 個のテストは、他のすべてを実行したときだけでなく、すべての実行で失敗するはずです。
「クラス間で一意の主キーを持ってはいけません。そうすると、クリーンアップされません。」上記を参照。クラスで主キーが繰り返されていた場合でも(さまざまなクラス内のテストデータの主キーの一意性を個人的にトリプルチェックしたため、そうではありません)、これらのテストは別々のスレッドで同時に実行されないため(これは ThreadId をログに記録することによって確認されています)、特定のテストのクリーンアップ コードは、重複したデータをクリーンアップします。
「接続プーリングを使用していてはなりません。」いいえ、実際に私はそうです。また、SQL プロファイラーを使用して、要求が確実にプールされていることを確認しました。また、これらのテストは並行して実行されないため、接続スレッドは 1 つしかありません。
「接続プーリングは使用しないでください。」基礎となるコードベースはさまざまな Web プロジェクトをサポートしているため、そうする必要がありますが、議論のために、接続プールを無効にして (接続文字列で Pooling=false を使用して) すべてのテストを実行してみましたが、まったく同じ結果が得られました。行動に変化はありません。
「ローカル環境に問題があるはずです。」他の同僚の開発ボックス (ついでに SQL 2012 を使用) でこれらのテストを実行しても、同じ結果が得られます。これは、私の環境や SQL Server のバージョンに固有のものではありません。
「コマンド ラインから mstest を実行してみてください。」すでにそれをしました。同じ結果です。
誰かがこのようなことに遭遇した場合は、私に知らせてください。この種の問題では通常そうであるため、欠けている単純なものがあるに違いないことはわかっていますが、これを整理するために、できる限り多くのベースをカバーしました。