約30%の確率で失敗する単体テストをデバッグしようとしています。残念ながら、コードにブレークポイントがある場合は失敗しないため、これはある種のタイミングの問題のようです。
そこで、問題のあるアサーションに条件付きブレークポイントを設定しました。このブレークポイントは、アサーションがfalseになるときに発生します。予想通り、約1/3の時間でブレークポイントに到達しました。ただし、実際に式の値を調べると、すべて問題ないように見えます。そして、確かに、続行を押すと、テストは成功します。
なぜこれが当てはまるのかを誰かが理解するのを手伝ってもらえますか?別のスレッドが値を変更している場合、ブレークポイントに到達したときにスレッドが停止しませんか?または、次のようなことが起こっている可能性があります。
- 状態を確認してください...trueと評価してください
- 別のスレッドが変数を変更します
- 壊す
私は自分の問題に対する具体的な解決策を本当に探していません(コードが多すぎて合理的に投稿できないか、誰かが踏みにじることを期待しています)。条件付きブレークポイントがどのように機能するか、およびそのようなことが発生する理由についての一般的な入力を探しています。
注:私はVisual Studio 2012(および重要な場合は.NET 4.0 C#)を使用しています。
また注意:
失敗しているアサーションは次のとおりです。
foreach (KeyValuePair<Guid, DateTime> time in state.Times) {
Assert.IsTrue(time.Value > DateTime.Now.AddYears(2) && time.Value <= DateTime.Now.AddYears(3));
}