0

約30%の確率で失敗する単体テストをデバッグしようとしています。残念ながら、コードにブレークポイントがある場合は失敗しないため、これはある種のタイミングの問題のようです。

そこで、問題のあるアサーションに条件付きブレークポイントを設定しました。このブレークポイントは、アサーションがfalseになるときに発生します。予想通り、約1/3の時間でブレークポイントに到達しました。ただし、実際に式の値を調べると、すべて問題ないように見えます。そして、確かに、続行を押すと、テストは成功します。

なぜこれが当てはまるのかを誰かが理解するのを手伝ってもらえますか?別のスレッドが値を変更している場合、ブレークポイントに到達したときにスレッドが停止しませんか?または、次のようなことが起こっている可能性があります。

  1. 状態を確認してください...trueと評価してください
  2. 別のスレッドが変数を変更します
  3. 壊す

私は自分の問題に対する具体的な解決策を本当に探していません(コードが多すぎて合理的に投稿できないか、誰かが踏みにじることを期待しています)。条件付きブレークポイントがどのように機能するか、およびそのようなことが発生する理由についての一般的な入力を探しています。

注:私は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));
}
4

2 に答える 2

2

get {}副作用のあるものはありますか?オブジェクトの状態を観察しながら、オブジェクトの状態を変更した可能性があります。

例えば ​​:

class A {
    int one = 0;

    int two { 
        get { 
            one = 1; 
            return 2; 
        } 
    }
}

今、あなたが主張するときA.one == 1、それは失敗します。あなたがそれを見るならば、あなたはそれとを見るでしょtwo == 2one == 1。もう一度再試行を押すと、を変更したため、アサーションはパスしますA.one

編集 :

コードを見ると、DateTime.Now呼び出すたびに変化します。あなたはそれがそれであるとは思わないのですか?

于 2012-10-22T23:21:04.910 に答える
0

私もこの問題を抱えています。私は次のような状況にありました。外部デバイスにコマンドを送信し、応答をリッスンするタイマーを開始しました。

ブレークポイントを使用しなかった場合、エラーは発生せず、正常に実行されていました。しかし、ブレークポイントを使用した場合、約70%の確率でエラーが発生しました。

なにが問題だったの?ブレークポイントを使用して、コードのリッスンを停止しました。しかし、デバイスは情報を送信し続けました。そしてそれは私のコードがもう聞いていないときに私が探していた答えを送りました。

お役に立てれば :)

于 2012-10-29T18:41:46.740 に答える