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;
- Creamos los tests para validar la funcionalidad del método. En este ejemplo, he creado un test mediante la anotación de jUnit 
@RepeatedTesty 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");
}
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);
}
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)