2013-07-19 263 views
1

这里是我创建的实现牛顿法立方根方法的测试用例我的JUnit代码:JUnit测试用例失败

@Test 
public void standardCase_negative64e9() { 
    double n = -64E9; 
    double result = csc143.newton.Roots.cbrt(n); 
    double delta = n * 1E-8; 
    assertEquals("Standard cube root -64E9", -4.0E3, result, delta); 
} 

当我做了我所有的测试用例的测试(使用DrJave IDE)我只得到了这个测试用例是失败的,它读取:

Failure: java.lang.AssertionError: Standard cube root -64E9 expected:<-4000.0> but 
was:<-4000.0000000003124> 

我觉得这事做与我的“增量”值(这是-640在这种情况下),因为当我将“增量”与640(而不是-640)在assertEquals()方法,我没有得到一个失败...

+0

这个问题不http://stackoverflow.com/questions/322749/retain-precision-with-doubles-in-的副本java的。它应该重新打开。 –

+0

如果您还解释_why_ @ItayMaman,您可能会获得更多成功... – Ben

+0

您在重新打开的队列中看不到答案@SteveP – Ben

回答

3

delta有此值:-64E9*1E-8这实际上是-64。那就是:它是一个负值。由于delta预计将成为实际值与预期值之差的上限,因此您需要将其作为正数。

看一下Assert类的source code。其中双打进行比较的地方是doubleIsDifferent方法:

static private boolean doubleIsDifferent(double d1, double d2, double delta) { 
    if (Double.compare(d1, d2) == 0) { 
     return false; 
    } 
    if ((Math.abs(d1 - d2) <= delta)) {  
     return false; 
    } 

    return true; 
} 

正如你可以看到相关的表达是Math.abs(d1 - d2) <= delta。当它使用Math.abs时,左侧始终为0或正数。因此它永远不会小于负值,所以此方法总是返回true,因此向调用者(assertEquals)指示您的值不同。

换句话说:改变三角洲的定义:

double delta = Math.abs(n * 1E-8); 
1

如果你读了Javadocs of JUnit Assert, assertEquals,你会看到delta确实应该是积极的:

断言两个双打或浮筒等于内正三角洲。

+0

那么为什么我的早期测试用例之一没有遇到同一问题: @Test public void standardCase_negative1000(){ double n = -1000; double result = csc143.newton.Roots.cbrt(n); double delta = n * 1E-8; assertEquals(“Standard cube root root -1000”,-10.0,result,delta); } – adub3