Tengo una pregunta sobre junit assertEquals
para probar valores dobles. Al leer el documento de API, puedo ver:
@Deprecated public static void assertEquals(double expected, double actual)
Obsoleto. En su lugar, utilice asirEquals (doble esperado, doble real, doble epsilon)
¿Qué significa el epsilon
valor? (Epsilon es una letra en el alfabeto griego, ¿verdad?).
¿Alguien puede explicarme cómo usarlo?
java
unit-testing
junit
Édipo Féderle
fuente
fuente
<=
no<
.doubleIsDifferent
(para comparar valores dobles) y vuelveMath.abs(d1 - d2) > delta
. Entonces, si la diferencia entre d1 y d2 es mayor que delta, eso significa que los valores son diferentes y devolverán verdadero. Devolverá falso si los valores se consideran iguales. Ese método se invoca en afirmar los Equivalentes directamente y si devuelve verdadero, los invocaránfailNotEquals
y el resultado de la prueba será un error.¿Qué versión de JUnit es esta? Solo he visto delta, no épsilon, ¡pero ese es un problema secundario!
Desde el JUnit javadoc :
Probablemente sea exagerado, pero normalmente uso un número muy pequeño, por ejemplo
Si usa aserciones Hamcrest , puede usar el estándar
equalTo()
con dos dobles (no usa un delta). Sin embargo, si quieres un delta, puedes usarcloseTo()
(ver javadoc ), por ejemploPara su información, el próximo JUnit 5 también hará que el delta sea opcional cuando llame
assertEquals()
con dos dobles. La implementación (si está interesado) es:fuente
Los cálculos de punto flotante no son exactos: a menudo hay errores de redondeo y errores debido a la representación. (Por ejemplo, 0.1 no puede representarse exactamente en coma flotante binaria).
Debido a esto, comparar directamente dos valores de coma flotante para la igualdad generalmente no es una buena idea, ya que pueden ser diferentes en una pequeña cantidad, dependiendo de cómo se calcularon.
El "delta", como se llama en los javadocs JUnit , describe la cantidad de diferencia que puede tolerar en los valores para que se sigan considerando iguales. El tamaño de este valor depende completamente de los valores que está comparando. Al comparar dobles, generalmente uso el valor esperado dividido por 10 ^ 6.
fuente
La cuestión es que dos dobles pueden no ser exactamente iguales debido a problemas de precisión inherentes a los números de coma flotante. Con este valor delta puede controlar la evaluación de igualdad basada en un factor de error.
Además, algunos valores de punto flotante pueden tener valores especiales como NAN e -Infinity / + Infinity que pueden influir en los resultados.
Si realmente tiene la intención de comparar que dos dobles son exactamente iguales, es mejor compararlos como una representación larga
O
Lo que puede tener en cuenta estos matices.
No he profundizado en el método Assert en cuestión, pero solo puedo suponer que el anterior fue desaprobado para este tipo de problemas y el nuevo los tiene en cuenta.
fuente
Epsilon es una diferencia entre
expected
yactual
valores que usted puede aceptar pensando que son iguales. Puedes configurar.1
por ejemplo.fuente
Tenga en cuenta que si no está haciendo matemáticas, no hay nada de malo en afirmar valores exactos de coma flotante. Por ejemplo:
En este caso, usted quiere asegurarse de que es realmente
MIN_VALUE
, no es cero o-MIN_VALUE
oMIN_NORMAL
o algún otro valor muy pequeño. Puedes decirpero esto te dará una advertencia de desaprobación. Para evitar eso, puede llamar en su
assertEquals(Object, Object)
lugar:Y, si realmente quieres lucir inteligente:
O simplemente puede usar las afirmaciones de estilo fluido de Hamcrest:
Si el valor que se está comprobando lo hace viene de hacer un poco de matemáticas, sin embargo, utilizar el épsilon.
fuente
fuente