0

私はVS 2015のIntellitest(および一般的な単体テスト)にかなり慣れていないので、それを使用してインチとmmを変換する簡単な方法をテストしようとしています。

Intellitet には浮動小数点テストに関する制限があることを理解しています。理想的には、完全にフレームワークの外に出ることなく、これらを回避するにはどうすればよいですか? 残りのコードでは問題なく使用しているので、できるだけ同じアプローチに一致する回避策を見つけたいと思います。

クラスに 2 つのプロパティがあります。

public double CutLengthInInches
{
    get;
    set;
}

public double CutLengthInMM
{
    get
    {
        return CutLengthInInches * 25.4;
    }
    set
    {
        CutLengthInInches = value / 25.4;
    }
}

次に、Intellitest を使用してスタブを作成し、次のように入力します。

[PexMethod]
public void CutLengthInMMSet([PexAssumeUnderTest]CutPiece target, double value)
{
    target.CutLengthInMM = value;
    PexAssert.AreEqual(value, target.CutLengthInMM);
    PexAssert.AreEqual(value, target.CutLengthInInches * 25.4);
}

これを実行すると、Intellitest は次のエラーを表示します。

次の操作が分岐条件に関係していました:

floating point equality

この操作はテスト容易性の問題を引き起こし、呼び出しに続くコードをカバーするための入力を生成できません。

それが指す行は最初のAreEqual()呼び出しです。これに対する最も適切な回避策は何ですか?

4

1 に答える 1

0

あなたのアサーションは、浮動小数点値の正確な比較を行っています。IntelliTest を使用しているかどうかに関係なく、このような比較は避ける必要があります。アプリケーションが正確な浮動小数点比較に依存することは安全ではありません。丸めのわずかな違いにより、このような比較の結果が変化し、予期しない動作が発生する可能性があります (テスト ケースの失敗など)。

代わりに、浮動小数点数が等しいかどうかのテストは、予想される計算の精度に関連する許容範囲内で行う必要があります (つまり、値が「十分に等しい」かどうかを比較します)。

たとえばdouble.Epsilon、許容範囲として使用する場合は、次のように比較を更新します(Math.Abs(value - target.CutLengthInMM) < double.Epsilon)

次に、 IntelliTest について説明します。IntelliTest は、コードがこのような正確な比較を行っていることを確認すると、テスト容易性に関する警告でそれらにフラグを立てます。上記の許容値を続けて、次のようにアサーションを更新します。

PexAssert.IsTrue(Math.Abs(value - target.CutLengthInMM) < double.Epsilon);

への呼び出しがインストルメント化されていないという警告が表示さMath.Absれます。これで問題ありません (そのメソッドのテストには関心がないため)。他のそのような問題に対処したことを確認したら、警告を選択して抑制できます ([探索結果] ウィンドウのツールバーの [抑制] ボタンをクリックします)。

于 2016-04-25T10:20:49.267 に答える