簡體   English   中英

單元測試類有雙打

[英]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.Double1actual.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 vccint 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM