Ciro
Posted on November 10, 2022
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.
Posted on November 10, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.