带双精度的单元测试类

本文关键字:单元测试 测试类 单元 双精度 | 更新日期: 2023-09-27 17:50:40

我有一个包含(一个或多个…)双精度体的类。例如:

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近似相同。但不完全是由于浮点精度。

然而,我不确定如何正确地进行单元测试。这些是我目前为止尝试过的方法。

在等号运算符

中包含一定的增量

我的第一个直觉告诉我,好吧,只要在等号运算符中包含这样的逻辑:

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);

对实际/预期类的Double2和vcc属性进行(单独的)单元测试。

请注意,我对你的另一个问题的回答主要是批评在Hashtable中使用经过修改的Equals()GetHashCode() -这只是不起作用,这是一个很好的例子,为什么以违反合同的方式覆盖Equals()是有问题的。如果你只在测试中使用它进行直接比较,那是可以的。但是,在测试中使用单独的比较方法(可能称为FuzzyEquals())以避免混淆可能是一个更好的主意。

此外,如果您的值可以非常小或非常大,则与固定的epsilon进行比较是有问题的-阅读浮点指南了解详细信息。