Junit Test Execution Order
Junit: Test execution order
De manera predeterminada, las clases y métodos de prueba se ordenarán utilizando un algoritmo que es determinista pero deliberadamente no obvio. Esto asegura que las ejecuciones subsecuentes de un conjunto de pruebas ejecuten las clases y métodos de prueba en el mismo orden, permitiendo así la repetibilidad de las compilaciones.
Method Order
Aunque las pruebas unitarias verdaderas no deben depender del orden en que se ejecutan, hay ocasiones en las que es necesario imponer un orden específico de ejecución de los métodos de prueba, por ejemplo, cuando se escriben pruebas de integración o pruebas funcionales donde la secuencia de las pruebas es importante, especialmente en conjunto con @TestInstance(Lifecycle.PER_CLASS).
Para controlar el orden en que se ejecutan los métodos de prueba, anota tu clase de prueba o interfaz de prueba con @TestMethodOrder y especifica la implementación deseada de MethodOrderer. Puedes implementar tu propio MethodOrderer personalizado o usar una de las siguientes implementaciones incorporadas de MethodOrderer.
- MethodOrderer.DisplayName: ordena los métodos de prueba alfanuméricamente según sus nombres de visualización (consulta las reglas de precedencia para la generación de nombres de visualización).
- MethodOrderer.MethodName: ordena los métodos de prueba alfanuméricamente según sus nombres y las listas de parámetros formales.
- MethodOrderer.OrderAnnotation: ordena los métodos de prueba numéricamente según los valores especificados mediante la anotación @Order.
- MethodOrderer.Random: ordena los métodos de prueba de manera pseudo-aleatoria y admite la configuración de una semilla personalizada.
- MethodOrderer.Alphanumeric: ordena los métodos de prueba alfanuméricamente según sus nombres y las listas de parámetros formales; obsoleto a favor de MethodOrderer.MethodName, será eliminado en la versión 6.0.
See also: Wrapping Behavior of Callbacks
El siguiente ejemplo demuestra cómo garantizar que los métodos de prueba se ejecuten en el orden especificado mediante la anotación @Order.
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
@TestMethodOrder(OrderAnnotation.class)
class OrderedTestsDemo {
@Test
@Order(1)
void nullValues() {
// perform assertions against null values
}
@Test
@Order(2)
void emptyValues() {
// perform assertions against empty values
}
@Test
@Order(3)
void validValues() {
// perform assertions against valid values
}
}
Setting the Default Method Orderer
Puedes usar el parámetro de configuración junit.jupiter.testmethod.order.default para especificar el nombre completo de la clase de la implementación de MethodOrderer que deseas usar de manera predeterminada. Al igual que para el ordenado configurado mediante la anotación @TestMethodOrder, la clase proporcionada debe implementar la interfaz MethodOrderer. El orden predeterminado se usará para todas las pruebas, a menos que la anotación @TestMethodOrder esté presente en una clase o interfaz de prueba envolvente.
Por ejemplo, para usar el ordenado MethodOrderer.OrderAnnotation de manera predeterminada, deberías configurar el parámetro con el nombre completo de la clase correspondiente (por ejemplo, en src/test/resources/junit-platform.properties):
junit.jupiter.testmethod.order.default = \
org.junit.jupiter.api.MethodOrderer$OrderAnnotation
De manera similar, puedes especificar el nombre completo de cualquier clase personalizada que implemente MethodOrderer.
Class Order
Aunque las clases de prueba normalmente no deberían depender del orden en que se ejecutan, hay ocasiones en las que es deseable imponer un orden específico de ejecución de las clases de prueba. Por ejemplo, podrías querer ejecutar las clases de prueba en un orden aleatorio para asegurarte de que no existan dependencias accidentales entre ellas, o podrías querer ordenarlas para optimizar el tiempo de construcción, como se describe en los siguientes escenarios:
- Ejecutar primero las pruebas que fallaron previamente y las pruebas más rápidas: modo “fallar rápido”
- Con la ejecución en paralelo habilitada, programar primero las pruebas más largas: modo “duración más corta del plan de pruebas”
- Otros casos de uso diversos
Para configurar el orden de ejecución de las clases de prueba globalmente para todo el conjunto de pruebas, utiliza el parámetro de configuración junit.jupiter.testclass.order.default para especificar el nombre completo de la clase del ClassOrderer que deseas usar. La clase proporcionada debe implementar la interfaz ClassOrderer.
Puedes implementar tu propio ClassOrderer personalizado o usar una de las siguientes implementaciones de ClassOrderer que ya vienen integradas.
Puedes implementar tu propio ClassOrderer personalizado o utilizar una de las siguientes implementaciones integradas de ClassOrderer:
- ClassOrderer.ClassName: ordena las clases de prueba alfanuméricamente según sus nombres de clase completamente calificados.
- ClassOrderer.DisplayName: ordena las clases de prueba alfanuméricamente según sus nombres para mostrar (display names) —consulta las reglas de precedencia para la generación de nombres para mostrar.
- ClassOrderer.OrderAnnotation: ordena las clases de prueba numéricamente según los valores especificados mediante la anotación
@Order. - ClassOrderer.Random: ordena las clases de prueba de forma seudoaleatoria y permite configurar una semilla personalizada.
Por ejemplo, para que se respete la anotación @Order en las clases de prueba, debes configurar el orden de clases con la clase ClassOrderer.OrderAnnotation mediante el parámetro de configuración con el nombre completo de la clase correspondiente (por ejemplo, en src/test/resources/junit-platform.properties):
junit.jupiter.testclass.order.default = \
org.junit.jupiter.api.ClassOrderer$OrderAnnotation
El ClassOrderer configurado se aplicará a todas las clases de prueba de nivel superior (incluidas las clases de prueba estáticas anidadas) y las clases de prueba @Nested.
❕Las clases de prueba de nivel superior se ordenarán en relación con las demás, mientras que las clases de prueba con @nested se ordenarán en relación con otras clases de prueba @nested que compartan la misma clase.
Para configurar el orden de ejecución de las clases de prueba localmente para las clases anotadas con @Nested, declara la anotación @TestClassOrder en la clase que contiene las clases @Nested que deseas ordenar, y proporciona una referencia de clase a la implementación de ClassOrderer que deseas utilizar directamente en la anotación @TestClassOrder. El ClassOrderer configurado se aplicará recursivamente a las clases @Nested y a sus respectivas clases @Nested.
Ten en cuenta que una declaración local de @TestClassOrder siempre tiene prioridad sobre una declaración heredada de @TestClassOrder o sobre un ClassOrderer configurado globalmente mediante el parámetro de configuración junit.jupiter.testclass.order.default.
El siguiente ejemplo demuestra cómo garantizar que las clases de prueba @Nested se ejecuten en el orden especificado mediante la anotación @Order.
import org.junit.jupiter.api.ClassOrderer;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestClassOrder;
@TestClassOrder(ClassOrderer.OrderAnnotation.class)
class OrderedNestedTestClassesDemo {
@Nested
@Order(1)
class PrimaryTests {
@Test
void test1() {
}
}
@Nested
@Order(2)
class SecondaryTests {
@Test
void test2() {
}
}
}