En JUnit 4 el parámetro anotación "tiempo de espera" se puede utilizar para forzar una prueba para detenerse después de la cantidad de tiempo dado:
@Test(timeout=100)
public void infinity() {
while(true);
}
¿Cómo se puede hacer esto en JUnit 5?
En estrecha relación con (y el código tomado de) el parámetro de tiempo de espera para la anotación de Prueba Tipo , pero para JUnit 5.
La estricta equivalente del timeout
atributo es el declarativa @Timeout
anotación.
De la documentación JUnit 5 :
La
@Timeout
anotación le permite a uno para declarar que una prueba, prueba de fábrica, plantilla de prueba, o método del ciclo de vida debería fallar si su tiempo de ejecución es superior a una duración determinada. La unidad de tiempo de los valores predeterminados de duración a segundos, pero se puede configurar.
Por ejemplo :
@Test
@Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
void infinity() {
// fails if execution time exceeds 100 milliseconds
//...
}
Assertions.assertTimeout()
y Assertions.assertTimeoutPreemptively()
son los nuevos conceptos introducidos en JUnit 5 (no existentes en JUnit 4). Estas son las alternativas a @Timeout
que reducen el tiempo de espera a un conjunto específico de los estados: éstos definidos en el Executable
o en el Supplier
pasado como parámetro.
Estos dos métodos (con un nombre muy cerca) abordan el mismo objetivo general, pero con una diferencia sutil.
assertTimeoutPreemptively()
preventivamente aborta la Executable/Supplier
si el tiempo de espera se produce mientras que assertTimeout()
no lo hace.
Para lograrlo, assertTimeoutPreemptively()
se ejecuta el proporcionado Executable/Supplier
en un hilo diferente que la del código de llamada, mientras que assertTimeout()
la ejecuta en el mismo hilo.
Advertencia de la documentación oficial: Código / bibliotecas que dependen de la java.lang.ThreadLocal
de almacenamiento para la configuración de ejecución de la prueba / desmontaje pueden tener efectos secundarios indeseables con assertTimeoutPreemptively()
ya que ejecuta las instrucciones proporcionadas en un hilo diferente.