Test Instance Lifecycle
Test Instance Lifecycle
Para permitir que los métodos de prueba individuales se ejecuten de forma aislada y evitar efectos secundarios inesperados debido al estado mutable de las instancias de prueba, JUnit crea una nueva instancia de cada clase de prueba antes de ejecutar cada método de prueba (consulta Definitions). Este ciclo de vida de instancia de prueba “por método” es el comportamiento predeterminado en JUnit Jupiter y es análogo a todas las versiones anteriores de JUnit.
❕Ten en cuenta que la clase de prueba aún será instanciada si un método de prueba determinado está deshabilitado mediante una condición (por ejemplo,
@Disabled,@DisabledOnOs, etc.), incluso cuando el modo de ciclo de vida de instancia de prueba “por método” esté activo.
Si prefieres que JUnit Jupiter ejecute todos los métodos de prueba sobre la misma instancia de prueba, anota tu clase de prueba con @TestInstance(Lifecycle.PER_CLASS). Al usar este modo, se crea una nueva instancia de prueba una sola vez por clase de prueba. Por lo tanto, si tus métodos de prueba dependen del estado almacenado en variables de instancia, puede que necesites restablecer ese estado en los métodos anotados con @BeforeEach o @AfterEach.
El modo “por clase” tiene algunos beneficios adicionales frente al modo predeterminado “por método”. Específicamente, en el modo “por clase” es posible declarar @BeforeAll y @AfterAll en métodos no estáticos, así como en métodos predeterminados de interfaces. Además, este modo permite usar métodos @BeforeAll y @AfterAll dentro de clases de prueba @Nested.
A partir de Java 16, los métodos @BeforeAll y @AfterAll pueden declararse como estáticos en las clases de prueba @Nested.
Changing the Default Test Instance Lifecycle
Si una clase o interfaz de prueba no está anotada con @TestInstance, JUnit Jupiter utilizará un modo de ciclo de vida predeterminado. El modo estándar por defecto es PER_METHOD; sin embargo, es posible cambiar este valor predeterminado para la ejecución de todo un plan de pruebas.
Para cambiar el modo de ciclo de vida de instancia de prueba predeterminado, establece el parámetro de configuración junit.jupiter.testinstance.lifecycle.default con el nombre de una constante del enum definido en TestInstance.Lifecycle, sin importar mayúsculas o minúsculas. Este parámetro se puede proporcionar como una propiedad del sistema JVM, como un parámetro de configuración en el LauncherDiscoveryRequest que se pasa al Launcher, o a través del archivo de configuración de la Plataforma JUnit (consulta Configuration Parameters para más detalles).
Por ejemplo, para establecer el modo de ciclo de vida de instancia de prueba predeterminado en Lifecycle.PER_CLASS, puedes iniciar tu JVM con la siguiente propiedad del sistema:
-Djunit.jupiter.testinstance.lifecycle.default=per_class
Sin embargo, ten en cuenta que establecer el modo de ciclo de vida de instancia de prueba predeterminado mediante el archivo de configuración de la Plataforma JUnit es una solución más robusta, ya que dicho archivo puede incluirse en un sistema de control de versiones junto con tu proyecto, y por lo tanto puede ser utilizado tanto en los IDEs como en tu herramienta de construcción (build tool).
Para establecer el modo de ciclo de vida de instancia de prueba predeterminado en Lifecycle.PER_CLASS mediante el archivo de configuración de la Plataforma JUnit, crea un archivo llamado junit-platform.properties en la raíz del classpath (por ejemplo, en src/test/resources) con el siguiente contenido:
junit.jupiter.testinstance.lifecycle.default = per_class
⚠️ Cambiar el modo predeterminado del ciclo de vida de la instancia de prueba puede dar lugar a resultados impredecibles y construcciones frágiles si no se aplica de forma coherente. Por ejemplo, si la compilación configura la semántica “por clase” como predeterminada, pero las pruebas en el IDE se ejecutan utilizando la semántica “por método”, puede resultar difícil depurar los errores que se produzcan en el servidor de compilación. Por lo tanto, se recomienda cambiar el valor por defecto en el archivo de configuración de la plataforma JUnit en lugar de a través de una propiedad del sistema JVM.