2011-07-20 9 views
1

私が働いている会社でVS2010を使ったテストでデモプロジェクトを行いました。 テスト用の入力として、数学計算クラス:MathOps。 MathOpsはいくつかの例外とそれ以外のものを投げることができます。 しかし、私が単体テストをセットアップしていたとき、私は非常に奇妙に振る舞うように見える単体テストを見つけました。VS2010結果が正しいうちにユニットテストに失敗する

MathOpsオブジェクトはターゲットと呼ばれ、テスト初期化メソッドで初期化され、使用される可能性があることを示します。

Private target As MathOps = Nothing 

<TestInitialize()> _ 
Public Sub MyTestInitialize() 
    target = New MathOps() 
End Sub 

誤動作されている試験は、以下のいずれか:

'''<summary> 
'''A test for MathOps.add 
'''</summary> 
<TestMethod()> _ 
Public Sub addTest() 
    Dim first As Double = 2.3 
    Dim second As Double = 3.4 
    Dim expected As Double = 5.7 
    Dim actual As Double 
    actual = target.add(first, second) 
    Assert.AreEqual(expected, actual) 
End Sub 

I予想/結果値である5.7をもたらす付加用語を使用する場合、アサーションは、コードが生成さにもかかわらず、失敗正しい結果。

Assert.AreEqual failed。期待される:< 5,7>。実際:< 5,7>

3.4の代わりに3.4000001を追加して5.7000001にすると、テストに合格します。

誰もがこのエラーの原因を知っていますか?

答えて

2

浮動小数点演算による正確な結果は期待できません。 floating-point arithmetic is inherently susceptible to rounding problems like this one。代わりにエラーしきい値を使用して結果を確認してください。

+0

ここでは丸め問題が当てはまると思われますので、VSが別の値を表示していなくても答えが正しいと思います。それはまだ私を悩ませるが、私はそれと一緒に生きなければならないと思う。 – Onno

+0

示されているものと正確な値が同じである必要はありません。表示コードは、小さな違いを丸めます。しかし、Doublesを直接比較すると、すべてのビットが比較されます。 –

関連する問題