Ir al contenido principal
Versión: 5.3.x

Lanzamiento 5.0

[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 →

Este documento está en desarrollo y se completará en los próximos días tras el lanzamiento de la versión 5.0.

Cambios importantes

Kotlin 1.6 es ahora la versión mínima requerida

A partir de la versión 5, Kotest requiere Kotlin 1.6. Esta decisión se basa en dos motivos.

En primer lugar, la característica principal en la serie de lanzamientos 5.0 es el soporte para pruebas multiplataforma, y existen incompatibilidades en el compilador entre Kotlin 1.5 y 1.6. Dar soporte a ambas versiones añadiría complejidad innecesaria al proceso de compilación.

En segundo lugar, las duraciones kotlin.time.Duration han alcanzado estabilidad en la versión 1.6, y Kotest depende internamente de estas. Queríamos aprovechar la funcionalidad multiplataforma que ofrecen las duraciones de Kotlin sin problemas derivados de cambios en versiones anteriores de estas clases.

Soporte para el compilador JavaScript heredado eliminado

El soporte para el compilador JavaScript heredado ha sido discontinuado. Si ejecutas pruebas en JS heredado, deberás continuar usando Kotest 4.6.x o configurar tu compilación de pruebas JavaScript para usar exclusivamente el compilador IR.

El soporte de pruebas para el compilador JavaScript heredado dependía de funcionalidad eliminada en el compilador IR (concretamente, que el adaptador de framework ya no funciona con módulos de terceros). Para la versión 5.0, Kotest proporciona un plugin de compilador que integra pruebas directamente en el resultado compilado, exactamente como funciona el soporte de kotlin.test.

Objeto de configuración global eliminado

En versiones anteriores, Kotest permitía actualizar la configuración mediante un objeto global llamado configuration (denominado project en versiones más antiguas). A partir de este lanzamiento, se ha eliminado esta val de nivel superior.

La razón de su eliminación es que el estado global complicaba el uso de múltiples instancias del Test Engine en la misma JVM, además de que no existía una semántica precisa para el orden de actualizaciones de una val de nivel superior.

El primer aspecto era principalmente un problema al probar el propio Kotest, ya que los usuarios normalmente no crean instancias de TestEngine directamente, sino que ejecutan pruebas mediante gradle o intellij.

Esta val de nivel superior no estaba documentada, por lo que la mayoría de usuarios desconocían su existencia. El enfoque recomendado para definir la configuración de Kotest sigue siendo ProjectConfig o propiedades del sistema.

Clases experimentales de pruebas de datos trasladadas

Las funciones experimentales withData para pruebas de datos añadidas en la versión 4.5 bajo el paquete io.kotest.datatest se han movido al nuevo módulo kotest-framework-datatest.

Nota: Estas son independientes de las funciones forAll y forNone para pruebas de datos, presentes en Kotest desde la versión 2.0.

Método obsoleto Arb.value eliminado de las pruebas de propiedades

Se ha eliminado el método Arb.values() de la interfaz Arb. Este método se marcó como obsoleto en la versión 4.3 en favor de Arb.sample, introducido para permitir mapeo plano (flat-mapping) de Arb. Solo afectará a quienes hayan implementado un arb personalizado que extienda Arb directamente y sigan usando el método obsoleto. Los usos existentes de los constructores arbitrary no se ven afectados, siendo siempre la forma preferida de crear arbitrarios personalizados.

Volcado de configuración al inicio desactivado por defecto

El motor ya no registra la configuración en la consola durante el inicio por defecto. Para habilitar esta salida, establece la propiedad del sistema o variable de entorno kotest.framework.dump.config en true.

Eliminación de métodos obsoletos

  • Se han eliminado los matchers de canales shouldReceiveWithin y shouldReceiveNoElementsWithin.

  • La extensión RuntimeTagExtension (anteriormente obsoleta) ha sido reactivada pero trasladada a un nuevo paquete.

  • RuntimeTagExpressionExtension se ha movido a un nuevo paquete.

Cambios en los inspectores

Al usar inspectores, se ha eliminado la propiedad de sistema obsoleta kotlintest.assertions.output.max. Fue reemplazada por kotest.assertions.output.max en la versión 4.0 cuando el proyecto cambió su nombre de KotlinTest a Kotest.

Obsoletas

Estado de la prueba

El enum TestStatus ha quedado obsoleto en favor del ADT TestResult. En lugar de verificar result.status en AfterTestListener, ahora debes verificar directamente el resultado. Ejemplo:

when (result) {
is TestResult.Success -> ...
is TestResult.Error -> ...
}

Deprecación del método SpecExtension.intercept(KClass)

El método intercept(KClass) en SpecExtension ha quedado obsoleto y se ha añadido SpecRefExtension. El método obsoleto tenía comportamiento ambiguo cuando se usaba con un IsolationMode que creaba múltiples instancias de una spec. Los nuevos métodos tienen garantías precisas sobre cuándo se ejecutarán.

  • Las SpecRefExtensions se ejecutarán una vez por clase.

  • Las SpecExtensions se ejecutarán una vez por instancia.

Configuración predeterminada del caso de prueba

Los contenedores defaultTestCaseConfig en Specs y configuración de proyecto han quedado obsoletos. Esto se debió a que no era posible especificarlos tanto a nivel de spec como de configuración de proyecto permitiendo que los ajustes se heredasen.

En su lugar, debes establecer valores predeterminados por ajuste, que se heredarán de prueba -> spec -> configuración.

Por ejemplo, en lugar de esto:

class MySpec: FunSpec() {
init {
override fun defaultTestCaseConfig() = TestCaseConfig(tags = setOf(Foo, Bar), timeout = 100.seconds)
test("foo") {
// will time out after 100 seconds and has tags Foo and Bar applied
}
}
}

Deberías hacer:

class MySpec: FunSpec() {
init {

tags(Foo, Bar)
timeout = 100.seconds

test("foo") {
// will time out after 100 seconds and has tags Foo and Bar applied
}
}
}

Deberías hacer:

Nota: La segunda variante siempre ha sido posible, pero la primera ya no se recomienda.

La propiedad val name dentro de Listener ha quedado obsoleta. Se usaba para que errores de múltiples callbacks before/after de spec apareciesen con nombres únicos personalizados. El framework ahora garantiza que los nombres sean únicos, así que esta propiedad ya no es necesaria y se ignora.

Otras obsolescencias

  • SpecInstantiationListener ha quedado obsoleto en favor de InstantiationListener e InstantiationErrorListener, ambos soportan funciones de suspensión. SpecInstantiationListener es un remanente de antes de que existieran corrutinas en Kotlin y carecía de soporte para ellas.

  • SpecIgnoredListner (nota: error tipográfico) ha sido renombrado a IgnoredSpecListener.

  • El método listeners para añadir listeners a una Spec ha quedado obsoleto. Al añadir listeners directamente a specs, ahora deberías preferir extensions() en lugar de listeners().

  • CompareMode / CompareOrder para shouldEqualJson ha quedado obsoleto en favor de compareJsonOptions { }