elf*_*elf 181 java junit unit-testing
我有一个关于junit assertEquals
来测试双值的问题.阅读API文档,我可以看到:
Run Code Online (Sandbox Code Playgroud)@Deprecated public static void assertEquals(double expected, double actual)
已过时.使用assertEquals(双重预期,双重实际,双重epsilon)代替
这个epsilon
值意味着什么?(Epsilon是希腊字母表中的一封信,对吧?).
有人可以向我解释如何使用它吗?
jbe*_*erg 192
Epsilon是2个数字可以关闭的值.所以它只要声明为真Math.abs(expected - actual) < epsilon
Jam*_*ett 117
这是哪个版本的JUnit?我只见过delta,而不是epsilon - 但这是一个副作用!
来自JUnit javadoc:
delta - 两个数字仍然被认为相等的预期和实际之间的最大增量.
它可能有点过分,但我通常使用一个非常小的数字,例如
private static final double DELTA = 1e-15;
@Test
public void testDelta(){
assertEquals(123.456, 123.456, DELTA);
}
Run Code Online (Sandbox Code Playgroud)
如果你正在使用hamcrest断言,你可以使用equalTo()
带有两个双精度的标准(它不使用delta).但是,如果你想要一个delta,你可以使用closeTo()
(参见javadoc),例如
private static final double DELTA = 1e-15;
@Test
public void testDelta(){
assertThat(123.456, equalTo(123.456));
assertThat(123.456, closeTo(123.456, DELTA));
}
Run Code Online (Sandbox Code Playgroud)
仅供参考即将到来的JUnit 5也可以在assertEquals()
使用两个双打时使delta成为可选项.该实施(如果你有兴趣)为:
private static boolean doublesAreEqual(double value1, double value2) {
return Double.doubleToLongBits(value1) == Double.doubleToLongBits(value2);
}
Run Code Online (Sandbox Code Playgroud)
Edw*_*rzo 11
问题是由于浮点数固有的精度问题,两个double可能不完全相等.使用此delta值,您可以根据错误因素控制相等性评估.
此外,某些浮点值可能具有特殊值,如NAN和-Infinity/+ Infinity,它们可能会影响结果.
如果你真的打算比较两个双精度数是完全相等的,那么最好将它们作为长表示法进行比较
Assert.assertEquals(Double.doubleToLongBits(expected), Double.doubleToLongBits(result));
Run Code Online (Sandbox Code Playgroud)
要么
Assert.assertEquals(0, Double.compareTo(expected, result));
Run Code Online (Sandbox Code Playgroud)
这可以考虑这些细微差别.
我没有深入研究过有问题的Assert方法,但我只能假设之前的这种问题已被弃用,新的问题确实考虑到了这些问题.
归档时间: |
|
查看次数: |
142454 次 |
最近记录: |