DEV Community 👩‍💻👨‍💻

Cover image for JUnit: Cómo ejecutar un test N iteraciones
Ciro
Ciro

Posted on

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.

Top comments (0)

Join us at DEV

Find what you were looking for? Join hundreds of thousands of developers on DEV so you can:

 
🌚 Enable dark mode
🔠 Change your default font
📚 Adjust your experience level to see more relevant content