Tim*_*sen 6 c# unit-testing floating-accuracy
我有一个包含(一个或多个......)双打的课程.例如:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我想测试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.
Run Code Online (Sandbox Code Playgroud)
在这种情况下,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;
}
Run Code Online (Sandbox Code Playgroud)
但正如在这个Hashcode实现双精度主题中所说的,这只是练习.
只需使用Assert覆盖
我可以继续测试它如下:
Assert.Equals(expected.Double1, actual.Double1, 0.0000001); //Or just some precision
Assert.Equals(expected.Double2, acutal.Double2, 0.0000001);
Run Code Online (Sandbox Code Playgroud)
但话说回来,那么我必须为这堂课的每个属性做这个.如果它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);
Run Code Online (Sandbox Code Playgroud)
如果班级变大,它会继续增长......
所以我的问题
测试这门课的最佳方法是什么?
您应该拆分测试:
Assert.Equals(expected.Double2, acutal.Double2, 0.0000001);
Assert.Equals(expected.vcc, actual.vcc);
Run Code Online (Sandbox Code Playgroud)
对实际/预期类上的 Double2 和 vcc 属性进行(单独)单元测试。