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
@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");
}
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)