2014-10-28 49 views
4

我想要做一个断言,其中实际值在期望值的固定+/-值或期望值的百分比+/-值内。JUnit或Hamcrest是否有宽容断言?

虽然google搜索,我注意到NUnit的有应该是一个很好的语法:

Assert.That(5.5, Is.EqualTo(5).Within(0.075); 
Assert.That(5.5, Is.EqualTo(5).Within(1.5).Percent; 

是否JUnit的或Hamcrest有类似的东西,我可以使用?如果不是,有没有一种很好的方式来表达这种行为?

回答

4

简短的回答 - 是的。

老式的org.junit.Assert有一个方法assertEquals(java.lang.String message, float expected, float actual, float delta),和一堆类似的方法双打,重载的变种没有消息,和类似的实现assertArrayEquals

如果你想使用Hamcrest,那么closeTo匹配器就是你要找的。

编辑:
为了解决这个问题的有关百分比的评论 - 没有出的现成的匹配了这一点,但你可以通过把两个,并确保他们是gimmy钻机自己的东西在期望的比率和它的倒数之间。以OP为例:

float expected = 5.0; 
float actual = 5.5 
float ratio = 1.0075; 
float inverse = 1/ratio; 

float div = actual/expected; 

assertThat(div, allOf(greaterThan(inverse), lessThan(ratio))); 

这是一个(很好,很多)笨重,但它应该做的伎俩。

+0

closeTo匹配器确实将两个值与固定的容差值进行比较。没有什么,也有百分比容差。 – algorithmic 2014-10-28 18:55:40

+0

@algorithmic不幸的是,这样做并不容易,现成的方式,但看到我的编辑解决方案。 – Mureinik 2014-10-28 19:07:20

+0

allOf,greaterThan和lessThan应该这样做,只要我计算期望值的百分比值,我期望公差处于和使用该值。如果我计算了我愿意容忍的百分比值,我想我也可以使用closeTo。我正在标记你的答案,因为这几乎是我想要的。 – algorithmic 2014-10-28 19:19:17

3

补充Mureinik的回答是:

要使用相对误差/百分比断言,你可以乘:

double closeTo5 = 4.6; 
    double relativeTolerance = 0.1; 
    double expected = 5; 

    assertThat(closeTo5, 
     is(closeTo(expected, expected*relativeTolerance))); 

或者,如果你想获得幻想,写自己的匹配(这不难)...

+0

我认为可以忽略对“is()”的调用,尽管有些人可能会发现它更具可读性。 – DPM 2018-01-13 19:54:33