JUnit: Cómo ejecutar un test N iteraciones

gekyzo

Ciro

Posted on November 10, 2022

JUnit: Cómo ejecutar un test N iteraciones

En ciertas ocasiones puede que necesitemos ejecutar un test N veces para poder asegurar su correcto funcionamiento.

Para ello, contamos con varias fórmulas. En primer lugar, vamos a considerar el siguiente escenario:

  • Queremos testear un método que nos genera un número aleatorio de N dígitos. El valora de N se pasa como parámetro a dicho método.
  • Creamos una clase de test de jUnit en la que declaramos el número de repeticiones o iteraciones que queremos ejecutar un determinado test.
private static final int NUMBER_REPETITIONS = 1_000_000;
Enter fullscreen mode Exit fullscreen mode
  • Creamos los tests para validar la funcionalidad del método. En este ejemplo, he creado un test mediante la anotación de jUnit @RepeatedTest y otro test simple en el que realizamos toda la lógica dentro de un bucle do-while.

Test A: utilizando la anotación @RepeatedTest.

import org.junit.jupiter.api.RepeatedTest;

@RepeatedTest(value = NUMBER_REPETITIONS)
void random_number_with_four_digits() {

    var low = 1000;
    var high = 9999;
    var numOfDigits = 4;
    var actual = RandomUtil.generateNumber(numOfDigits);
    assertTrue(high >= actual, "Error, random is too high");
    assertTrue(low <= actual, "Error, actual is too low");
}
Enter fullscreen mode Exit fullscreen mode

Test B: utilizando el bucle do-while.

@Test
void random_numbers_generator() {

    int iterationCount = 1;
    do {
        var low = 1000;
        var high = 9999;
        var numOfDigits = 4;
        var actual = RandomUtil.generateNumber(numOfDigits);
        assertTrue(high >= actual, "Error, random is too high");
        assertTrue(low <= actual, "Error, actual is too low");
        iterationCount++;
    } while (iterationCount <= NUMBER_REPETITIONS);
}
Enter fullscreen mode Exit fullscreen mode

Como podemos ver ambos tests afirman lo mismo, que el método generador de números aleatorios va a devolver un valor que se encuentra entre low y high.
En ambos casos el test se va a ejecutar tantas veces como indiquemos en la constante NUMBER_REPETITIONS.

Una vez contamos con este escenario, podemos realizar distintas pruebas alterando el valor de low, high, numOfDigits y NUMBER_REPETITIONS.

En esta ocasión quería calcular la diferencia de los tiempos de ejecución de cada tipos de test, y estas son las pruebas que he realizado:

Nº Iteraciones Test A (@RepeatedTest) Test B (do-while)
1_000 130 ms 13 ms
100_000 2600 ms 20 ms
1_000_000 Indeterminado 55 ms

En este ejemplo, los tests ejecutados mediante el bucle do-while han sido aproximadamente un 90% más rápidos que los ejecutados mediante la anotación @RepeatedTest, además de que para el caso de 1_000_000 iteraciones, no he podido obtener un resultado final ya que la aplicación se quedaba colgada.

💖 💪 🙅 🚩
gekyzo
Ciro

Posted on November 10, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related