2014-10-28 63 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