2016-02-13 45 views
7

Sono confuso riguardo al delta/precisione in assertEquals. Capisco che 0.034 mi darà la precisione per il mio codice di divisione, come illustrato di seguito:assertEquals Precision

public void testDivide() { 
     assertEquals(3.0, Arithmetic.divide(12.0, 4.0), 0.0); 
     assertEquals(3.3, Arithmetic.divide(10.0, 3.0), 0.034); 

     //fail("Not yet implemented"); 
    } 

Tuttavia, ho provato a cambiare a 0.03, il test non è riuscito. D'altra parte, quando lo cambio in 0.04, è riuscito, o anche se lo cambio a 0.034444 e così via, avrà successo. Posso sapere cosa significa il numero e come lo usiamo?

risposta

7

Si sta utilizzando:

assertEquals(double expected, double actual, double epsilon)

Dal doubles may not be exactly equal in qualsiasi lingua (problemi di precisione), Epsilon permette di descrivere come vicini devono essere.

Epsilon è definita come la deviazione massima dal expected risultato:

Math.abs(expected - actual) < epsilon 

Quindi, in sostanza, consente di deviare dalla expected esito (3.0 o 3.3 nei vostri casi) da
Arithmetic.divide(12.0, 4.0) - 3.0 = 3.0 - 3.0 = 0 e
Arithmetic.divide(10.0, 3.0) - 3.3 ≈ 3.3333333 -3.3 ≈ 0.3333333 rispettivamente.

Quindi, nel primo, come vedete, in realtà non è necessario un epsilon poiché i risultati expected e actual sono esattamente gli stessi. Nel secondo si dovrebbe consentire qualche deviazione come si vede che il risultato actual è circa > da 0.33333 rispetto allo expected uno.

+0

non è epsilon la precisione? – stack

+0

Questo è esattamente ciò che ho scritto :) È la precisione consentita nel tuo specifico 'assert' – Idos

2

Secondo: http://junit.sourceforge.net/javadoc/org/junit/Assert.html#assertEquals(double, doppia, doppia)

**delta** - the maximum delta between expected and actual for which both numbers are still considered equal. 

per delta = 0,3 Ora, Arithmetic.divide(10.0,3.0) - 3.0 = 0.333.. che è greater than 0.3, così assertEqual() fallisce

per delta = 0,4 Ora, Arithmetic.divide(10.0,3.0) - 3.0 = 0.333.. che è LESSER than 0.4, quindi assertEqual() passaggi