Ir al contenido principal
Versión: 6.2 🚧

Configuración a Nivel de Paquete

[Traducción Beta No Oficial]

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Configuración a Nivel de Paquete

Esta página describe cómo usar la configuración a nivel de paquete para compartir configuraciones entre múltiples specs en el mismo paquete.

nota

La configuración a nivel de paquete se introdujo en Kotest 6.0. Si estás usando una versión anterior, actualiza para aprovechar esta función.

precaución

La configuración a nivel de paquete es una característica exclusiva de JVM.

Introducción

Al escribir tests, a menudo necesitas aplicar la misma configuración a múltiples archivos de pruebas en el mismo paquete. En lugar de repetir la configuración para cada spec o establecerla a nivel global del proyecto, puedes usar la configuración a nivel de paquete para definir una configuración compartida que se aplique a todos los specs en un paquete específico y sus subpaquetes.

La configuración a nivel de paquete funciona creando una clase llamada PackageConfig que extienda AbstractPackageConfig en el paquete donde deseas aplicar la configuración.

Uso Básico

Para establecer una configuración predeterminada para todos los specs en un paquete, crea una clase llamada PackageConfig que extienda AbstractPackageConfig en el paquete objetivo:

// In package: com.example.mypackage
class PackageConfig : AbstractPackageConfig() {
override val timeout = 5.seconds
override val invocations = 2
override val failfast = true
}

Con esta configuración:

  • Todos los tests en specs dentro del paquete com.example.mypackage tendrán un timeout de 5 segundos

  • Todos los tests se ejecutarán dos veces (2 invocaciones)

  • Los tests usarán modo failfast

Esta configuración también se aplicará a todos los subpaquetes (ej. com.example.mypackage.subpackage).

Orden de Resolución de Configuraciones

Kotest usa el siguiente orden para resolver valores de configuración:

  1. Configuración específica de la prueba (definida mediante .config())

  2. Sobrescrituras a nivel de especificación (mediante variables en la clase spec)

  3. Configuración predeterminada de la especificación (definida mediante defaultTestConfig)

  4. Configuración a nivel de paquete (establecida vía PackageConfig)

  5. Configuración del paquete padre (si existe)

  6. Configuración global (establecida vía ProjectConfig)

  7. Propiedades del sistema o variables de entorno

Esto significa que las configuraciones más específicas anularán las más generales. Por ejemplo, si estableces un timeout tanto a nivel de test como en una configuración de paquete, se usará el timeout a nivel de test.

Opciones de Configuración Disponibles

AbstractPackageConfig soporta las siguientes opciones de configuración:

  • isolationMode: Controla cómo se aíslan los tests entre sí

  • assertionMode: Controla el comportamiento de las aserciones

  • testCaseOrder: Controla el orden de ejecución de los tests

  • timeout: Tiempo máximo permitido para ejecutar un test

  • invocationTimeout: Tiempo máximo permitido para cada invocación individual

  • failfast: Activa el modo "fallo rápido" al primer error

  • retries: Número de reintentos para pruebas fallidas

  • coroutineDebugProbes: Habilita el trazado mejorado de corrutinas cuando ocurre un error

  • coroutineTestScope: Indica si se debe usar un ámbito de corrutinas para pruebas

  • duplicateTestNameMode: Controla qué hacer al detectar nombres de tests duplicados

  • assertSoftly: Indica si se deben usar aserciones suaves para todas las pruebas

  • testExecutionMode: Controla cómo se ejecutan los tests (secuencial o concurrentemente)

  • extensions: Lista de extensiones aplicables a todos los tests del paquete

Ejemplos

Ejemplo: Configuración de tiempos de espera y reintentos

// In package: com.example.api.tests
class PackageConfig : AbstractPackageConfig() {
// All API tests might need longer timeouts and retries
override val timeout = 30.seconds
override val retries = 3
}

Ejemplo: Configuración del modo de ejecución de pruebas

// In package: com.example.unit.tests
class PackageConfig : AbstractPackageConfig() {
// Run all unit tests concurrently for faster execution
override val testExecutionMode = TestExecutionMode.Concurrent
}

Ejemplo: Adición de extensiones para un paquete

// In package: com.example.database.tests
class PackageConfig : AbstractPackageConfig() {
// Add a database container for all database tests
override val extensions = listOf(
ContainerExtension(PostgreSQLContainer<Nothing>().withDatabaseName("testdb"))
)
}

Jerarquía de paquetes

Cuando tienes configuraciones a nivel de paquete en diferentes niveles de tu jerarquía de paquetes, la configuración más cercana al paquete de la especificación tiene prioridad.

Por ejemplo, si tienes:

com.example.PackageConfig
com.example.api.PackageConfig
com.example.api.v1.PackageConfig

Y tu prueba está en com.example.api.v1.UserTest, entonces:

  1. Se aplicará primero com.example.api.v1.PackageConfig

  2. Los valores no configurados allí recurrirán a com.example.api.PackageConfig

  3. Los valores no configurados en ninguno de los dos recurrirán a com.example.PackageConfig

  4. Finalmente, los valores no configurados en ningún paquete recurrirán a la configuración del proyecto

Detalles de implementación

Kotest detecta automáticamente las clases llamadas PackageConfig que extienden AbstractPackageConfig en tiempo de ejecución. La detección se produce cuando se ejecuta una prueba, y Kotest busca configuraciones de paquete en el paquete de la prueba y todos los paquetes padre.

Por razones de rendimiento, las configuraciones de paquete se almacenan en caché después de su primera carga, por lo que los cambios en una clase de configuración de paquete solo surtirán efecto después de reiniciar la ejecución de pruebas.