繁体   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