繁体   English   中英

JUnit测试用例失败

[英]JUnit test case failure

这是我创建的立方根方法的测试用例的JUnit代码,它实现了Newton的方法:

@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>

我觉得这与我的“delta”值(在这种情况下是-640 )有关,因为当我在assertEquals()方法中用640 (而不是-640 )替换“delta”时,我没有失败...

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

看一下Assert类的源代码 比较双打的地方是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 )指示您的值不同。

换句话说:将delta的定义更改为:

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

如果您阅读JUnit AssertJavadocs,断言等 ,您会看到delta确实应该是正数:

断言两个双精度或浮点数等于正三角形。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM