C# 双精度单元测试类

C# 双精度单元测试类,c#,unit-testing,floating-accuracy,C#,Unit Testing,Floating Accuracy,我有一个包含(一个或多个…)double的类。例如: 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;

我有一个包含(一个或多个…)double的类。例如:

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.
在这种情况下,
预期的.Double1
实际的.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; 
}
但再一次,我必须对这个类中的每个属性都这样做。如果
TestFloatClass
也有两个属性
verycomplexedclassvcc
&
intinteger
,那么我也必须添加它们

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属性进行(单独)单元测试

请注意,我对你的另一个问题的回答主要是批评在
哈希表中使用经过修改的
Equals()
GetHashCode()
,这根本不起作用,这是一个很好的例子,说明了为什么以破坏契约的方式覆盖
Equals()
是有问题的。如果您只在测试中使用它进行直接比较,那就可以了。但最好有一个单独的比较方法(可能称为
fuzzyquals()
)用于测试,以避免混淆


此外,如果您的值可能非常小或非常大,那么与固定ε比较是有问题的-请阅读详细信息。

我真的不明白您的意思。因为,如果
TestFloatClass
有20个双倍值,我会创建20个单独的单元测试吗?另外,与只将它们写在彼此下面有什么不同?我的意思是,在测试double属性时,实际和预期属性的类型应该是double。@TimoWillemsen在单独的单元测试中写入它们可以让您看到哪个失败了。测试不是关于每个变量可以拥有的值,您需要测试它们使用的函数。我绝对建议您使用断言覆盖示例,而不是覆盖等于。你能解释一下你对添加一个断言来检查类中的每个属性的保留吗?是的,我已经仔细阅读了你的建议。还有你链接到的网站。非常感谢:)然而,我并不喜欢为了测试而改变我的课程。也许在测试项目中编写一个Equals方法更好?不管怎样,非常感谢你费心帮我:)
Assert.Equals(expected.Double2, acutal.Double2, 0.0000001);
Assert.Equals(expected.vcc, actual.vcc);