2012-08-04 6 views
4

assertEquals pour les doubles est obsolète. J'ai trouvé que le formulaire avec Epsilon devrait être utilisé. C'est à cause de la rigueur impossible à 100% des doubles. Mais de toute façon j'ai besoin de comparer deux doubles (résultat attendu et réel), mais je ne sais pas comment le faire.Comment affirmer deux doubles dans JUnit Utiliser assertEquals avec Epsilon?

Au moment de mon test ressemble:

@Test 
public void testCalcPossibleDistancePercentageCount() { 
    int percentage = 100; 
    assertEquals("Wrong max possible value for %" + percentage, 110.42, processor.calcPossibleValue(percentage)); 
    percentage = 75; 
    /*corresponding assertions*/ 
} 

Voici 3 valeurs doubles et je reçois que je veux vérifier avec JUnit: 110,42, 2760,5 et 10931,58. A quoi devrait ressembler le test JUnit avec des assertions pour eux? Je les reçois comme résultat du calcul dans une méthode:

processor.calcPossibleValue(allowed_percentage){return /*Some weird formulae here*/;} 

Répondre

9

Vous devez ajouter un quatrième paramètre à l'appel assertEquals: le seuil dans lequel deux doubles doivent être considérés comme des « égaux ». Votre appel devrait ressembler à ceci:

assertEquals("Wrong max possible value for %" + percentage, 110.42, 
     processor.calcPossibleValue(percentage), 0.01); 

L'appel ci-dessus indique que si la valeur retournée par processor.calcPossibleValue(percentage) est de ± 0,01 de 110.42, les deux valeurs sont considérées comme égales. Vous pouvez modifier cette valeur pour la rendre aussi petite que nécessaire pour votre application. Pour plus d'informations, voir le JUnit documentation.

+0

Merci, votre réponse est simple et utile. – Dragon

1

Un double Java utilise le IEEE 754 64-bit format. Ce format a 52 bits de mantisse. Lorsque l'on compare 2 valeurs, l'epsilon doit prendre en compte l'ampleur de la valeur attendue. Par exemple, 0.01 peut fonctionner correctement pour 110.42 mais cela ne fonctionnera pas si la valeur attendue est> 2 . L'amplitude de 2 est si grande que 0,01 serait perdu en raison de la précision (c'est-à-dire seulement des bits de mantisse de 52 bits). Par exemple, 2 + 0,01 == 2 . Dans cet esprit, epsilon devrait être mis à l'échelle de la valeur attendue. Par exemple, valeur attendue 0 2 52 - 3 ou 110,42 ÷ 2 52 - 3 = 1,96 ... x 10 -13. J'ai choisi 2 52 - 3 car cela donnera une tolérance dans les 3 bits les moins significatifs de la mantisse. Une précaution est que si la valeur attendue est 0.0 alors cette formule calcule epsilon comme 0.0 qui peut être trop strict pour un cas particulier.

Une autre mise en garde est que NaN et ± ∞ ne sont pas manipulés.

0
Assert.assertTrue("Not equals", expectedDouble - actualDouble == 0); 

Il n'est pas nécessaire d'impliquer epsilon ou delta.

Questions connexes