1

Buen Dia, he empezado a realizar pruebas unitarias usando Junit pero tengo un dudad respecto a eso En mi clase principal tengo este código sencillo

public double suma(double num1, double num2) {
    double suma = num1 + num2;
    return suma;
}

y en las clase donde hago las pruebas tengo esto

@Test
public void testSuma() {
    System.out.println("suma");
    double num1 = 4.1;
    double num2 = 5.2;
    Prueba instance = new Prueba();
    double expResult = 9.3;
    double result = instance.suma(num1, num2);
    assertEquals(expResult, result, 0.0);
    if (result != expResult) {
        fail("The test case is a prototype.");
    }
}

No hay ningun error pero estuve buscando información sobre delta y decía que era para dar un margen de error en los decimales, pero aun no entiendo bien eso, podrían darme un ejemplo sobre ese punto?

Unknown
  • 23
  • 5
  • Es exactamente lo que dices. Por ejemplo `assertEquals(1.0, 1.1, 0.0);` fallaría pero `assertEquals(1.0, 1.1, 0.2);` sería correcto porque la diferencia es menor que delta, digamos, es menor que el *"margen permitido"*. Eso se establece así porque las operaciones con punto flotante en informática no son nada fáciles de hacer. Lo que para ti es muy obvio para un pc no tanto. Aquí tienes una página interesante que lo explica: https://floating-point-gui.de/ – Benito-B Jan 24 '22 at 17:32
  • Como extra: assertEquals se encarga ya de hacer que el test falle si no es verdad, el `if` es innecesario – Pablo Lozano Jan 24 '22 at 17:49
  • hola @Benito-B, probé tu ejemplo `assertEquals(1.0, 1.1, 0.2);` pero la prueba falla – Unknown Jan 24 '22 at 18:59
  • Fallará por tu `if (result != expResult) { fail("The test case is a prototype."); }` pero te aseguro que esa aserción es válida. De hecho, acabo de lanzarla en un test por probar (la había escrito de memoria) y el test pasa perfecto... Pero que pase perfecto no quiere decir que luego tú no estés fallando el test más adelante (dentro del if... `fail` hace fallar el test exactamente igual que una aserción fallida). – Benito-B Jan 24 '22 at 19:11
  • @Benito-B Acabo de quitar el `if` pero la prueba igual falla, qué podría estar mal? solo he cambiado los valores por los tuyos en el código de arriba – Unknown Jan 24 '22 at 19:14
  • @Benito-B acabo de realizar el test y pasa tal y como dices – Unknown Jan 24 '22 at 19:43
  • Pero como haría para calcular el delta para ciertas cantidades? – Unknown Jan 24 '22 at 19:44
  • no hay un único criterio para definir el delta. Depende del nivel de resolución que requieras. – Alfabravo Jan 25 '22 at 21:34

1 Answers1

1

¿Revisaste la documentación oficial? ¿Probaste tu código con diferentes valores? ¿No? Pues muy mal ;)

Ese delta permite fijar un márgen de error para el resultado. Puede que estés operando con variables de punto flotante y ya sabemos que ahí no tienes absoluta precisión debido a la forma como se representan los valores numéricos en un lenguaje dado y cómo los manipula al operar sobre ellos. Puede ser también que tu cálculo es muy sensible a variables como la hora o a valores aleatorios... casos así.

Por ejemplo, si vas a calcular algo y la respuesta puede ser 0.932874298374 o 0.9300000000 o 0.9399999999 por puras particularidades del cálculo entre variables... pero a ti sólo te interesa que tu escenario de prueba compruebe que el valor es 0.93, pues usas este parámetro para que la comparación no falle por cifras significativas fuera de tu control. Estás ajustando el grado de precisión de la validación.

Si, por ejemplo, tienes tu clase de prueba y haces

private static final double DELTA = 0.5d;

@Test
public void testSuma() {
    System.out.println("suma");
    double num1 = 4.1;
    double num2 = 5.2;
    Prueba instance = new Prueba();
    double expResult = 9.3;
    double result = instance.suma(num1, num2);
    assertEquals(expResult, result, DELTA);
    if (result != expResult) {
        fail("The test case is a prototype.");
    }
}

Esto internamente llama un método que valida Math.abs(expResult - result) > DELTA y, si eso da true, significa que el número es diferente. Si el valor absoluto de la diferencia entre los valores está por debajo de tu delta (menos de 0.5 por encima o por debajo en este ejemplo), para efectos prácticos serán iguales.

Alfabravo
  • 7,352
  • 5
  • 21
  • 31