[英]Unit testing class with doubles
我有一個包含(一個或多個......)雙打的課程。 例如:
public class TestFloatClass{
public double Double1{get;set;}
public double Double2{get;set;}
public void SetDoubleByCalculation(double value){
Double1 = //Some calculations here;
Double2 = //Some calculations here;
}
}
我想測試SetDoubleByCalculation(double value)
方法,所以我開始編寫單元測試。
TestFloatClass expected = new TestFloatClass();
expected.Double1 = 100.10;
expected.Double2 = 200.24554;
TestFloatClass actual = new TestFloatClass();
actual.SetDoubleByCalculation(Math.PI); //Just using something random here.
在這種情況下, expected.Double1
和actual.Double1
大致相同。 但不完全是由於浮點精度。
但是,我不確定如何正確地進行單元測試。 這些是我到目前為止所嘗試過的。
在equals運算符中包含某個delta
我的第一個直覺說,好吧,只需在equals運算符中包含邏輯,如下所示:
public override bool Equals(object obj){
return Math.Abs(this.Double1 - obj.Double1) <= 0.00001 &&
Math.Abs(this.Double1 - obj.Double1) <= 0.00001;
}
但正如在這個Hashcode實現雙精度主題中所說的,這只是練習。
只需使用Assert覆蓋
我可以繼續測試它如下:
Assert.Equals(expected.Double1, actual.Double1, 0.0000001); //Or just some precision
Assert.Equals(expected.Double2, acutal.Double2, 0.0000001);
但話說回來,那么我必須為這堂課的每一個屬性做這件事。 如果TestFloatClass
也有兩個屬性VeryComplicatedClass vcc
& int integer
那么我也必須添加它們。
Assert.Equals(expected.Double1, actual.Double1, 0.0000001); //Or just some precision
Assert.Equals(expected.Double2, actual.Double2, 0.0000001);
Assert.Equals(expected.vcc, actual.vcc);
Assert.Equals(expected.integer, actual.integer);
如果班級變大,它會繼續增長......
所以我的問題
測試這門課的最佳方法是什么?
您應該拆分測試:
Assert.Equals(expected.Double2, acutal.Double2, 0.0000001);
Assert.Equals(expected.vcc, actual.vcc);
Make(單獨)單元測試實際/預期類的Double2和vcc屬性。
請注意,我對你的另一個問題的回答主要批評使用一個如此修改的Equals()
和GetHashCode()
在Hashtable
使用 - 這是行不通的,這是一個很好的例子,為什么覆蓋Equals()
會有問題以某種方式打破了合同。 如果你只在測試中使用它進行直接比較,那就沒問題。 但是,在測試中使用單獨的比較方法(可能稱為FuzzyEquals()
)以避免混淆可能是更好的主意。
此外,如果您的值非常小或非常大,則與固定的epsilon進行比較是有問題的 - 有關詳細信息,請參閱“浮點指南 ”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.