Ir al contenido principal
Versión: 5.9.x

Registro de cambios

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

5.7.2 Septiembre de 2023

Correcciones

  • Revertido para compilar contra JDK 1.8

  • Eliminada la advertencia de autoscan

5.7.1 Septiembre de 2023

Correcciones

  • Corregida detección de timeout cuando withTimeout envuelve un trabajo bloqueante (#3675)

  • Usar object equals por defecto (#3671)

5.7.0 Septiembre de 2023

Mejoras

  • Refactorización de concurrencia #3623

  • Añadido soporte de Equality a todos los matchers contain* (#3662)

  • Añadido shouldBeEqualUsingFields (#3652)

  • Añadido soporte para tipos nulables en funciones de test (#3665)

  • Composición de Matcher.any (#3664)

  • Conversión de Matcher.all a multiplataforma (#3663)

  • Permitir escaneo de jars anidados mediante configuración (#3644)

  • Vinculación de BlockHoundMode a corrutinas, eliminando restricciones (#3622)

  • Añadida versión en secuencia para monotonic/strictly inc/dec (#3645)

  • Reimplementadas funciones no deterministas (#3597)

  • Añadida advertencia para autoscan #3640

  • Añadido bloque expect para omitir tests (#3596)

  • Añadida bandera includeNonFiniteEdgeCases para arbitrarios double y float (#3638)

  • Arb.offsetDateTime basado en Instant (#3632)

  • Reimplementación de KProperty0<T>.shouldHaveValue como matcher (#3637)

  • Añadido soporte adicional para java.time en enlace reflexivo (#3636)

  • Añadidas aserciones para KProperty0 (#3621)

  • Implementación de Arb.list con soporte para Arb<IntRange> y Arb.intRange (#3618)

  • Añadidas opciones de configuración para reintentos (#3600)

  • Implementados hooks beforeInvocation y afterInvocation (#3589)

  • Añadido soporte para Arb<Date> (#3554)

  • Añadido soporte para permutaciones parciales (#3523)

  • Añadido exhaustive enumsExcept (#3552)

Correcciones

  • Corregido orden de callbacks afterXX (#3639)

  • Actualizado manejo de NaN en aserciones (#3661)

  • Invocar beforeSpec solo si se ejecuta un test (#3649)

  • Filtrar éxito en matcher.all (#3646)

  • Añadido allowOutOfOrderCallbacks (#3642)

  • Actualizada documentación para RgxGen #3607

  • Añadido formato see-difference para shouldHaveSingleElement (#3599)

  • Usar spec por defecto para el primer test en InstancePerTest (#3601)

  • Lanzar error si @Order se usa sin especificar orden de ejecución (#3641)

  • feat: matchers de mapas (all o exactly) permiten matchers dinámicos (#3569)

  • Propiedades extra no toleradas con diferente orden de arrays (#3629)

  • Reescribida documentación de System Extensions para mayor claridad (#3630)

  • matchJsonResource debe verificar existencia de archivo (#3634)

  • Corregido enlace reflexivo nulable que no funciona con ciertos tipos (#3635)

  • Corrección del orden de procesamiento de extensiones, priorizando la configuración de casos de prueba (#3613) (#3614)

  • Corrección del reductor de duración para que reduzca correctamente (#3611)

  • Corrección del nombre de withDefaultTimeZone en la documentación (#3615)

  • Reversión de la depreciación de shouldEqualSpecifiedJson. #3543

  • Corrección en la notificación de errores desde BeforeSpec al usar especificaciones InstancePerTest (#3585)

  • Renombrado de Matchers de Data Class a Matchers Compuestos (#3406)

  • Corrección de opción desactualizada en la documentación de jacoco #3539

  • Corrección de TestAbortedException no marcada como Ignorada (#3587)

  • Eliminación de solución alternativa para usar @Language en MPP (#3591)

  • Mejora de documentación sobre Arrow (#3570)

  • Implementación de solución para escenarios sin etiquetas en tiempo de ejecución pero con especificaciones anotadas con @RequiresTag() (#3532)

  • Conversión de NamedTag a data class para incluir equals() (#3579)

  • Adición de índices de elementos en mensajes de fallo de inspectores (#3578)

  • Corrección de CollectingTestEngineListener reteniendo todas las Specs (#3573)

  • Matchers fmap permiten valores nulos (#3568)

  • Corrección de IrLinkageError con K/Js en Kotlin 1.9 (#3557)

  • Corrección de error tipográfico en anotación y añadido enlace a documentación de Spring (#3551)

  • Corrección: adición de char a tipos platformstable (#3536)

  • Actualización del nombre de biblioteca de 'Test containers' a 'Testcontainers' (#3545)

  • Corrección de prueba fallida tras commit anterior

  • Corrección de anotación documentada como @RequireTags que debe ser @RequiresTag (#3530)

  • Corrección de fallo en enlace reflexivo con clases selladas que contienen miembros object (#3529)

  • Adición de changelog para v5.6.2 (#3519)

Gracias a todos los colaboradores desde el lanzamiento de la versión 5.6.0

  • AJ Alt

  • Alexey Yakovlev

  • Alphonse Bendt

  • aSemy

  • Ayushi Gupta

  • Charles Korn

  • Claudenir Freitas

  • Cory Thomas

  • David Weber

  • Dmitry Spikhalskiy

  • Emil Kantis

  • Erik Huizinga

  • hughlunnon

  • Israel José Boiko

  • Just.Viktor

  • Karl-Philipp Richter

  • ktrueda

  • Leonardo Colman Lopes

  • Łukasz Pięta

  • Łukasz Wasylkowski

  • Matej Drobnič

  • Mikael Elm

  • Mitchell Yuwono

  • OliverO2

  • Paolo Simonazzi

  • Rafał Prominski

  • SEONGILKIM

  • sksamuel

  • Thom

  • Viktors Garkavijs

  • Vladislav Krasov

  • Zak Henry

5.6.2 Mayo 2023

Aserciones

Pruebas basadas en propiedades

  • Soluciona un problema con pruebas basadas en propiedades en plataformas Apple #3506

  • Revierte el comportamiento de Arb.string() para generar solo cadenas con caracteres ASCII imprimibles

    • La versión 5.6.0 lo cambió para incluir caracteres de control, ver #3513 para más detalles
  • Corrige gran asignación de memoria para Arb de OffsetDateTime sin argumentos por @rescribet en https://github.com/kotest/kotest/pull/3491

  • Soluciona casos extremos en Arb.map por @myuwono en https://github.com/kotest/kotest/pull/3496

Documentación

Otros

⚠️ Comportamiento revertido de Arb.string()

En Kotest 5.6.0, Codepoint.ascii() se modificó para incluir un rango más amplio de caracteres ASCII, y se introdujo Codepoint.printableAscii() con el rango histórico que usaba Codepoint.ascii().

Arb.string() estaba usando Codepoint.ascii() como valor predeterminado para generar caracteres. Esto causó problemas a algunos usuarios, por lo que decidimos revertir Arb.string() al comportamiento histórico cambiando el valor predeterminado al nuevo Codepoint.printableAscii().

Esperamos que esto no cause problemas. Si los causa, puedes volver al comportamiento de 5.6.0 ~ 5.6.1 usando explícitamente Codepoint.ascii().

Si añadiste un uso explícito de Codepoint.printableAscii() para solucionar el problema, puedes eliminarlo de forma segura a partir de Kotest 5.6.2.

Nuevos colaboradores

Registro completo de cambios: https://github.com/kotest/kotest/compare/v5.6.1...v5.6.2

5.6.1 Abril 2023

Esta versión principalmente añade dependencias klib faltantes para iOS

Mejoras

  • Añade anotación de lenguaje a matchers JSON (#3487)

5.6.0 Abril 2023

Nota: esta versión requiere como mínimo Kotlin 1.8.0. Si usas < 1.8.0 puedes seguir utilizando Kotest 5.5.x

Cambios importantes:

  • Las funciones relacionadas con ConstantNow se han movido a un nuevo módulo llamado io.kotest:kotest-extensions-now (recuerda añadir el sufijo -jvm para Maven)

    • Añade este módulo como dependencia para seguir usando withConstantNow
  • Eliminada la lógica de verificación de Iterable de IterableEq (#3420)

Correcciones

  • Extensión BlockHound: Corrección del manejo de tests anidados (#3454) (#3456)

  • fix(JunitXmlReporter): resuelve correctamente rutas con directorios irrelevantes (#3479)

  • Corrección de Codepoint.ascii() para que devuelva caracteres ASCII imprimibles arbitrarios (#3429)

  • Corrección de la publicación de BOM para incluir artefactos -jvm. Soluciona #3417

  • Reimplementación de la anotación de inyección de idioma (#3397)

  • Soporte para UUID, Path y file como identificadores estables en JVM (#3472)

Mejoras

  • Actualización a Kotlin 1.8 (#3468)

  • Adición de generadores para cadenas en mayúsculas/minúsculas (#3402)

  • Exposición de semilla aleatoria en contexto de propiedades (#3469)

  • Visualización del tipo al fallar en comparaciones numéricas o por defecto (#3395)

  • Acceso al ámbito de fondo mediante extensión (#3315)

  • 'assertSoftly' y 'all' implican clue (#3425)

  • Mejora de reutilización en afirmaciones Json (#3438)

  • Adición de shouldContainAllIgnoringFields (#3394)

  • Exposición de specs descubiertos como TestDescriptors durante el descubrimiento y soporte para IDs únicos (#3461)

  • Soporte para anotaciones de superclase al decidir si una clase debe estar aislada (#3441)

  • Obsoleción de matchers Json antiguos (#3474)

  • Traslado de constant now a nuevo módulo; actualización de junit a 1.8.2 (#3470)

  • Adición de @RequiresPlatform (#3475)

  • Adición de shouldBeEqual (#3477)

  • Exposición de testCoroutineScheduler para MPP (#3471)

  • Implementación de shouldThrowSoftly (#3476)

  • Adición de Exhaustive para permutaciones de listas (#3473)

  • Cadena shouldBe/shouldNotBe (#3186)

  • Las etiquetas definidas en spec deben aplicarse antes de los listeners (#3189)

  • Uso de GlobalArbResolver para Arbs reflectivos (#3455)

  • Arb de propiedades para duración (#3227)

  • Adición de edgecase 'emptyMap' a Arb.map() (#3447)

  • Restauración de antiguas funciones externas de prueba mocha/jasmine

  • Eliminación del modo de concurrencia de la documentación (#3434)

  • Adición de despliegues snapshot para tvos sim / watchos sim

  • Incremento de aridad máxima en pruebas de propiedades checkall a 22 (#3382)

  • Soporte global para coroutineTestScope (#3383)

Agradecimiento a todos los colaboradores desde el lanzamiento de la versión 5.5.0:

  • Alex Decker

  • Alexey Genus

  • Alphonse Bendt

  • Andrey Kozlov

  • AnouarD

  • Anouar Doukkali

  • Arvind Arikatla

  • aSemy

  • Bartłomiej Zaręba

  • eduardbosch-jt

  • Emil Kantis

  • Grégory Lureau

  • Ivan “CLOVIS” Canet

  • IvanPavlov1995

  • Jama Mohamed

  • Jean-Michel Fayard

  • julian abiodun

  • Julian K

  • Leonardo Colman Lopes

  • Łukasz Pięta

  • Marc Philipp

  • Martin Caslavsky

  • Matej Drobnič

  • Mitchell Yuwono

  • OliverO2

  • Osip Fatkullin

  • ov7a

  • Pankaj

  • Ryan Lewis

  • RyuNen344

  • Sangboak Lee

  • Sergey Volkov

  • Shervinox

  • sksamuel

  • Stefanqn

  • Travis

  • Varun Arora

  • Vinícius Hashimoto

  • Vladimir Sitnikov

  • Xavier Oliver

  • Zak Henry

5.5.5 Febrero 2023

  • Soporte global para coroutineTestScope (#3383)

  • Mensajes de tolerancia mejorados para double y float (#3355)

  • Pruebas de datos anidadas no se muestran como tal en Intellij #3341

  • Corrección al escribir seeds cuando el nombre de prueba contiene dos puntos en Windows (#3304)

  • withClue() falla con EmptyStackException si una corrutina cambia de hilo #2447

  • Uso de TestDispatcher en callbacks beforeInvocation (#3363)

  • Mejora en comprobación de cobertura contra pares proporcionados (#3344)

  • Dependencia transativa vulnerable en Kotest runner junit5 jvm CVE-2021-29425 #3364

  • Corrección de matchers de secuencias para secuencias restringidas (#3336)

  • Impresión de ruta completa en JunitXmlReporter con useTestPathAsName activado (#3347)

  • Soporte para lambdas { } como pistas lazy (#3348)

  • Uso de 'inyección de lenguaje' en aserciones para mejor soporte en IntelliJ #2916

  • Eliminada ubicación por defecto para htmlReporter usando valor predeterminado del constructor (#3306)

  • Arb.bigDecimal debe generar decimales que terminen con todo tipo de dígito terminal #3282

  • Comprobación de enums usando método equals en lugar de escanear propiedades (#3291)

  • Añadido soporte para BlockHound (#3308)

  • Matchers devuelven this (#2945)

  • Añadidos matchers shouldMatchResource y shouldNotMatchResource (#2945)

  • Añadido matcher matchExactly para Maps #3246

  • Corrección al volcar configuración con systemProperty=true (#3275)

  • Devolución del fallo original cuando ErrorCollector solo recoge un fallo (#3269)

5.5.4 Noviembre 2022

  • Corrección al combinar filtros Gradle (se aplicaba AND incorrectamente en lugar de OR) (#3277)

5.5.3 Octubre 2022

  • Actualizada versión de JUnit de 5.7.2 a 5.8.2.

Kotest ahora requiere versión runtime de JUnit mínimo 5.8.x

Nota: Si tu build carga tanto JUnit 5.7 como 5.8 en el classpath en orden incorrecto, podrías ver problemas con ClassOrderer no encontrado. Asegúrate de cargar solo JUnit 5.8+

5.5.2 Octubre 2022

  • Correcciones en filtros de pruebas Gradle, por @myuwono (#3257)

  • Configuración de herencia de tags ahora disponible en AbstractProjectConfig

5.5.1 Octubre 2022

  • Corregido problema donde pruebas se saltaban al filtrar por nombre completo de spec

5.5.0 Octubre 2022

Correcciones

  • Solucionado problema usando plugin de compilación con Kotlin 1.7.20 (#3220)

  • Permitido registro global de arbs personalizados mediante GlobalArbResolver (#3185)

  • Corrección en pruebas de datos para todos los ámbitos de BehaviorSpec (#3222)

  • Corrección de mapas anulables en pruebas de datos (#3218)

  • Detección de configuración de proyecto tras aplicar propiedades del sistema (#3204)

  • Soporte para enabledOrReasonIf en FunSpec anidados

  • Mensaje de error mejorado al pasar lista vacía en Arb.of (#3195)

  • Error al usar callback afterEach tras registro de pruebas (#3191)

  • Mejora en mensajes de error para containExactly con conjuntos inestables (#3194)

  • Encapsulación de InvalidPathException en AssertionError para rutas JSON inválidas (#3147)

Mejoras

  • Implementación de extensiones montables perezosas (#3187)

  • Impresión clara de enteros sin signo (#3149)

  • Nuevo matcher shouldBeCloseTo (#3181)

  • Matchers regex: shouldMatch, shouldMatchAll, shouldMatchAny

  • Soporte para comodines en el lanzador (#3200)

  • Corrutinas de prueba en K/N (#3219)

  • Control de herencia para @Tags (#3199)

  • Publicación de catálogo de versiones para Gradle (#3171)

  • Comodines prefijos en selectores --test de Gradle (#3190)

  • Matchers mejorados para colecciones únicas (#3188)

  • Helpers para triples cartesianos con Exhaustive (#3174)

  • Propiedad configurable para versión del plugin de compilación (#3168)

  • Impresión clara de enteros sin signo (#3149)

Gracias a todos los colaboradores desde el lanzamiento de la versión 5.4.0:

  • Alex

  • aSemy

  • ataronet

  • Charles Korn

  • Emil Kantis

  • Jaehyun Park

  • James Baker

  • Jinseong Hwang

  • Kevin Woodland

  • Leonardo Colman

  • Michael Sewell

  • Mitchell Yuwono

  • Nikunj Yadav

  • Prat

  • Rasmus V. Plauborg

  • sksamuel

  • YongJoon Kim

5.4.2 Agosto 2022

  • Corrección en ejecución de pruebas para targets nativos en Kotlin 1.7+ (#3107)

  • shouldContainJsonKey debe devolver true para claves con valores nulos (#3128)

5.4.1 Julio 2022

Correcciones

  • Solución de regresión que causaba NoSuchMethodError en la extensión Spring de Kotest

5.4.0 Julio de 2022

Correcciones

  • Solucionado problema con el modo de aislamiento cuando hay nombres duplicados (#3071)

  • Permitir que Arb.bind vincule directamente tipos sellados, enumerados y privados (#3072)

  • Corregir kotest.properties para que se aplique antes de los tests #3087

  • Solucionado que shouldHaveSameContentAs no cerraba los lectores (#3091)

  • Corrección en matchers de tolerancia para valores negativos (#3096)

  • Ajustado mensaje de advertencia para que coincida con el valor de enumeración (#3067)

  • Solucionados fallos de compilación en proyectos Kotlin/Native que usan Kotlin 1.7 y el plugin Gradle de Kotest (#3073)

  • Corregida descripción del arb harryPotterCharacter (#2963)

Características

  • Soporte para persistir y reutilizar semillas en pruebas de propiedades #2967

  • Se ha añadido shouldMatchAll a Maps donde cada valor es una función que contiene aserciones #3065

  • shouldBeEqualToComparingFields ahora permite configurar clases que requieren usar shouldBe para igualdad, en lugar de equals convencional

  • Añadidos arbs para ZoneId, ZonedDateTime y OffsetDateTime (#3113)

  • Implementación de Arbitrary para YearMonth (#2928)

  • Hacer que arb.orNull proporcione una reducción a null (#2975)

  • Habilitar compilación de targets nativos para kotest-assertions-json (#3021)

  • Validación de tamaño en Arrays JSON (#2974)

  • Añadida razón opcional a @Ignored (#3030)

  • Establecer retención en tiempo de ejecución para el marcador dsl (#3038)

  • Añadido reductor para Sets (#3045)

Características y cambios experimentales

  • Se han añadido Supuestos a las pruebas de propiedades.

  • Se ha añadido generación de Estadísticas a las pruebas de propiedades.

  • Las aserciones de arrays en esquemas JSON ahora soportan minItems, maxItems y uniqueItems #3026

  • (BREAKING) Modificado el contrato del DSL de esquema JSON para requerir propiedades por defecto; required ha sido cambiado a optional, con false como valor predeterminado.

Desaprobación

  • Desaprobado el shouldBeEqualToComparingFields existente en favor de un nuevo matcher shouldBeEqualToComparingFields que permite configurar el comportamiento mediante la clase FieldsEqualityCheckConfig (#3034)

Gracias a todos los colaboradores desde el lanzamiento de la versión 5.3.0:

  • Alphonse Bendt

  • Andrey Bozhko

  • aSemy

  • Ashish Kumar Joy

  • blzsaa

  • Charles Korn

  • Cory Thomas

  • Emil Kantis

  • Erik Price

  • Francesco Feltrinelli

  • Javier Segovia Córdoba

  • Jim Schneidereit

  • Jordi

  • Norbert Nowak

  • Roland Müller

  • Shervinox

  • sksamuel

  • Tim van Heugten

  • YongJoon Kim

  • Zvika

5.3.2 Junio 2022

Correcciones

  • Soluciona problema del plugin de compilación con Kotlin/Native usando Kotlin 1.7, incidencia #3060

5.3.1 Junio 2022

Correcciones

  • Soporte para Kotlin 1.7

5.3.0 Mayo 2022

Correcciones

  • El modo "fail fast" debe anidarse a cualquier nivel #2773

  • Corrige que las descripciones de contenedores repetidos interrumpan la ejecución #2884

  • Corrige generación de código JS para 1.6.21 usando main (#2947)

  • AbstractProjectConfig no muestra displayFullTestPath #2941

Características

  • Soporte para filtros de métodos de clase en Gradle (#2954)

  • Ofrece modo coroutines runTest (#2950)

  • Añadido matcher sortedBy (#2944)

  • Vinculación automática de enumeraciones. Cierra #2937

  • Facilita la configuración de opciones mediante variables de entorno, soportando también nombres con guiones bajos en lugar de puntos (#2925)

  • Los matchers endsWith y startsWith admiten expresiones regulares (#2892)

Gracias a todos los colaboradores desde la versión 5.2.0:

  • Ashish Kumar Joy

  • Charles Korn

  • coffee-and-tea

  • dependabot[bot]

  • Emil Kantis

  • Goooler

  • Imran Malic Settuba

  • Jim Schneidereit

  • Łukasz Pięta

  • Marcin Zajączkowski

  • Michał Gutowski

  • Mitchell Yuwono

  • Naveen

  • Niklas Lochschmidt

  • Norbert Nowak

  • Rüdiger Schulz

  • sksamuel

  • Vitor Hugo Schwaab

5.2.3 Abril 2022

Correcciones

  • Actualización para corregir error con kotlinx-coroutines 1.6.1 (#2912)

  • Corrige que el Matcher haveElementAt lance ArrayIndexOutOfBoundsException (#2895)

5.2.2 Marzo 2022

Correcciones

  • Ajuste de configuración del plugin Gradle PIT (#2903)

  • Implementación de trampolines para flatmap, map, filter y merge (#2900)

  • Corrige que Arb.map respete el parámetro minSize tanto en generación como en reducciones (#2890)

  • Se hizo isOrderedSet específico de plataforma para permitir eq con TreeSet. Soluciona #2879

  • Corrige casos extremos en negativeFloat y positiveFloat (#2880) Mitchell Yuwono* 16 Mar 2022, 21:56 b40de793

  • Corrige fallo en shouldBeEqualToComparingFields cuando campos anidados contienen null (#2874)

Características

  • Implementación de ShouldThrowWithMessage (#2847)

  • Implementación de inspectores para CharSequence (#2886)

5.2.1 Marzo 2022

Correcciones

  • Corrige una regresión en 5.2.0 que causaba error al acceder al ámbito raíz desde el ámbito de prueba.

  • Definir pruebas raíz durante la ejecución de pruebas anidadas ahora genera error correctamente. (2870)

5.2.0 Marzo 2022

Correcciones

  • AnnotationSpec no admite funciones suspend @Before (2868)

  • Corregido el ámbito de dependencia para RgxGen en pruebas de propiedades (2800)

  • El generador BigDecimal podría devolver casos extremos fuera de los límites min/max (2834)

  • Corrige que el ordenador aleatorio de especificaciones cree comparadores inválidos (2840)

  • Corrige interferencia entre withClue y assertSoftly con corrutinas concurrentes (2791)

  • Corrige el manejo de casos extremos en comparaciones numéricas JSON laxas (2793)

  • Corrige group id para el módulo kotest assertion compiler (2787)

  • Implementa solución temporal para problema donde no se ejecutan pruebas con nuevo modelo de memoria Kotlin/Native (2812)

Funcionalidades y mejoras

  • Se añadió inspector forSingle y matchers matchEach, matchInOrder y matchInOrderSubset (2695)

  • Se añadieron matchers shouldBeJsonObject y shouldBeJsonArray (2861)

  • Ignora selectores JUnit UniqueId para mejor interoperabilidad con otros motores (2862)

  • Componer matchers fácilmente (2864)

  • Hacer configurable la longitud del fragmento de colección incluido en errores de aserción (2836)

  • Conversión inteligente de shouldBeSuccess y shouldBeFailure (2853)

  • Eliminar valores predeterminados inconsistentes de exceptionClass en eventually (2831)

  • Hacer recursivo shouldBeEqualToComparingFields (2833)

  • Añadir blockingTest a las opciones de configuración en FreeSpec 2805 (2807)

  • Añadido contrato EqualsVerifier para shouldBeEqualTo para mayor personalización (2795)

  • Añadir containExactly que acepta un vararg de pares (2781)

  • Actualizar Test Containers para soportar múltiples scripts de inicialización (2811)

Cambios Importantes

  • Prohibir el uso de métodos de ámbito raíz dentro del ámbito de contenedor (2870)

Gracias a todos los colaboradores:

  • Ashish Kumar Joy

  • BjornvdLaan

  • Charles Korn

  • Christoph Sturm

  • Emil Kantis

  • Imran Malic Settuba

  • Ing. Jan Kaláb

  • inquiribus

  • Kacper Lamparski

  • KIDANI Akito

  • Leonardo Colman

  • Louis CAD

  • Łukasz Pięta

  • luozejiaqun

  • Mervyn McCreight

  • Mitchell Yuwono

  • OliverO2

  • scottdfedorov

  • Sebastian Schuberth

  • sksamuel

  • Sondre Lefsaker

  • Sunny Pelletier

  • Zak Henry

5.1.0 Enero 2022

Correcciones

  • La prueba falla porque el lado izquierdo de shouldBe es List y el derecho es un Iterable personalizado #2746

  • La extensión JUnit XML genera XML no válido #2756

  • La no nulabilidad se pierde con el matcher shouldBeSuccess #2759

  • Arb.bind debería detectar nulables e inyectar valores nulos #2774

Funcionalidades y mejoras

  • Actualizar corrutinas a la versión final 1.6 #2768

  • En el encogimiento de cadenas de Arb, el carácter más simple siempre es 'a' sin importar el punto de código #2646

  • Añadir reloj de prueba mutable #2655

  • Inspectores para mapas #2656

  • Añadir función de inversión condicional con parámetro para invertir bajo condiciones #2658

  • Implementar fallo rápido para todo el proyecto #2684

  • Permitir establecer la semilla usada para aleatorizar el orden de especificaciones #2698

  • Opción para fallar la compilación si se establece una semilla en pruebas de propiedades #2701

  • El Arb de LocalDateTime debería aceptar fechas-hora como valores mínimo y máximo #2704

  • Propiedad de sistema para desactivar el escaneo de configuración #2766

  • Propiedad de sistema para la clase de configuración #2767

Gracias a todos los colaboradores:

  • aSemy

  • Ashish Kumar Joy

  • Bart van Helvert

  • Benjamin Shults

  • Charles Korn

  • Emil Kantis

  • Imran Settuba

  • inquiribus

  • Łukasz Pięta

  • Max Rumpf

  • Ricardo Veguilla

  • Sebastian Schuberth

  • Simon Vergauwen

  • sksamuel

5.0.3 Diciembre 2021

Correcciones

  • ShouldContainExactlyTest falla en Windows debido a errores en aserciones con separadores de ruta #2732

  • shouldBe entra en bucle infinito al generar mensajes de diff para data classes con referencias cíclicas #2611

  • Problemas al usar aserciones globalAssertSoftly bug framework #2706

  • Corregir problemas en shouldStartWith y shouldEnd #2736

5.0.2 Diciembre 2021

Correcciones

  • Corregida la notificación errónea de timeouts en pruebas #2714

  • El listener de Team City no debe ser lazy para todas las pruebas #2707

  • Corregir filtro de rutas de prueba vs espacios en nombres de pruebas #2725

  • Soporte para nulos en pruebas basadas en datos #2718

  • Corrige que las pistas no funcionan cuando el valor esperado o real es nulo #2720

  • Cambiados los timeouts predeterminados para usar duraciones (más claro)

  • Corregido que los contenedores after/before no funcionaban como extensiones #2721

  • Compartir TestCoroutineDispatcher en pruebas anidadas #2703

  • Corrige contextos en FunSpec cuando las pruebas están deshabilitadas #2710

  • Retornar ComparableMatcherResult en aserciones JSON #2620

  • Eliminar @ExperimentalTime donde Duration es estable #2708

  • Eliminar solución alternativa de Arb#long para valores generados aleatoriamente incorrectos #2700

5.0.1 Noviembre 2021

Correcciones

  • Los nombres para mostrar ahora incluyen afijos cuando están configurados

  • Corregido WordSpec para funcionar con el plugin de IntelliJ en contextos anidados

  • Añadido override de testCoroutineDispatcher a la configuración del proyecto #2693

  • Corregida condición de carrera en el compilador multiplataforma #2687

  • Regresión: Tiempos de prueba reportados como cero en JUnit #2686

  • Volcar automáticamente la salida de depuración de corrutinas tras finalizar la prueba #2680

  • Los matchers JSON no ofrecen "Haz clic para ver la diferencia"

4.6.4 Noviembre 2021

Correcciones

  • Corrige ShouldContainExactly para colecciones que contienen arrays de bytes (#2360)

  • Corrige selección aleatoria de nanosegundos en InstantRange cuando los segundos igualan los límites (#2441)

  • Corrige recursión infinita en checkAll de 2 aridades (#2510)

  • Corrige índice incorrecto en forAll4 (#2533)

  • Corrige variables de entorno vacías en withEnvironment en Linux (#2615)

  • Cambia should por shouldNot en shouldNotBeEqualToComparingFieldsExcept (#2637)

  • Elimina Try anidado accidentalmente (#2669)

5.0.0 Noviembre 2021

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

Consulta el artículo detallado sobre características y cambios en 5.0 aquí

Cambios importantes y métodos eliminados

  • El soporte para JavaScript ha sido rediseñado para usar el compilador IR. El compilador legacy ya no es compatible. Si ejecutas pruebas en JS legacy, deberás seguir usando Kotest 4.6.x o probar solo IR.

  • Arb.values ha sido eliminado. Estaba obsoleto desde 4.3 en favor de Arb.sample. Actualiza los arbs personalizados que sobrescriban este método. Los que usan builders arbitrary recomendados no se ven afectados. #2277

  • El motor ya no registra configuraciones en consola durante el inicio por defecto. Activa con la propiedad de sistema kotest.framework.dump.config establecida a true. #2276

  • TextContext ha sido renombrado a TestScope. Este es el tipo receptor usado en lambdas de prueba. Solo afecta si tienes funciones de extensión personalizadas que usan TestContext.

  • Las funciones experimentales de pruebas de datos añadidas en 4.5 se han movido al módulo kotest-framework-datatest y son estables.

  • equalJson añade un parámetro para soportar la nueva aserción shouldEqualSpecifiedJson

  • Cambiado PostInstantiationExtension para ser suspendible

  • ConstructorExtension ahora es exclusivo de JVM. Anteriormente estaba disponible en otras plataformas pero no tenía efecto fuera de JVM.

  • 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.

  • Se ha eliminado la configuración obsoleta isolation en Specs. Utilice isolationMode.

  • Se ha trasladado assertionMode de TestCase a la configuración del caso de prueba.

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

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

Correcciones

Marco de pruebas

  • Soporte para anotaciones compuestas y caché de búsquedas de anotaciones #2279

  • Corrección de la evaluación perezosa en autoClose #2395

  • Eliminación de puntos en nombres de pruebas JS #2483

  • Escape de dos puntos para salida en TeamCity #2445

  • Eliminación recursiva de directorios temporales al usar tempdir #2227

Aserciones

  • Los matchers de cadenas ahora funcionan también con CharSequence donde aplica #2278

  • withEnvironment falla con variables de entorno vacías en Linux #2615

  • Corrección de ShouldContainExactly para colecciones con arrays de bytes #2360

  • 2412 Hace que Sequence.containExactly funcione para secuencias de un solo paso #2413

  • Corrección de withClue y assertSoftly para corrutinas que cambian de hilo #2447

  • Permitir añadir pistas (clues) a timeouts #2230

  • Posible confusión entre sobrecargas de shouldContainExactlyInAnyOrder #2587

  • shouldBeEqualToComparingFields maneja arrays y propiedades calculadas #2475

Pruebas basadas en propiedades

  • Corrección de Arb.long/ulong que generaba valores fuera de rango #2330

  • Corrección de Arb.localDate para considerar porción fecha/mes del minDate #2370

  • Actualización de FloatShrinker y DoubleShrinker para usar recuento de bits de mantisa como medida de complejidad #2379

  • Corrección de error/2380: reducciones (shrinks) en filtro de Arb #2434

  • Parámetro de iteraciones en PropTestConfig no se respetaba #2428

  • Corrección de recursión infinita en checkAll de aridad 2 #2510

  • Corrige índice incorrecto en forAll4 #2533

  • StackOverflow al usar checkAll #2513

  • Mejora rendimiento de Arb.uuid mediante caché de instancias RgxGen para reutilización #2479

  • Módulo de propiedades: Corrección de mutación global en PropertyTesting para Kotlin/Native #2469

  • Añade caso extremo de BigDecimal para discrepancia entre equals y compareTo #2403

  • Corrige selección aleatoria de nanosegundos en InstantRange cuando segundos coinciden con extremos del rango #2441

Características

Marco de pruebas

Aserciones

  • Devuelve el valor resultante del bloque de función en shouldCompleteWithin #2309

  • Se ha añadido shouldEqualSpecifiedJson para comparar estructuras JSON en un subconjunto de claves (especificadas) #2298

  • shouldEqualJson ahora soporta números de alta precisión #2458

  • Se ha añadido shouldHaveSameStructureAs a los matchers de archivos

  • Se ha añadido shouldHaveSameStructureAndContentAs a los matchers de archivos

  • Los inspectores ahora son inline y pueden contener funciones suspendidas #2657

  • String.shouldHaveLengthBetween ahora acepta rangos #2643

  • La aserción beOneOf ahora indica qué valor faltaba #2624

  • Los matchers de cadenas ahora funcionan con cualquier CharSequence #2278

  • Se ha añadido el matcher shouldThrowMessage #2376

  • Se han añadido matchers de tolerancia porcentual #2404

  • Se han añadido matchers NaN para Float #2419

  • Se han reemplazado matchers eager por sus equivalentes lazy #2454

  • Comparación de literales JSON en modo estricto #2464

  • Se han añadido matchers para JSON vacío #2543

  • Se ha añadido un resultado de matcher comparable y aplicado a shouldContainExactly #2559

  • Se ha actualizado iterables.shouldContain para devolver el receptor y permitir encadenamiento

  • Se han añadido alias para inspectores #2578

  • Los inspectores devuelven la colección para permitir encadenamiento #2588

  • Desactivación de diff de cadenas en IntelliJ #1999

  • Se ha añadido CompareJsonOptions para mayor control al comparar JSON #2520

  • Soporte para ignorar claves desconocidas en aserciones JSON #2303

  • Se ha añadido soporte para objetivos Linux ARM64 y macOS ARM64 (Silicon). #2449

Pruebas basadas en propiedades

  • Cambio de usos de Char.toInt() a Char.code desde Kotlin 1.5. Migración de puntos de código al objeto compañero Codepoint. #2283

  • Generex ha sido reemplazado por Rgxgen #2323

  • Mejora en la nomenclatura de funciones de Arb #2310

  • Mejora en la consistencia de Arb.primitive #2299

  • Añadidas variantes inclusivas de cero para Arb.ints #2294

  • Añadidos tipos sin signo para Arb #2290

  • Añadido Arb para direcciones IP V4 #2407

  • Añadido Arb para puntos de código hexadecimales #2409

  • Añadido constructor Arb de continuación que permite usar Arb de forma similar a comprensiones de listas. #2494

  • Añadido Arb.zip como alias de Arb.bind #2644

  • Añadidos arrays primitivos a Arb #2301

  • Generador de ubicaciones geográficas mejorado #2390

  • Corrección en Arb de LocalDate que generaba fechas incorrectas fuera de restricciones #2405

  • Añadido zip para Exhaustive #2415

  • Añadidos helpers de pares cartesianos para Exhaustive #2415

  • Añadido Arb.distinct con capacidad de terminación #2262

  • Añadido Arb para zonas horarias #2421

  • Añadidos clasificadores automáticos #2267

  • Se añadieron arity8 y arity9 forall para pruebas con tablas #2444

  • Permitir configuración global de semilla. Sincronización de valores por defecto. #2439

  • Soporte para clases de datos complejas en Arb.bind #2532

  • Reducción de casos al usar Arb.bind #2542

  • Introducción de restricciones para pruebas de propiedades #2492

  • Las pruebas de propiedades deben usar bind como valor por defecto para clases de datos #2355

  • Reductor de dobles independiente de plataforma #2517

  • Arb.pair debe devolver Arb<Pair<K, V>> #2563

  • Se ha añadido soporte para objetivos Linux ARM64 y macOS ARM64 (Silicon). #2449

Deprecaciones

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

  • TestStatus ha quedado obsoleto y TestResult se ha rediseñado como un ADT. Si realizabas pattern matching en TestResult.status, ahora puedes hacerlo directamente en la instancia del resultado.

  • val name dentro de Listener ha quedado obsoleta. Esta propiedad permitía nombres únicos personalizados para errores en callbacks before/after. El framework ahora garantiza nombres únicos automáticamente, haciendo innecesaria esta propiedad.

  • SpecExtension.intercept(KClass) ha quedado obsoleto en favor de SpecRefExtension y SpecExtension.intercept(spec). El método deprecado tenía comportamiento ambiguo con IsolationMode que creaba múltiples instancias de specs. Los nuevos métodos garantizan ejecución precisa.

  • El objeto global configuration ha quedado obsoleto como primer paso para eliminar esta variable global. El método preferido para configuración sigue siendo ProjectConfig, detectado en todas las plataformas (JVM, JS y Native).

  • SpecInstantiationListener ha quedado obsoleto en favor de InstantiationListener e InstantiationErrorListener, que soportan corrutinas en callbacks. SpecInstantiationListener es un remanente precorrutinas y se eliminará en futuras versiones.

  • El método listeners para añadir listeners a Specs ha quedado obsoleto. Al añadir listeners directamente, usa fun extensions() en lugar de fun listeners().

  • SpecIgnoredListner (nótese el error tipográfico) ha sido renombrado a InactiveSpecListener.

Colaboradores

Gracias a todos los autores que contribuyeron a esta gran versión. En orden alfabético (todos los commits desde 4.6.0):

AJ Alt, Ali Khaleqi Yekta, Alphonse Bendt, Andrew Tasso, Ashish Kumar, Ashish Kumar Joy, Bart van Helvert, Charles Korn, Christoph Pickl, Cory Thomas, dave08, Derek Chen-Becker, dimsuz, Emil Kantis, Federico Aloi, Hugo Martins, IgorTs2004, Imran Settuba, Ing. Jan Kaláb, IvanPavlov1995, Javier Segovia Córdoba, Jean-Michel Fayard, Jerry Preissler, Jim Schneidereit, Leonardo Colman, Marcono1234, Marvin Sielenkemper, Mervyn McCreight, Michael Werner, Mikhail Pogorelov, Mitchell Yuwono, Nico Richard, niqdev, OliverO2, Rustam Musin, Scott Busche, Sebastian Schuberth, Simon Vergauwen, sksamuel, Srki Rakic, SuhyeonPark, Tobie Wee

4.6.3 Septiembre 2021

Correcciones

  • StackOverflow al usar checkAll con funciones de cierta aridad #2513

  • Se añadieron arity8 y arity9 forall para pruebas con tablas #2444

4.6.2 Agosto 2021

Correcciones

  • Se revirtió el uso de API 1.5 introducida erróneamente en 4.6.1

  • autoClose interrumpe lazy #2388

  • minDate no respetado en Arb.localDate #2369

  • Sequence.containExactly debería funcionar para secuencias de paso único #2412

  • Caso extremo en BigDecimal por discrepancia entre equals y compareTo #2403

  • El parámetro iterations de PropTestConfig no se respeta #2428

  • tempfile y tempdir deberían hacer fallar la prueba cuando falla el borrado #2351

4.6.1 Julio 2021

Correcciones

  • HTMLReporter - CSS no se carga (la ruta del archivo es absoluta, no relativa) #2342

  • Anotaciones como @Ignore e @Isolate ahora funcionan cuando se componen #2279

  • Finalize spec ahora se llama correctamente en todas las situaciones #2272

  • Los límites de Arb.bigDecimal no se respetan #2357

  • Corrección para ejecutar pruebas individuales con WordSpec dentro de IntelliJ #2319

4.6.0 Mayo 2021

Esta es una versión menor que añade soporte para Kotlin 1.5 manteniendo la compatibilidad con Kotlin 1.4.x

Correcciones de errores

  • Todo el registro interno ahora usa funciones lazy, lo que ofrece una mejora significativa de velocidad en suites de pruebas grandes. Agradecimiento especial a Łukasz Wasylkowski por dedicar tiempo considerable a resolver este problema de rendimiento.

  • Corregidos falsos negativos en Inspectors cuando se usaban dentro de assertSoftly. #2245

Funcionalidades / Mejoras

  • La configuración de pruebas ahora puede especificarse a nivel de contenedor de pruebas además de a nivel hoja #1370 #2050 #2065

  • En pruebas basadas en datos, se añadió la anotación IsStableType que, al usarse en un tipo, Kotest llamará al método toString de ese tipo para crear el nombre de la prueba. Consulta la documentación actualizada #2248

  • En pruebas basadas en datos, se añadió la interfaz WithDataTestName que permite modificar el nombre generado para la prueba. Consulta la documentación actualizada #2248

  • Los métodos de reflexión se cachean para evitar llamadas lentas de reflexión.

  • Se añadieron versiones experimentales de eventually, until y continually que no usan kotlin.time internamente. Consulta la documentación actualizada #2149

  • Actualización de Coroutines a 1.5, lo que también permite publicar módulos de assertions/property tests para watchosX64

  • Artefactos watchosX64 publicados para assertions y property tests.

Colaboradores

Ashish Kumar Joy, Jim Schneidereit, Łukasz Wasylkowski, sksamuel

4.5.0 Mayo de 2021

Como parte de este lanzamiento, las extensiones de terceros se promocionaron a repositorios independientes en lugar de módulos dentro del repositorio principal de Kotest. Esto permite que las extensiones evolucionen más rápido, sin tener que esperar un lanzamiento completo de Kotest.

A partir de la versión 4.5, el espacio de nombres para todas las extensiones cambió a io.kotest.extensions y el versionado se reinició a 1.0.0.

Por ejemplo, si utilizabas la extensión Spring, antes añadías io.kotest:kotest-extensions-spring:4.x.y en tu build. Ahora deberás usar io.kotest.extensions:kotest-extensions-spring:1.x.y.

Consulta la lista completa de módulos de extensión.

Cambios importantes

  • Para permitir un uso más amplio de ExperimentalKotest, se trasladó de io.kotest.core.config.ExperimentalKotest a io.kotest.common.ExperimentalKotest. #1950

  • Para garantizar que EventuallyListener se invoque en eventually cuando se lance una excepción, se cambió el campo result de ListenerState de tipo T a T?. Esto permite detectar cuándo falla la función productora eventually en lugar de aparentar que se bloquea. #2190

  • Las pruebas de propiedades ahora alternan aleatoriamente entre casos límite y muestras, en lugar de iterar todos los casos límite primero. Esto permite usar más casos límite y evita explosión combinatoria. Si implementas Arb personalizados extendiendo la clase Arb (en lugar de usar los builders arbitrary), deberás ajustar tu método de casos límite de fun edgecases(): List<A> a fun edgecase(rs: RandomSource): A?.

  • Debido al cambio anterior en pruebas de propiedades, si estableces una semilla en una prueba de propiedad, podrías necesitar ajustar su valor.

  • Las dependencias de kotlin stdlib ahora están marcadas como compileOnly, lo que significa que se usará la versión de tu build. Kotest mantiene compatibilidad entre versiones evitando depender de funcionalidades exclusivas de lanzamientos recientes.

  • Los nombres duplicados de pruebas ya no lanzan error automático, sino que modifican el nombre. Dos pruebas llamadas 'foo' aparecerán como 'foo' y '(1) foo'. Esto permite que las pruebas basadas en datos funcionen correctamente en JavaScript. Para restaurar el comportamiento original, establece Configuration.duplicateTestNameMode = Error.

Características / Mejoras

  • Se añadió el módulo kotest-framework-datatest que soporta correctamente anidamiento en tiempo de ejecución para pruebas basadas en datos. Consulta la documentación actualizada. #2078

  • Se añadió un nuevo comparador para DayOfWeek en el módulo kotest-assertion-clock. #2124

  • Se añadió un método factory para simplificar la creación de comparadores. #2122

  • Se añadió un método en Exhaustive para crear un nuevo Exhaustive que sea el producto cartesiano de dos Exhaustive dados. #2120

  • Se añadió soporte para escribir pruebas dentro de objetos además de clases. #1970

  • Se añadieron versiones suspend de shouldCompleteWithin, shouldCompleteBetween y shouldTimeOut. #2107

  • Se añadió el proyecto kotest-extensions-wiremock para gestionar el ciclo de vida de WireMockServer en pruebas Kotest. #2108

  • Se añadió el proyecto kotest-extensions-kafka para usar Kafka embebido en tus pruebas.

  • Actualizada dependencia klock a la versión 2.0.6 y añadidos objetivos de plataforma para browser, nodejs, linuxX64, mingwX64, macosX64, tvos, iosX64, iosArm64 e iosArm32 en kotest-assertions-klock. #2116

  • Ejecuta eventually una última vez si las iteraciones son una y el retardo es mayor que el intervalo #2105

  • Mejoras en eventually:
    (1) EventuallyPredicate ahora es un alias de tipo en lugar de una interfaz para mejor experiencia de usuario.
    (2) Mensajes de error mejorados para informar sobre fallos en el EventuallyPredicate.
    (3) Nueva sobrecarga de eventually sin EventuallyPredicate para comportamiento similar a until.

  • Añadidos comparadores shouldBeEqualToComparingFields y shouldBeEqualToComparingFieldsExcept que verifican igualdad comparando campos en lugar de usar equals. #2197

  • one y any añadidos como alternativas a assertSoftly. Son métodos suspendidos que verifican que solo una aserción tuvo éxito (one) o al menos una tuvo éxito (any). #1950

  • Nuevo reportero para generar informes HTML. #2011

  • Añadido Exhaustive.cartesian. #2119

  • kotest.tags ahora configurable mediante variables de entorno. #2098

  • Los casos límite ahora se generan probabilísticamente. #2112

  • TestResult ahora admite una razón para saltar pruebas. #2172

  • Reintroducido soporte para watchOS en x86. #2204

  • Nueva sobrecarga en Double.plusOrMinus que acepta porcentajes: 1.0.plusOrMinus(10.percent).

Correcciones de errores.

  • Corrige fallo en eventually dentro del bloque assert softly sin reintentar la lambda. #2092

  • Corrige implementaciones de Listener (aparte de ProjectListener) no detectadas por el framework. #2088

  • Corrige que EventuallyListener no sea invocado en eventually cuando la función productora lanza una excepción. #2190

  • Usa el nombre de clase como prefijo predeterminado para archivos temporales. #2140

  • Corrección para SystemExitListener con framework picocli. #2156

  • Corrige generación de valores aleatorios en Arb.choose(arb, arb2, ...). #2176

  • Usar checkAll, forAll y take en un Arb causa una InvalidMutabilityException en XorWowRandom para Ios. #2198

  • Corrige problemas de paso de vararg a otra función en containsInOrder #2200

  • StringShrinker ignoraba límite de tamaño mínimo. #2213

  • Corrige concurrencia ilimitada en ejecución de especificaciones con soporte experimental. #2177

  • Sincroniza acceso a contextos de prueba Spring. #2166

  • Corregido error tipográfico en comparador haveClassAnnontations (deprecada la versión incorrecta). #2133

Deprecaciones

  • Obsoletos: instanceOf, beInstanceOf, beTheSameInstanceAs, beOfType del paquete io.kotest.matchers. Se eliminarán en la versión 4.7. Usar equivalentes de io.kotest.matchers.types.

  • Eliminada versión obsoleta de eventually que usaba duraciones para intervalos. #2086

  • Los receptores utilizados en los ámbitos de prueba se han renombrado. Por ejemplo, DescribeScope se ha convertido en DescribeSpecContainerContext. Los nombres anteriores existen como alias de tipo pero están obsoletos. Esto solo es relevante si implementas tipos de especificación personalizados que heredan de las especificaciones integradas o has definido métodos de extensión en esos ámbitos.

Colaboradores

  • AJ Alt

  • Alex Ordóñez

  • Andreas Deininger

  • Ashish Kumar Joy

  • Dale King

  • Hirotaka Kawata

  • Hugo Martins

  • Janek

  • Jim Schneidereit

  • Leonardo Colman

  • Malte Esch

  • Mateusz Kwieciński

  • Mitchell Yuwono

  • Nikita Klimenko

  • Niklas Lochschmidt

  • Rustam Musin

  • Sean Flanigan

  • Sebastian Schuberth

  • Yoonho Sean Lee

  • Zak Henry

  • sksamuel

  • tbcs

4.4.3 Marzo 2021

  • Se eliminaron declaraciones de depuración detalladas que se habían dejado por error en la versión 4.4.2.

4.4.2 Marzo 2021

Nota: La versión 4.4.2 se compila con Kotlin 1.4.31 y coroutines 1.4.3

  • Función: Los artefactos de prueba para Javascript ahora se compilan con el compilador IR además del actual #2037

  • Corrección de error: BeforeProjectListener no siempre se detectaba

  • Corrección de error: Al usar shouldBe con excepciones, solo se comparaba el mensaje #2094

  • Corrección de error: Se soluciona withEnvironment() para que no distinga mayúsculas/minúsculas en Windows #2099

  • Corrección de error: Se soluciona IncorrectDereferenceException al llamar aserciones en hilos secundarios en Native #2128

  • Corrección de error: Se soluciona el bloqueo de Arb.bigdecimal con ciertas combinaciones de valores mínimos/máximos #2135

  • Mejora: eventually a veces solo verificaba una vez pese a intervalos programados cortos #2089

  • Mejora: Se actualiza el mensaje de error para el matcher shouldContainKeys para incluir claves ausentes #2106

  • Mejora: haveCauseOfType muestra el tipo de excepción en lugar del tipo de causa #2131

4.4.1 Febrero 2021

Nota: La versión 4.4.1 requiere como mínimo Kotlin 1.4.30

  • Se solucionó la agrupación de pruebas de Allure #1871

  • Se actualizaron shouldBeEmpty y shouldNotBeEmpty para funcionar con referencias anulables #2055

  • Se expone el factor en intervalos exponenciales de eventually y until #2046

  • Se añadió límite superior a intervalos exponenciales y Fibonacci #2053

  • Se solucionó el nombre de prueba para tests basados en datos con enumeraciones #2034

  • IntArray no se imprimía en el registro de Assert #2042

  • Se solucionó JSON inválido que causaba errores de streaming en aserciones JSON #2045

  • La generación de conjuntos grandes mediante Arb.set lanzaba excepción #2051

  • Se evita crear lambdas adicionales en el forAll de bloqueo #2036

4.4.0 Febrero 2021

Nota: La versión 4.4.0 requiere como mínimo Kotlin 1.4.21

Funcionalidades / Mejoras

  • Añadido generador lazy para pruebas de propiedades #1651

  • Nuevas aserciones para mapas #1697

  • Framework de pruebas de propiedades ahora disponible para targets nativos #1747

  • Mejoras en soporte de concurrencia para specs / tests #1760

  • Variación de clue/asClue para aceptar lazy #1766

  • Nuevas aserciones para mapas: shouldNotContainAnyKeysOf() y shouldNotContainAnyValuesOf() #1769

  • Añadidos matchers para AtomicBoolean #1791

  • Actualización a Kotlin 1.4.20 #1800

  • Los casos de prueba pueden incluir sus tags en el nombre si así se configura #1804

  • Funcionalidad para usar 'it' sin necesidad de 'describe' #1827

  • Añadida versión inline para alias intanceOf #1838

  • Soporte para globalAssertSoftly mediante propiedad del sistema #1843

  • Helper para creación de directorios temporales #1862

  • shouldBeBetween no definido para floats #1927

  • Aumentada aridad de checkall / forall a 12 parámetros #1929

  • Más configuraciones para generador de emails #1941

  • El matcher not null debería mostrar el valor que se esperaba no nulo #1942

  • Añadida SpringTestExtension que expone test context mediante elemento coroutine context #1956

  • Añadida extensión para tests activos #1959

  • Actualización de matchers ktor para usar ktor 1.5 #1965

  • Permitir registro de pruebas basadas en datos en ámbito raíz #1967

  • Añadido arbitrario para dominios #1969

  • Actualización de matchers arrow a 0.11.0 #1976

  • Añadido arbitrario para puntos de código alfanuméricos #1989

Correcciones de errores

  • Mejoras de rendimiento para excepciones en JVM #1787

  • Uso de símbolos o japonés en nombres de prueba altera comportamiento #1828

  • Comportamiento incorrecto al combinar assertSoftly y shouldNotBe #1831

  • Aserción Then en BehaviorSpec muestra verde en IntelliJ cuando debería ser rojo #1857

  • AssertionMode.Error no funciona en FeatureSpec #1864

  • Uso inválido de tests debería lanzar excepción en runtime #1882

  • Salida de reporters debería ser single-threaded #1895

  • Arb.set con rango bloquea test si el generador no produce suficientes valores #1931

4.3.2 Diciembre 2020

Características

  • Librería de aserciones ahora disponible para watchos32 además de otros targets

  • Permitir usar it para crear tests fuera de bloques describe

  • Añadidos Arb.lazy y Exhaustive.lazy

Corrección de errores

  • Revertido método específico de Kotlin 1.4 añadido en 4.3.1

  • Arb.choose no incluye casos límite de arbs de entrada #1886

  • Reducción de cadenas no se ejecuta #1860

  • Arb.stringPattern ralentiza dramáticamente los tests #1878

  • AssertionMode.Error no funciona en FeatureSpec #1864

  • Casos extremos incompletos en el generador de doubles #1869

  • Comportamiento inesperado en ToleranceMatcher con doubles infinitos #1832

  • Comportamiento incorrecto al combinar assertSoftly y shouldNotBe #1831

  • Se corrigió shouldContainJsonKeyValue para funcionar con valores Long esperados y valores enteros reales #1790

4.3.1 noviembre de 2020

Características

  • Variación de clue/asClue para aceptar lazy #1766

  • Se añadieron Tuple2..Tuple22 para pruebas de datos #1773

Mejoras

  • Recuperación de stacktrace cuando falla un bloque eventually #1775

  • Mejoras de rendimiento para excepciones en JVM #1787

  • Actualización del descubrimiento para inicializar solo clases de especificaciones #1788

Corrección de errores

  • Identificadores estables añadidos para pruebas basadas en datos con clases no-data #1795

  • Mensajes incorrectos de TimeoutException cuando las pruebas exceden tiempo de invocación a nivel de especificación #1809

  • Los tiempos de espera de invocación no deben aplicarse a contenedores #1810

  • Arb.filter causaba desbordamiento de pila #1818

  • Cambio de firma de tipo en Arb.shuffle roto en 4.3.0 #1824

4.3.0 octubre de 2020 - Blog

Características

  • Nuevo DSL para pruebas basadas en datos con clases de datos #1537 (framework)

  • Opción para eliminar espacios en nombres de pruebas #1545 (framework)

  • Anotación EnabledIf para especificaciones #1683 (framework)

  • Propagación del contexto de corrutinas a las pruebas #1725 (framework)

  • Opción para suprimir volcado de configuración #1742 (framework)

  • Atributo de severidad añadido para TestCase #1746 (framework)

  • Opción añadida kotest.framework.sourceref.disable (framework)

  • Motor sin dependencias #1748 (framework)

  • Comparación multilínea para contenido de archivos #823 (assertions)

  • Nueva aserción: Iterator.shouldHaveNext() #1660 (assertions)

  • Nuevas aserciones: isEmpty/isDefined para java.util.Optional #1661 (assertions)

  • Matchers no-infix deben retornar this para encadenamiento #1744 (assertions)

  • Módulo de pruebas de propiedades para kotlinx-datetime #1679 (prop-testing)

  • Gen.forNone añadido #1636 (prop-testing)

  • Arb debe generar un solo valor #1754 (prop-testing)

  • Arbitrario añadido para generar BigDecimal #1705 (prop-testing)

  • Pasos y traza de pila añadidos a Allure, con documentación completa #460 (extensions)

  • Extensión Robolectric añadida al build principal (extensions)

Cambios importantes

  • El módulo kotest-extensions-junit5extensions ahora se llama kotest-extensions-junit5

4.2.6 octubre de 2020

Características

  • Listener por proyecto añadido para Testcontainers #1731

Corrección de errores

  • Regresión corregida en shouldBe con iterables/arrays #1707 #1727

  • Corrección del primer fallo en bloques beforeTest #1736

  • Se marca como obsoleto distinct #1730

  • Corregido el resultado vacío de allure para pruebas con el bloque afterTest fallido #1724

4.2.5 Septiembre 2020

  • Corrección: Solucionado problema de rendimiento al usar miles de pruebas en Gradle #1693

  • Característica: Añadidos matchers para componentes de Pair / Triple #1694

  • Característica: Añadido matcher shouldHaveNameWithoutExtension para archivos y rutas #1696

  • Mejora: Añadido modo de ciclo de vida para Koin #1710

4.2.4 Septiembre 2020

  • Corrección: El tiempo de prueba no escala con el número de pruebas #1685

  • Corrección: Añadido modo de ciclo de vida para Spring Listener #1643

  • Corrección: Arreglada y eliminada doble negación en aserciones de directorios vacíos

  • Mejora: La excepción por nombres duplicados debe incluir el nombre de la prueba #1686

  • Mejora: SpringListener genera nombres de método significativos #1591

4.2.3 Septiembre 2020

  • Corrección: Los throwables de tipo Error deben reportarse a los listeners del motor

  • Corrección: Cambiado classgraph a api

  • Corrección: Las comparaciones de Set usan .contains() en lugar de búsqueda lineal #1672

  • Corrección: Cambiado retardo predeterminado de reintento a 1 #1670

  • Corrección: Eliminado uso de API de Kotlin 1.4 en pruebas de propiedades

  • Mejora: Permitir que retry llame a funciones suspendidas #1669

  • Mejora: Añadido alias de matcher para Iterator have next #1664

  • Mejora: Añadidos matchers para java.util.Optional #1662

  • Mejora: Extendidos matchers de Ktor a librerías cliente #1658

  • Mejora: Añadida aserción forNone #1654

  • Mejora: Arb y Exhaustive deben ser covariantes #1653

  • Mejora: Eliminada prueba extra executionError molesta en Gradle #1655

  • Mejora: Mensaje de error más útil al fallar la instanciación de spec

  • Documentación: Actualizada documentación de dependencias Gradle eliminando sufijo -jvm innecesario #1650

  • Documentación: Extensión MockServer #1446

4.2.2 Agosto 2020

  • Corrección: Eliminado uso de método exclusivo de Kotlin 1.4

  • Corrección: Solucionado KotlinReflectionInternalError en enums Java #1611

  • Corrección: Errores en DiscoveryExtension no se propagaban a la salida #1634

  • Corrección: Etiquetas especificadas vía DSL inline no se detectaban #1642

  • Mejora: Mejorada salida de matchers de colecciones mostrando un elemento por línea #1380

4.2.1 Agosto 2020

  • Característica: Las librerías de aserciones ahora publican para watchos, tvos e ios además de macos, windows y linux

4.2.0 Agosto 2020 - Blog

  • Característica: Actualizado a Kotlin 1.4.0 #1511

  • Característica: Permitir detección y fusión de múltiples configuraciones de proyecto #1632

  • Característica: Permitir control de mayúsculas en reportes de pruebas #1458

  • Característica: Usar expresiones para etiquetas en lugar de include/exclude #863

  • Característica: Añadidas nuevas funciones de callback con ámbito #1584

  • Función: Soporte para la anotación de orden en SpecOrder #1593

  • Función: Anulaciones a nivel de Spec para timeouts y tiempos de invocación #1551

  • Mejora: Añadido modo exhaustivo exclusivo para pruebas de propiedades #1596

  • Mejora: Cambio de instancias de matchers para usar contratos genéricos #1510

  • Mejora: Permitir desactivar advertencia de SpringListener en clases finales #1573

  • Mejora: Incluir runner de consola en el plugin de IntelliJ #1567

  • Mejora: Mensaje de error mejorado para map should contain cuando la clave está presente #1587

  • Mejora: Permitir personalización de Allure #1527

  • Mejora: Uso del identificador de licencia SPDX "Apache-2.0" en archivos POM #1517

  • Mejora: Permitir parámetros suspendidos en forAll(1) #1626

  • Corrección: Ejecutar todas las pruebas en un paquete no incluye subpaquetes #1621

  • Corrección: No se puede ejecutar un único método de prueba desde Gradle 6.5 #1531

  • Corrección: Listeners de TestFactory no se ejecutan en pruebas anidadas #1613

  • Corrección: Deshabilitar ejecución con métodos x- no funciona en kotest-core-js #1623

  • Corrección: NoSuchFileException al usar kotest-extensions-junitxml con Gradle #1581

  • Corrección: Reporte JUnit incompleto con FunSpec #999

  • Cambio Rompedor: El módulo kotest-core ha sido reemplazado por kotest-framework-api y kotest-framework-engine. Autores de herramientas pueden depender solo de api. Engine debe usarse para pruebas JS. Para pruebas JVM, continuar usando kotest-runner-junit5-jvm.

4.1.2 Julio 2020

  • Corrección: Dkotest.tags.include= solo considera @Tags #1536 sksamuel

  • Corrección: Asegurar que exhaustive no se construye con lista vacía #1549 Cleidiano Oliveira

  • Corrección: Añadir runner de spec concurrente y corregir runner secuencial #1547 sksamuel

  • Corrección: Considerar range en IntShrinker y LongShrinker #1535 sksamuel

  • Función: Soporte de expresiones para tags como alternativa a include/exclude #863 sksamuel

  • Función: Extensión de algunos matchers a Iterable #1538 Leonardo Colman Lopes

  • Mejora: Capacidad para hacer sustituciones de parámetros al ejecutar archivos HTTP #1560 Shane Lathrop

  • Mejora: Añadidas opciones xGiven/xWhen/xThen a Behavior spec #1534 sksamuel

  • Mejora: Sintaxis mejorada para Test Containers sksamuel

  • Mejora: Restaurar contexto en describe #1565 sksamuel

  • Cambio Rompedor: Actualización de firma de assertSoftly para recibir objeto bajo prueba Ashish Kumar Joy

4.1.1 Junio 2020

  • Corrección: Se solucionó un problema con describe spec y el plugin de IntelliJ #1528

  • Corrección: Mensaje de error incorrecto en Exhaustive's when al estar por debajo del mínimo de iteraciones #1526

4.1.0 Junio 2020 - Blog

  • Característica: El plugin Kotest para IntelliJ alcanza versión final. Requiere Kotest 4.1 o superior. https://plugins.jetbrains.com/plugin/14080-kotest

  • Característica: Resalta diferencias al comparar data classes #826 #1242

  • Característica: Mejorar mensajes de error en matchers de tolerancia #1230

  • Característica: Añadido Arb para (lat, long) #1304

  • Característica: Integración con Testcontainers #1353

  • Característica: Variantes x para specs Behavior/Feature/Expect #1383

  • Característica: Configuración global para pruebas de propiedades con callbacks before/after #1435

  • Característica: Ejecución paralela de casos de prueba en Spec #1362

  • Característica: Añadido variable.assertSoftly #1427

  • Característica: Utilidad de corrutinas para timeouts #1447

  • Característica: Añadir timeout para pruebas individuales con invocaciones > 1 #1442

  • Característica: Añadido matcher shouldExistInOrder #1460

  • Característica: Añadido Arb.orNull #1414

  • Característica: Opción para eliminar prefijos en salida de tests con specs que usan prefijos #1486

  • Característica: Añadido matcher shouldCompleteExceptionallyWith #1454

  • Característica: Exhaustive.merge para dos generadores con supertipo común #1502

  • Mejora: Añadidos Byte.shouldBeBetween(min, max) y Arb.bytes #1408

  • Mejora: Eliminados alias de kotlintest #1457

  • Mejora: Los ámbitos padres no son ámbitos de corrutinas #1488

  • Mejora: Usar isolation en lugar de isolationMode #1418

  • Mejora: Mejoras en igualdad mediante reflexión #1413

  • Mejora: Pruebas de propiedades deben reportar excepciones en inputs reducidos #1279

  • Mejora: Convertir beforeProject y afterProject en funciones suspendidas #1461

  • Mejora: Actualización de Arb.flatMap para aceptar listas #1500

  • Mejora: Los generadores de fechas deben permitir seleccionar fechas específicas #1354

  • Corrección de error: Casos de prueba con nombres multilínea fallaban #1441

  • Corrección de error: Before\AfterProject capturaban solo una excepción #1387

  • Corrección de error: Arb.bind() llamaba al constructor incorrecto #1487

  • Corrección de error: El volcado de configuración del proyecto no incluía correctamente los enums #1379

  • Corrección de error: Añadir Arb.choose que acepte arbs ponderados #1499

  • Corrección de error: Arb.list no utilizaba ListShrinker #1493

4.0.6 Junio 2020

  • Corrección de error: Las dependencias de assertions-core ahora se incluyen correctamente sin usar el runner de JUnit #1425

  • Corrección de error: checkAll fallaba si el tamaño exhaustivo era muy grande #1456

  • Corrección de error: El typeclass Show para java.nio.file.Path causaba desbordamiento de pila #1313

4.0.5 Abril 2020

  • Corrección de error: El modo foco ignoraba algunas pruebas anidadas #1376

  • Corrección de error: Arb.choice incluía casos límite en los valores generados #1406

  • Corrección de error: Los casos límite de Arb.int y Arb.long incluían valores fuera del rango especificado #1405

4.0.4 Abril 2020

  • Corrección de error: Excepciones de tipo LinkageError (comúnmente ExceptionInInitializerError) no se manejaban #1381

4.0.3 Abril 2020

  • Función: Soporte para Koin 2.1 #1357

  • Desaprobación: El contexto de cadena en ShouldSpec está obsoleto en favor del bloque context #1356

  • Mejora: Añadidos saltos de línea al matcher Collection.containExactly #1380

  • Mejora: El matcher de tolerancia emite mensajes de fallo más claros (incluyendo valores ±) #1230

  • Corrección de error: El volcado de configuración del proyecto ahora muestra valores correctos para ordenación de pruebas y modo de aislamiento #1379

  • Corrección de error: Se restaura el orden de autoclose para funcionar como en la versión 3.4.x (era indefinido en la 4.0.x) #1384

  • Corrección de error: Se soluciona shouldContainExactly para arrays #1364

4.0.2 Abril 2020

  • Función: Se añaden filter y map a Exhaustives #1343

  • Función: Matcher shouldBeInteger utilizando contracts #1315

  • Corrección de error: Se soluciona el problema con xdescribe en describe spec que siempre estaba activo

  • Corrección de error: Las etiquetas simples usaban nombres de clase completos en lugar del nombre simple, rompiendo compatibilidad hacia atrás #1346

  • Mejora: Cacheo de resultados de descubrimiento para mayor rendimiento en maven #1325

  • Corrección de error: Cierre de recursos usados en el escaneo classgraph #1323

  • Corrección de error: Se soluciona el timeout para corrutinas lanzadas dentro de tests sin su propio ámbito #1345

  • Corrección de error: Se soluciona Arb.bind que devolvía siempre el mismo valor #1348

  • Corrección de error: Se restaura el uso de aserciones opentest4j #1339

  • Corrección de error: Se soluciona la falta de traza de pila en pruebas basadas en datos #1336

  • Corrección de error: Se soluciona Arb.instant que siempre devolvía el mismo valor #1322

  • Corrección de error: Se añade solución temporal para bugs de gradle 5.

4.0.1 Marzo 2020

  • Mejora: Se actualiza Kotlin a 1.3.71

  • Función: Se añade Arb para latitud/longitud #1304

4.0.0 Marzo 2020

La versión 4.0.0 es una gran actualización. Con el cambio de nombre del proyecto, los paquetes y nombres de módulo han cambiado.

Cambios principales:

  • El proyecto KotlinTest ahora es multiplataforma. Esto significa que la mayoría de módulos requieren añadir el sufijo -jvm si trabajas exclusivamente en JVM del lado del servidor. Por ejemplo, io.kotlintest:kotlintest-runner-junit5 pasa a ser io.kotest:kotest-runner-junit5-jvm, considerando tanto el cambio de paquete como el sufijo de plataforma.

  • La biblioteca principal de aserciones es ahora kotest-assertions-core y se han añadido muchas nuevas aserciones (matchers). Este registro de cambios no las listará todas. Es más sencillo consultar la lista completa.

  • La biblioteca para pruebas de propiedades se ha movido al nuevo módulo kotest-property y ha sido rediseñada para incluir nuevas funcionalidades. Las antiguas clases para pruebas de propiedades están obsoletas y se eliminarán en futuras versiones.

  • Se han añadido muchos nuevos generadores para pruebas de propiedades. La lista completa está aquí.

  • Se han añadido especificaciones componibles en forma de Fábricas de Pruebas.

  • La configuración de proyecto ya no requiere ubicarse en un paquete especial, sino que puede situarse en cualquier lugar del classpath.

  • Se ha añadido @Autoscan para listeners y extensiones.

  • Se ha añadido una versión DSL de los callbacks del ciclo de vida de pruebas.

Cambios menores.

  • Función: Se ha añadido un nuevo módulo de aserciones para JSoup. #1028

  • Función: Matchers estadísticos #851

  • Función: Soporte experimental para Robolectric #926

  • Corrección: shouldNotThrowAny ahora retorna T en lugar de Unit #981

  • Interno: Eliminada dependencia de Arrow para evitar conflictos de versión

  • Función: Configuración predeterminada global para casos de prueba

  • Función: whenReady(f) ha sido reemplazado por f.whenReady con soporte para corrutinas

  • Función: Ordenación alfabética de casos de prueba

  • Función: Todos los callbacks de prueba ahora soportan corrutinas

  • Función: forEachAsClue

  • Mejora: Soporte para Koin 2.1.0

  • Mejora: Permitir explícitamente clases internas como specs

  • Función: Soporte para matchers de Klock #1214

  • Función: Soporte para matchers JDBC #1221

3.4.2

  • Corrección: Mejora de SpringListener para funcionar correctamente con todos los Listeners de Spring #950

3.4.1

  • Interno: Eliminadas redeclaraciones de JUnit #927

  • Función: Añadido modificador infix a más matchers de Arrow #921

  • Función: Matchers de rango para BigDecimal #932

  • Función: Matcher de crecimiento/decrecimiento monótono/estricto #850

  • Función: Corrección en comparaciones de shouldBe y shouldNotBe #913

  • Función: Sobrecarga añadida al matcher shouldHaveStatus de Ktor #914

  • Función: Fallo en pruebas padre cuando fallan pruebas hijas #935

3.4.0

  • Función: Soporte para ejecutar pruebas con Koin #907

  • Función: Opción de timeout global aplicable a todas las pruebas #858

  • Función: Introducido await como versión mejorada de eventually #888 #793

  • Función: Sobrecargas de array para todos los matchers #904

  • Función: Soporte para Listeners de prueba de Spring #887

  • Función: Limitar paralelismo para ciertos specs #786

  • Característica: Se ha añadido un nuevo listener de proyecto #859

  • Característica: Modificación de extensiones de sistema para admitir diferentes modos #843

  • Característica: Impresión de configuraciones de proyecto #841 #866

  • Característica: Nuevas variaciones de matchers para fechas (mes, unidades de tiempo, día de semana, etc) #899

  • Característica: Opción de configuración para número mínimo de líneas en diff multillínea #706

  • Característica: Permitir scope describe anidado en DescribeSpec #905

  • Característica: Matcher para fechas que ignora zonas horarias #891

  • Característica: Matchers de reflexión #614 #894

  • Característica: Matchers de cadena para línea única y tamaño entre rangos #853

  • Característica: Contratos y variaciones lambda de matchers para tipos arrow #802 #890 #834

  • Característica: Matchers para LocalTime añadidos #889

  • Característica: Variantes Zoned y Offset date time para shouldBeToday #820

  • Característica: Nuevos matchers para excepciones #864

  • Característica: Matchers para Result añadidos #836 #861

  • Característica: Matchers para BigDecimal añadidos #875

  • Característica: shouldBeSymbolicLink y shouldHaveParent añadidos para archivos #871

  • Característica: Matchers JSON desde recursos #873

  • Característica: Matchers shouldBeZero y shouldNotBeZero para tipos numéricos #819 #848

  • Característica: Matcher shouldContainFiles para rutas añadido #854

  • Característica: Los matchers URI ahora funcionan también con URLs #818

  • Característica: Permitir configurar modo de aislamiento en configuración de proyecto #842

  • Característica: Matcher containFileDeep para archivos añadido #846

  • Característica: Implementa SkipTestException #805

  • Característica: Implementa matchers Double para Infinity y NaN #801

  • Característica: Función de ayuda asClue añadida #784

  • Función: Añade matchers de mapas en notación infija usando Pair #792

  • Función: Añade generadores para tipos primitivos Short y Byte #773

  • Función: Implementa la función Gen.take(n) #758

  • Función: Implementa la función Gen.next(predicado) #759

  • Función: Soporte para modificar tamaños de listas, conjuntos y mapas generados #757

  • Función: Permite excluir/incluir etiquetas en tiempo de ejecución #761

  • Corrección: Añade parte faltante en mensaje de shouldHaveLength #870)

  • Corrección: Actualiza matchers JSON para incluir el JSON real en el error

  • Corrección: Soluciona problema con listeners before/after test que no fallaban tests #842 #865

  • Corrección: Modifica autoClose para aceptar AutoCloseable #847

  • Corrección: Soluciona problema izquierda vs derecha #612

  • Corrección: Asegura que specs que fallan en inicialización fallen en builds Maven #832

  • Corrección: Garantiza reporte correcto cuando hay excepciones en bloques init, beforeSpec o afterSpec #771

  • Interno: io.kotlintest.Result renombrado a io.kotlintest.MatcherResult para evitar conflicto con kotlin.Result #898

3.3.0

  • Función: ¡Plugin para Intellij ya disponible!

  • Función: FunSpec ahora permite bloques de contexto padre

  • Función: Matcher between para java.time (#694)

  • Función: Listeners constantes 'now' (#693)

  • Función: Plugin PITest (#687)

  • Función: Inyección de mocks Spring @MockBean @MockkBean (#684)

  • Función: Matchers instanceOf y typeOf usan el valor casteado (#695)

  • Función: Matchers de Digest #667

  • Función: Función de aserción continually #643

  • Función: Añade opción de configuración para assertSoftly #512 (#655)

  • Función: Implementa System Security Manager Extensions (#640)

  • Función: Implementa System Environment Extension (#633)

  • Novedad: Implementación del matcher y aserciones shouldBeOneOf (#647)

  • Novedad: Adición de matchers de nulabilidad con Kotlin Contracts (#602) (#646)

  • Novedad: Asistentes para pruebas con SystemProperty #524 (#608)

  • Novedad: Extensión para Timezone/Locale #587 (#609)

  • Novedad: Migración de extensiones al módulo Kotlintest-Extensions (#629)

  • Novedad: Generadores numéricos basados en rangos y generadores para javax.time #530 (#543)

  • Novedad: Ampliación de la especificación Word Spec (#635)

  • Novedad: Implementación de matchers shouldNotThrow (#603)

  • Mejora: Hacer configurables los diffs multilínea "condensados" #607

  • Mejora: Permitir que las extensiones de Arrow Either soporten tipos anulables (#613)

  • Mejora: Habilita test! en todas las especificaciones (#606)

  • Mejora: Adición de extensiones para pruebas de propiedades con generadores personalizados (#506)

  • Mejora: Adición de flag para issues en config #525

  • Corrección: Soporte añadido para selectores de paquetes en solicitudes de descubrimiento JUnit #597

  • Corrección: Pruebas de nivel superior deshabilitadas no marcadas como ignoradas en JUnit #656

  • Corrección: Solución para containOnlyOnce que devolvía true sin ocurrencias (#660)

  • Interno: Despliegue automático de snapshots en cada compilación de Travis

  • Interno: Eliminación de todos los matchers/aserciones obsoletos (#653)

3.2.1

  • Novedad: AnnotationSpec ahora tiene configuración de excepción expected #527 #559

  • Novedad: BehaviorSpec permite anidamiento adicional con And entre palabras clave #562 #593

  • Corrección: Pruebas independientes compartían hilo causando timeouts inesperados #588 #590

  • Mejora: Documentación aclarada sobre TestConfig.invocations #591 #592

3.2.0

  • Característica: Soporte para corrutinas directamente desde las pruebas #386

  • Característica: Modo de aislamiento añadido para controlar con mayor precisión las instancias en las que se ejecutan las pruebas #379

  • Característica: Al reejecutar pruebas, se ejecutan primero las especificaciones que fallaron previamente #388

  • Característica: Soporte para @Before y @After en AnnotationSpec para facilitar la migración desde JUnit #513

  • Característica: Soporte para selectores de paquetes en el descubrimiento de pruebas #461

  • Mejora: Los listeners de pruebas se han rediseñado para hacerlos más potentes y claros #494

  • Mejora: Mejor soporte para comparaciones de cadenas multilínea #402

  • Mejora: Gen.oneOf debe ser covariante #471

  • Mejora: Double debe tener matchers opuestos para shouldBePositive y shouldBeNegative #435

  • Mejora: Nuevos matchers #393 #325

  • Corrección de errores: BehaviorSpec no permite configurar errores #495

  • Corrección de errores: Error al lanzar AssertionError desde dentro de un bloque shouldThrow{} #479

  • Corrección de errores: Corrección de timeouts en pruebas #476

  • Corrección de errores: Corrección del mensaje de error en AnnotationSpec #539

  • Interno: La compilación ahora usa Kotlin 1.3 #379

  • Interno: Actualización del escaneo de clases para usar ClassGraph en lugar de Reflections #459

3.1.11

  • Característica: Soporte de notación infija para matchers de cadenas #443

  • Característica: Soporte de notación infija para matchers de archivos, floats, secuencias, tipos y URIs #445

  • Característica: Soporte de notación infija para matchers de Double #429

  • Característica: Soporte de notación infija para matchers de Map #417

  • Característica: shouldNotBePositive y shouldNotBeNegative para matchers de Double #435

  • Característica: Soporte para Duration en matchers de tiempo #423

  • Característica: Matcher arrow-assertion Failure que verifica la igualdad del throwable subyacente #427

  • Característica: shouldNotBeTrue y shouldNotBeFalse para matchers booleanos #452

  • Mejora: Documentación para Gen.int() #419

  • Mejora: Documentación Javadoc para los comparadores de fechas #420

  • Mejora: Mensaje de error más claro para colecciones vacías en comparadores #438

  • Mejora: Mejor filtrado de trazas de pila en la clase Failures #465

  • Corrección: El comparador shouldNotBeExactly para Double tenía una implementación incorrecta #432

  • Corrección: Pruebas de un solo hilo ejecutaban before y after en hilo diferente al de la prueba #447

  • Corrección: Pruebas con invocaciones > 1 no finalizaban si fallaban #413

  • Corrección: Aserción incorrecta en shouldThrow #479 #484

3.1.10

  • Funcionalidad: Versión en notación infija para comparadores inline, ej. date1 shouldHaveSameYearAs date2 (#404 #407 #409)

  • Funcionalidad: Soporte infijo para comparadores de enteros y largos (#400)

  • Funcionalidad: Añadidos comparadores startsWith/endsWith para colecciones (#393)

  • Mejora: Uso de representaciones inequívocas en comparadores de colecciones (#392)

  • Mejora: Los comparadores de colecciones ahora funcionan también con Sequence (#391)

  • Mejora: Añadida variante shouldThrowUnit de shouldThrow (#387)

  • Corrección: Comportamiento de shouldBe en arrays sin tipo estático (#397)

3.1.9

  • Funcionalidad: Añadidas aserciones suaves (#373)

  • Funcionalidad: Comparadores sortedWith (y relacionados) (#383)

  • Mejora: Eliminada restricción innecesaria Comparable<T\> en comparadores sortedWith (#389)

  • Mejora: Mejorado algoritmo de StringShrinker (#377)

  • Corrección: shouldBeBetween debería usar shouldBe en lugar de shouldNotBe (#390)

  • Corrección: beLeft comparaba contra Either.Right en lugar de Either.Left (#374)

  • Interno: Nombrado de servicios ejecutores para monitorización JMX

3.1.8

  • Corrección: Omisión de pruebas cuando se establece MethodSelector #367 (permite ejecutar pruebas individuales en IntelliJ)

  • Corrección: Solucionado error al ejecutar pruebas individuales en kotlintest-tests (#371)

  • Corrección de errores: Solucionado el problema en las pruebas de tablas para forNone y el matcher between de Double (#372)

  • Mejora: Eliminación de frames de matchers en los stacktraces (#369)

  • Mejora: Uso de representaciones de cadena menos ambiguas en errores de igualdad (#368)

  • Mejora: Optimización de mensajes de error en comparaciones de cadenas (#366)

  • Interno: Actualización de Kotlin a 1.2.50 (#365)

3.1.7

  • Función: Añadidos matchers Int/Long.shouldBeNegative e Int/Long.shouldBePositive #325

  • Función: Añadidos matchers shouldBeNegative y shouldBePositive para Double #325

  • Función: Añadidos matchers shouldBeLargerThan(c), shouldBeSmallerThan(c) y shouldBeSameSizeAs(c) para colecciones #325

  • Función: Añadidos matchers shouldHaveAtLeastSize(n) y shouldHaveAtMostSize(n) para colecciones.

  • Función: Añadido matcher para uri.opaque

  • Función: Añadidos matchers containsExactly y containsExactlyInAnyOrder (#360)

  • Función: Implementados filtros para casos de prueba

  • Corrección de errores: Ejecución de pruebas individuales mediante línea de comandos de Gradle #356

  • Cambio: Eliminado soporte para corrutinas hasta que deje de ser experimental

  • Mejora: Optimización del matcher sorted (#359)

  • Mejora: Permitir que los matchers de tipo funcionen con valores anulables (#358)

  • Mejora: Permitir receptores anulables en matchers de cadenas (#352)

  • Mejora: Ejecutar pruebas para todas las filas de una tabla, incluso tras errores (#351)

3.1.6

  • Las especificaciones ahora soportan corrutinas #332

  • Versión de inspectores como funciones de extensión.

  • Inspectores para NonEmptyLists de Arrow

  • Nuevo estilo de pruebas basadas en datos con detección de nombres de parámetros

  • Estilo de funciones de extensión para assertAll en pruebas de propiedades

  • Actualización de matchers de cadenas para mostrar mejores errores con entradas nulas o vacías

  • Permitir argumentos anulables en más funciones de matchers #350

  • Añadidas funciones de extensión para pruebas basadas en tablas #349

3.1.5

  • Solución para error en Gradle que no soportaba eventos paralelos en pruebas

  • Reintroducción de propiedades de extensión Duration #343

  • Añadida solución para problemas con Gradle 4.7 #336

  • shouldBe no maneja el tipo long de Java #346

  • Corrección del tipo de retorno en la documentación de forAll() (#345)

  • Corrección de erratas en reference.md (#344)

  • Convertir las clases de datos Table y Row en covariantes (#342)

  • Corrección de nombres de argumentos en ReplaceWith de matchers obsoletos (#341)

3.1.4

  • Corrección en la conversión de nanosegundos en eventually (#340)

  • Mejora en las sobrecargas de shouldBe para arrays (#339)

3.1.3

  • Solución temporal para error en Gradle 4.7/4.8 #336

  • Corrección en matchers de ruta URI y parámetros URI (#338)

3.1.2

  • Añadidos matchers isUnique para NonEmptyList de Arrow

  • Añadidos reducidores para Float y List

  • Funciones auxiliares añadidas para inspección y extracción (#334)

  • Permite añadir etiquetas a specs para todos los casos de prueba #333

  • Soporte para orden aleatorio en pruebas de nivel superior #328

3.1.1

  • Opción focus para pruebas de nivel superior #329

  • Mejora en el proceso de reducción #331

  • Actualización del README para generadores personalizados #313

  • Añadido generador para UUIDs

  • Corregido error donde auto-close no se ejecutaba. Obsoleto ProjectExtension en favor de TestListener.

  • Añadidos matchers para casos extremos en la extensión Arrow; añadidos matchers de Arrow para listas.

Versión 3.1.0

  • Configuración Simplificada

En KotlinTest 3.1.x basta con habilitar JUnit en el bloque test de tu build de Gradle, en lugar de usar el plugin de Gradle para JUnit. Este paso es idéntico al de cualquier framework de pruebas que utilice la plataforma JUnit.

Asumiendo que tienes gradle 4.6 o superior, configura tu bloque test así:

test {
useJUnitPlatform()
}

Además, puedes habilitar el registro de pruebas adicional:

test {
useJUnitPlatform()
testLogging {
events "FAILED", "SKIPPED", "STANDARD_OUT", "STANDARD_ERROR"
}
}
  • Instancia por prueba para todas las especificaciones

En la versión 3.0.x se eliminó la capacidad de permitir una instancia por prueba en algunos estilos de spec debido a dificultades de implementación. Esto se ha solucionado en 3.1.x, por lo que todos los estilos de spec permiten ahora instancia por prueba como en las versiones 2.0.x. Nota: El valor predeterminado es false, por lo que las pruebas usarán una única instancia compartida del spec para todas las pruebas a menos que se sobrescriba la función isInstancePerTest() para devolver true.

  • Cambio Rompedor: Sintaxis de Configuración

La sintaxis de configuración ha cambiado. Ahora, en lugar de realizar una llamada a función después de definir la prueba, se especifica después del nombre de la prueba.

Por lo tanto, en lugar de:

"this is a test" {
}.config(...)

Ahora deberás hacer:

"this is a test".config(...) {
}
  • Matchers como funciones de extensión

Todos los matchers pueden usarse ahora como funciones de extensión. Así que en lugar de:

file should exist()

or

listOf(1, 2) should containNull()

Puedes hacer:

file.shouldExist()

or

listOf(1, 2).shouldContainNull()

Nota: El estilo infijo no está obsoleto y se mantendrá en futuras versiones, pero la función de extensión será el estilo preferido a partir de ahora, ya que permite descubrirlos en el IDE.

  • Docenas de nuevos Matchers

even y odd

Comprueba que un Int sea par o impar:

4 should beEven()
3 shouldNot beEven()

3 should beOdd()
4 shouldNot beOdd()

beInRange

Comprueba que un int o long esté dentro del rango dado:

3 should beInRange(1..10)
4 should beInRange(1..3)

haveElementAt

Verifica que una colección contiene el elemento dado en un índice específico:

listOf("a", "b", "c") should haveElementAt(1, "b")
listOf("a", "b", "c") shouldNot haveElementAt(1, "c")

Ayuda al inferidor de tipos cuando se usan valores nulos:

listOf("a", "b", null) should haveElementAt<String?>(2, null)

readable, writeable, executable y hidden

Comprueba si un archivo es legible, escribible, ejecutable o está oculto:

file should beRadable()
file should beWriteable()
file should beExecutable()
file should beHidden()

absolute y relative

Comprueba si la ruta de un archivo es relativa o absoluta.

File("/usr/home/sam") should beAbsolute()
File("spark/bin") should beRelative()

startWithPath(path)

Comprueba si la ruta de un archivo comienza con el prefijo especificado:

File("/usr/home/sam") should startWithPath("/usr/home")
File("/usr/home/sam") shouldNot startWithPath("/var")

haveSameHashCodeAs(other)

Verifica que dos objetos tienen el mismo código hash.

obj1 should haveSameHashCodeAs(obj2)
"hello" shouldNot haveSameHashCodeAs("world")

haveSameLengthAs(other)

Comprueba que dos cadenas tienen la misma longitud.

"hello" should haveSameLengthAs("world")
"hello" shouldNot haveSameLengthAs("you")

haveScheme, havePort, haveHost, haveParameter, havePath, haveFragment

Matchers para URIs:

val uri = URI.create("https://localhost:443/index.html?q=findme#results")
uri should haveScheme("https")
uri should haveHost("localhost")
uri should havePort(443)
uri should havePath("/index.html")
uri should haveParameter("q")
uri should haveFragment("results")
  • Matchers de fechas: before/after/haveSameYear/haveSameDay/haveSameMonth/within

  • Colecciones: containNull, containDuplicates

  • Futures: completed, cancelled

  • String: haveLineCount, contain(regex)

  • Tipos: haveAnnotation(clase)

  • Módulo de matchers para Arrow

Se ha añadido un nuevo módulo que incluye matchers para Arrow, la popular y potente biblioteca de programación funcional para Kotlin. Para incluir este módulo, añade kotlintest-assertions-arrow a tu build.

Los matchers incluidos son:

Option: Comprueba que un Option tiene el valor dado o es un None. Por ejemplo:

val option = Option.pure("foo")
option should beSome("foo")

val none = None
none should beNone()

Either: Comprueba que un Either es un Right o un Left. Por ejemplo:

Either.right("boo") should beRight("boo")
Either.left("boo") should beLeft("boo")

NonEmptyList: Conjunto de matchers para NonEmptyList de Arrow (sin juego de palabras). Estos replican principalmente los matchers equivalentes de Collection pero para NELs. Por ejemplo:

NonEmptyList.of(1, 2, null).shouldContainNull()
NonEmptyList.of(1, 2, 3, 4).shouldBeSorted<Int>()
NonEmptyList.of(1, 2, 3, 3).shouldHaveDuplicates()
NonEmptyList.of(1).shouldBeSingleElement(1)
NonEmptyList.of(1, 2, 3).shouldContain(2)
NonEmptyList.of(1, 2, 3).shouldHaveSize(3)
NonEmptyList.of(1, 2, 3).shouldContainNoNulls()
NonEmptyList.of(null, null, null).shouldContainOnlyNulls()
NonEmptyList.of(1, 2, 3, 4, 5).shouldContainAll(3, 2, 1)

Try: Comprueba que un Try es un Success o un Failure.

Try.Success("foo") should beSuccess("foo")
Try.Failure<Nothing>(RuntimeException()) should beFailure()

Validation: Verifica que un Validation es Valid o Invalid

Valid("foo") should beValid()
Invalid(RuntimeException()) should beInvalid()
  • Generator Bind

Una forma potente de generar instancias de clases aleatorias a partir de generadores primitivos es usar la nueva función bind. Un ejemplo simple es tomar una clase de datos con dos campos, y luego usar dos generadores base y vincularlos para crear valores aleatorios de esa clase.

data class User(val email: String, val id: Int)

val userGen = Gen.bind(Gen.string(), Gen.positiveIntegers(), ::User)

assertAll(userGen) {
it.email shouldNotBe null
it.id should beGreaterThan(0)
}
  • Pruebas de propiedades: Clasificar

Al utilizar pruebas basadas en propiedades, puede ser útil visualizar la distribución de valores generados para garantizar que se obtiene una buena variedad de valores no triviales. Por ejemplo, al probar cadenas, es importante asegurarse de incluir suficientes casos con espacios en blanco.

Para generar estadísticas sobre la distribución, utilice classify con un predicado, una etiqueta para cuando el predicado se cumple y otra para cuando falla. Por ejemplo:

assertAll(Gen.string()) { a ->
classify(a.contains(" "), "has whitespace", "no whitespace")
// some test
}

Esto producirá una salida similar a:

63.70% no whitespace
36.30% has whitespace

Así podemos observar una distribución equilibrada de ambos tipos de valores.

No es obligatorio incluir dos etiquetas si solo desea etiquetar el caso "verdadero", y puede añadir múltiples clasificaciones. Por ejemplo:

forAll(Gen.int()) { a ->
classify(a == 0, "zero")
classify(a % 2 == 0, "even number", "odd number")
a + a == 2 * a
}

Esto generará una salida como:

51.60% even number
48.40% odd number
0.10% zero
  • Pruebas basadas en propiedades: Reducción (Shrinking)

  • Extensiones de Etiquetas

Se ha añadido un nuevo tipo de extensión llamado TagExtension. Las implementaciones pueden sobrescribir la función tags() para devolver dinámicamente instancias de Tag activas. Las propiedades de sistema kotlintest.tags.include y kotlintest.tags.exclude siguen vigentes, pero esta extensión permite lógicas más complejas en tiempo de ejecución.

Un ejemplo sería desactivar pruebas de Hadoop cuando no se ejecute en un entorno que carezca de la variable de entorno hadoop home. Tras crear un TagExtension, debe registrarse en la configuración del proyecto.

object Hadoop : Tag()

object HadoopTagExtension : TagExtension {
override fun tags(): Tags =
if (System.getenv().containsKey("HADOOP_HOME")) Tags.include(Hadoop) else Tags.exclude(Hadoop)
}

object MyProjectConfig : AbstractProjectConfig() {
override fun extensions(): List<Extension> = listOf(HadoopTagExtension)
}

object SimpleTest : StringSpec({
"simple test" {
// this test would only run on environments that have hadoop configured
}.config(tags = setOf(Hadoop))
})
  • Extensiones de Descubrimiento: instantiate()

En la interfaz DiscoveryExtension, se ha añadido la función fun <T : Spec> instantiate(clazz: KClass<T\>): Spec? que permite personalizar la creación de instancias de Spec. Por defecto se asume un constructor sin argumentos. Sin embargo, al sobrescribir esta función, se admiten clases Spec con otros constructores. Por ejemplo, el módulo Spring ahora usa esta extensión para inyección de dependencias. Otros casos incluyen inyectar clases de configuración o garantizar herencia específica.

Recuerde que las instancias de DiscoveryExtension se añaden en la configuración del proyecto.

  • Extensiones para System.out / error

Extensión para detectar escrituras en System.out o System.err. Añada el módulo kotlintest-extensions-system a su compilación.

Al agregar NoSystemOutListener o NoSystemErrListener a su configuración o clases, cualquier escritura en estos flujos lanzará SystemOutWriteException o SystemErrWriteException con el contenido intentado, permitiendo verificar la excepción.

Por ejemplo:

class NoSystemOutOrErrTest : StringSpec() {

override fun listeners() = listOf(NoSystemOutListener, NoSystemErrListener)

init {

"System.out should throw an exception when the listener is added" {
shouldThrow<SystemOutWriteException> {
System.out.println("boom")
}.str shouldBe "boom"
}

"System.err should throw an exception when the listener is added" {
shouldThrow<SystemErrWriteException> {
System.err.println("boom")
}.str shouldBe "boom"
}
}
}
  • Extensión para System.exit

Extensión en kotlintest-extensions-system para detectar llamadas a System.exit(Int). Intercepta estas llamadas y lanza SystemExitException con el código de salida en lugar de terminar la JVM.

Por ejemplo:

class SystemExitTest : StringSpec() {

override fun listeners() = listOf(SpecSystemExitListener)

init {

"System.exit should throw an exception when the listener is added" {
shouldThrow<SystemExitException> {
System.exit(123)
}.exitCode shouldBe 123
}
}
}
  • Actualizaciones del módulo Spring

El módulo de extensión kotlintest-extensions-spring se ha actualido para permitir la inyección mediante constructor. Esta nueva extensión se llama SpringAutowireConstructorExtension y debe añadirse a su `ProjectConfig. Así podrá usar dependencias inyectadas directamente en el constructor principal de su clase de prueba.

Por ejemplo:

@ContextConfiguration(classes = [(Components::class)])
class SpringAutowiredConstructorTest(service: UserService) : WordSpec({
"SpringListener" should {
"have autowired the service" {
service.repository.findUser().name shouldBe "system_user"
}
}
})
  • Ejecutor de JUnit 4

Se ha añadido un ejecutor de JUnit 4 que permite ejecutar KotlinTest en la plataforma heredada JUnit 4. Para utilizarlo, añade kotlintest-runner-junit4 a tu build en lugar de kotlintest-runner-junit5.

Nota: Está pensado para casos donde no se pueda usar JUnit 5. No debería ser la primera opción ya que su funcionalidad es limitada.

Concretamente:

  • En IntelliJ, los resultados de pruebas no se mostrarán anidados

  • No se puede dar soporte a beforeAll/afterAll a nivel de proyecto.

Versión 3.0.x - 29 de marzo de 2018

  • División en módulos

KotlinTest se ha dividido en múltiples módulos. Estos incluyen el núcleo (core), aserciones, el ejecutor junit y extensiones como spring, allure y junit-xml.

La idea es que en futuras versiones se puedan añadir más ejecutores (como TestNG) o soporte para JS (una vez que Kotlin multiplataforma salga de la versión beta). Al actualizar, normalmente deberás añadir kotlintest-core, kotlintest-assertions y kotlintest-runner-junit5 a tu build en lugar del antiguo módulo kotlintest que ya no existe. Al actualizar, es posible que necesites ajustar los imports de algunos comparadores.

testCompile 'io.kotlintest:kotlintest-core:3.0.0'
testCompile 'io.kotlintest:kotlintest-assertions:3.0.0'
testCompile 'io.kotlintest:kotlintest-runner-junit5:3.0.0'

Usuarios de Gradle:

Además, debes incluir apply plugin: 'org.junit.platform.gradle.plugin' en tu proyecto y classpath "org.junit.platform:junit-platform-gradle-plugin:1.1.0" en la sección dependencies de tu buildscript, o las pruebas no se ejecutarán (o peor, se bloquearán). Esto permite que Gradle ejecute pruebas basadas en jUnit-platform-5 (sobre lo que se construye KotlinTest). Nota: Gradle indica que esto no es necesario a partir de la versión 4.6, pero incluso con 4.6 parece ser necesario.

Usuarios de Maven:

Debes incluir lo siguiente en tus plugins:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
</plugin>

Y debes incluir

        <dependency>
<groupId>io.kotlintest</groupId>
<artifactId>kotlintest-runner-junit5</artifactId>
<version>${kotlintest.version}</version>
<scope>test</scope>
</dependency>

como dependencia regular.

  • Cambio importante: ProjectConfig

La configuración global del proyecto en KotlinTest se controla implementando una subclase de AbstractProjectConfig. En versiones anteriores podías nombrarla como quisieras y ubicarla donde prefirieras, y KotlinTest intentaría encontrarla y usarla. Esto causó numerosos reportes de errores sobre tiempos de inicio y fallos de reflexión. Por eso, en la versión 3.0.x en adelante, KotlinTest ya no escaneará el classpath.

En su lugar, debes llamar a esta clase ProjectConfig y ubicarla en el paquete io.kotlintest.provided. Debe seguir siendo una subclase de AbstractProjectConfig. Esto permite que kotlintest realice un simple Class.forName para encontrarla, evitando penalizaciones de inicio y problemas de reflexión.

La configuración del proyecto ahora permite registrar múltiples tipos de extensiones y listeners, además de configurar paralelismo.

  • Cambio importante: Los interceptores están obsoletos y se reemplazan por Listeners

Los antiguos inteceptors generaban confusión. Debías invocar la función de continuación o la especificación/prueba no se ejecutaría. No invocarla no significaba omitir la prueba, sino que se bloquearía.

Por ello, los interceptores están obsoletos y en algunos casos eliminados. Los que permanecen ahora están en clases llamadas SpecExtension y TestCaseExtension, y deben usarse esas interfaces en lugar de funciones directas.

Aquí tienes un ejemplo de un interceptor migrado.

val mySpecExtension = object : SpecExtension {
override fun intercept(spec: Spec, process: () -> Unit) {
println("Before spec!")
process()
println("After spec!")
}
}

Como reemplazo, en la versión 3.0.0 hemos añadido la interfaz TestListener que sigue el enfoque tradicional de callbacks antes/después. Además, estos métodos incluyen el resultado de la prueba (éxito, fallo, error, omitido), lo que proporciona más contexto al desarrollar plugins. La interfaz TestListener ofrece todo lo que hacían los antiguos interceptores y más.

Aquí tienes un ejemplo de un listener sencillo:

object TimeTracker : TestListener {

var started = 0L

override fun beforeTest(description: Description) {
TimeTrackerTest.started = System.currentTimeMillis()
}

override fun afterTest(description: Description, result: TestResult) {
val duration = System.currentTimeMillis() - TimeTrackerTest.started
println("Test ${description.fullName()} took ${duration}ms")
}
}

Si quieres usar estos métodos directamente en una Spec, puedes sobrescribir las funciones directamente porque una Spec ya implementa TestListener.

object TimeTracker : WordSpec() {

var started = 0L

override fun beforeTest(description: Description) {
started = System.currentTimeMillis()
}

override fun afterTest(description: Description, result: TestResult) {
val duration = System.currentTimeMillis() - started
println("Test ${description.fullName()} took ${duration}ms")
}

init {
"some test" should {
"be timed" {
// test here
}
}
}
}

Los listeners pueden añadirse a nivel de proyecto sobrescribiendo listeners() en el ProjectConfig.

Nota: En la próxima versión, se añadirán nuevas funciones de Extension similares a los antiguos interceptores pero con control completo del ciclo de vida. Por ejemplo, un futuro método de intercepción permitirá decidir si omitir, ejecutar o abortar una prueba. Serán más complejos y adecuados para casos avanzados. La interfaz TestListener seguirá disponible como opción preferente.

  • Paralelismo

Para ejecutar varias clases spec en paralelo, sobrescribe parallelism en tu ProjectConfig o usa la propiedad de sistema kotlintest.parallelism.

La propiedad de sistema siempre tiene prioridad sobre la configuración.

  • Soporte para Futures

Los casos de prueba ahora soportan esperar a futures de forma elegante. Si tienes un valor en un CompletableFuture que quieres probar al completarse, hazlo así:

val stringFuture: CompletableFuture<String> = ...

"My future test" should {
"support CompletableFuture<T\>" {
whenReady(stringFuture) {
it shouldBe "wibble"
}
}
}
  • Cambio importante: Modificaciones en Matchers de excepciones

El método shouldThrow<T\> ahora también detecta subclases. Por ejemplo, shouldThrow<IOException> coincidirá con excepciones tipo FileNotFoundException. Esto difiere del comportamiento en versiones anteriores. Si necesitas el comportamiento anterior (validación exacta del tipo), usa el nuevo shouldThrowExactly<T\>.

  • Módulo JUnit XML

Se añadió soporte para reportes en formato XML junit mediante el módulo kotlintest-extensions-junitxml. Este módulo proporciona un JUnitXmlListener que puedes registrar en tu proyecto para automatizar pruebas. Regístralo sobrescribiendo listeners() en ProjectConfig.

class ProjectConfig : AbstractProjectConfig() {
override fun listeners() = listOf(JUnitXmlListener)
}
  • Módulo Spring

El soporte para Spring se añadió mediante el módulo kotlintest-extensions-spring. Este módulo proporciona un SpringListener que puedes registrar en tu proyecto para automatizar pruebas. Regístralo para clases específicas sobrescribiendo listeners() en tu spec, por ejemplo:

class MySpec : ParentSpec() {
override fun listeners() = listOf(SpringListener)
}

También puedes registrarlo para todas las clases añadiéndolo al ProjectConfig. Consulta la sección sobre ProjectConfig para más detalles.

  • Cambio importante: Renombrado de propiedades para etiquetas

Las propiedades de sistema para incluir/excluir etiquetas se renombraron a kotlintest.tags.include y kotlintest.tags.exclude. Actualiza tus jobs de CI con las nuevas propiedades, ya que las antiguas no tienen efecto. Si se detectan las propiedades antiguas, se mostrará un warning al iniciar.

  • Nuevos Matchers

Se añadió beInstanceOf<T\> para verificar fácilmente que un objeto es instancia de T. Complementa al más detallado beInstanceOf(SomeType::class).

Para mapas se añadieron: containAll, haveKeys, haveValues. Estos muestran mensajes de error detallados indicando claves/valores o entradas faltantes.

Se han añadido nuevos matchers para Strings: haveSameLengthAs(other), beEmpty(), beBlank(), containOnlyDigits(), containADigit(), containIgnoringCase(substring), lowerCase(), upperCase().

Nuevos matchers para URIs: haveHost(hostname), havePort(port), haveScheme(scheme).

Nuevos matchers para colecciones: containNoNulls(), containOnlyNulls()

  • Cambio importante: Modificaciones en una instancia por prueba

Ya no se admite una instancia por prueba para especificaciones que ofrecen ámbitos anidados, como WordSpec. Esto se debe a la complejidad de hacer funcionar clausuras anidadas en instancias nuevas de la especificación. Al usar una instancia por prueba, se requiere una nueva clase de especificación para cada prueba, pero eso implica ejecutar selectivamente algunas clausuras y no otras para garantizar el estado correcto. Esto ha demostrado ser la mayor fuente de errores en versiones anteriores.

KotlinTest 3.0.x adopta un enfoque simplificado. Si deseas la flexibilidad de organizar tus pruebas con ámbitos anidados, todas las pruebas se ejecutarán en la misma instancia (como en Spek y ScalaTest). Si prefieres que cada prueba tenga su propia instancia (como en jUnit), puedes dividir tus pruebas en múltiples archivos o usar especificaciones "planas" como FunSpec o StringSpec.

Esto mantiene la implementación mucho más simple (y por tanto con menos probabilidad de errores) mientras ofrece un enfoque pragmático para satisfacer a ambos grupos de usuarios.

  • Nuevas Especificaciones

Se han añadido múltiples nuevas especificaciones: AnnotationSpec, DescribeSpec y ExpectSpec. Expect Spec permite usar palabras clave context y expect en tus pruebas, así:

class ExpectSpecExample : ExpectSpec() {
init {
context("some context") {
expect("some test") {
// test here
}
context("nested context even") {
expect("some test") {
// test here
}
}
}
}
}

La AnnotationSpec ofrece funcionalidad para emular jUnit, donde las pruebas son simplemente funciones anotadas con @io.kotlintest.specs.Test. Por ejemplo:

class AnnotationSpecExample : AnnotationSpec() {

@Test
fun test1() {

}

@Test
fun test2() {

}
}

Finalmente, el DescribeSpec es similar a SpekFramework, usando describe, and e it. Esto lo hace muy útil para quienes buscan migrar a KotlinTest desde SpekFramework.

class DescribeSpecExample : DescribeSpec() {
init {
describe("some context") {
it("test name") {
// test here
}
describe("nested contexts") {
and("another context") {
it("test name") {
// test here
}
}
}
}
}
}
  • Pruebas de Propiedad con Matchers

Se ha añadido la capacidad de usar matchers en pruebas de propiedad. Anteriormente, las pruebas de propiedad solo funcionaban con funciones que devolvían un booleano, como:

"startsWith" {
forAll(Gen.string(), Gen.string(), { a, b ->
(a + b).startsWith(a)
})
}

Pero ahora puedes usar assertAll y assertNone junto con matchers regulares dentro del bloque. Por ejemplo:

"startsWith" {
assertAll(Gen.string(), Gen.string(), { a, b ->
a + b should startWith(a)
})
}

Esto te permite usar múltiples matchers dentro del mismo bloque, sin preocuparte por combinar todos los posibles errores en un único resultado booleano.

  • Casos Límite en Generadores

Siguiendo con pruebas de propiedad: la interfaz Generator se ha modificado para proporcionar ahora dos tipos de datos.

El primero son valores que siempre deben incluirse: aquellos casos límite que son fuentes comunes de errores. Por ejemplo, un generador de enteros debe incluir siempre valores como cero, -1, +1, Integer.MAXVALUE e Integer.MIN_VALUE. Otro ejemplo sería un generador para enums, que debería incluir _todos los valores del enum para garantizar que cada valor sea probado.

El segundo conjunto son valores aleatorios, que se usan para proporcionar una mayor amplitud de valores probados. El generador de enteros debe devolver enteros aleatorios de todo el rango disponible.

Anteriormente, los generadores usados en pruebas de propiedad solo incluían valores aleatorios, lo que hacía improbable encontrar casos límite que suelen causar problemas (como los valores MAX/MIN de enteros). Ahora se garantiza que obtendrás primero los casos límite y luego los valores aleatorios.

  • Cambio importante: Eliminación de MockitoSugar

Esta interfaz añadía algunos helpers para Mockito, y se usaba principalmente antes de que aparecieran bibliotecas de mocking específicas para Kotlin. Actualmente tiene poco valor este mini-wrapper, por lo que se eliminó. Simplemente añade la biblioteca de mocking que prefieras a tu build y úsala normalmente.

  • CsvDataSource

Esta clase se ha añadido para cargar datos en pruebas de tablas. Un ejemplo sencillo:

class CsvDataSourceTest : WordSpec() {
init {

"CsvDataSource" should {
"read data from csv file" {

val source = CsvDataSource(javaClass.getResourceAsStream("/user_data.csv"), CsvFormat())

val table = source.createTable<Long, String, String>(
{ it: Record -> Row3(it.getLong("id"), it.getString("name"), it.getString("location")) },
{ it: Array<String> -> Headers3(it[0], it[1], it[2]) }
)

forAll(table) { a, b, c ->
a shouldBe gt(0)
b shouldNotBe null
c shouldNotBe null
}
}
}
}
}
  • Errores de negación en matchers

Todos los matchers ahora pueden reportar errores más descriptivos cuando se usan con shouldNot y shouldNotBe. Anteriormente se generaba un error genérico (normalmente el error estándar con prefijos como "NOT:"), pero ahora cada matcher integrado proporcionará mensajes completos, por ejemplo: Collection should not contain element 'foo'

Versión 2.0.0, publicada el 26 de marzo de 2017

Incidencias cerradas

Añadido

  • Ahora puedes escribir tests alternativamente como parámetro lambda en el constructor de la clase, ej:
class StringSpecExample : StringSpec({
"strings.size should return size of string" {
"hello".length shouldBe 5
"hello" should haveLength(5)
}
})
  • Se añadió forNone para pruebas de tabla, ej:
val table = table(
headers("a", "b"),
row(0L, 2L),
row(2L, 2L),
row(4L, 5L),
row(4L, 6L)
)

forNone(table) { a, b ->
3 shouldBe between(a, b)
}
  • Se han añadido interceptores. Permiten ejecutar código antes y después de un test. Consulta el README principal para más información.

  • Capacidad simplificada para añadir matchers personalizados. Solo implementa la interfaz Matcher<T\>. Ver README.

  • Se añadió shouldNot para invertir matchers. Ej: "hello" shouldNot include("hallo")

  • Deprecated matchers which do not implement Matcher<T>. Eg, should have substring(x) has been deprecated in favour of "hello" should include("l"). This is because instances of Matcher<T> can be combined with or and and and can be negated with shouldNot.

  • Se añadió matcher between para int y long, ej:

3 shouldBe between(2, 5)

  • Se añadió matcher singleElement para colecciones, ej:

x shouldBe singleElement(y)

  • Se añadió matcher sorted para colecciones, ej:

listOf(1,2,3) shouldBe sorted<Int>()

  • Ahora soporta comparación de arrays #116

  • Se añadió Gen.oneOf

    para crear generadores que devuelven valores de clases Enum.

Cambios

  • Las etiquetas ahora son objetos derivados de la clase Tag.

  • Las etiquetas ahora pueden incluirse y/o excluirse. Ya no se ejecutan automáticamente todos los tests sin etiqueta.

  • Se corrigieron errores de paréntesis que rompían el diseño en Intellij #112

Eliminado

  • Se eliminó FlatSpec por su sintaxis irregular con config y porque es esencialmente igual que StringSpec pero más complejo.

  • Sobrecargas de métodos deprecados con duration: Long, unit: TimeUnit

  • expecting para probar excepciones (usar shouldThrow ahora)

Versión 1.3.2, publicada el 5 de julio de 2016

Cambios

  • Se añadió matcher a shouldBe exactly(b) para doubles

  • kotlintest ahora solo incluye mockito-core en lugar de mockito-all

Versión 1.3.1, publicada el 3 de julio de 2016

Cambios

  • Actualización a Kotlin 1.0.3

Versión 1.3.0, publicada el 3 de julio de 2016

Issues Cerrados

Añadido

  • StringSpec. Ahora puedes usar cadenas de texto como base para las pruebas, por ejemplo:
class StringSpecExample : StringSpec() {
init {
"strings.size should return size of string" {
"hello".length shouldBe 5
"hello" should haveLength(5)
}

"strings should support config" {
"hello".length shouldBe 5
}.config(invocations = 5)
}
}
  • Pruebas con tablas. Las tablas permiten especificar manualmente combinaciones de valores para probar, siendo útiles para casos límite y otros valores específicos que desees verificar. Los encabezados se usan cuando fallan los valores, mostrando en la salida qué entradas se usaron para cada etiqueta. Ejemplo usando una tabla de tuplas de dos valores:
class TableExample : StringSpec(), TableTesting {
init {
"numbers should be prime" {
val table = table(
headers("a", "b"),
row(5, 5),
row(4, 6),
row(3, 7)
)
forAll(table) { a, b ->
a + b == 10
}
}
}
}
  • Pruebas de propiedades. Estas pruebas generan automáticamente valores para las pruebas. Proporcionas, o KotlinTest proporciona por ti, generators, que producen un conjunto de valores, ejecutándose la prueba unitaria para cada uno. Ejemplo usando dos cadenas y verificando sus longitudes:
class PropertyExample: StringSpec() {

"String size" {
forAll({ a: String, b: String ->
(a + b).length == a.length + b.length
})
}

}

Esta prueba se ejecutará 100 veces con valores aleatorios en cada iteración. Consulta más detalles en el archivo README.

  • autoClose. Los campos de tipo Closeable pueden registrarse para cierre automático de recursos:
class StringSpecExample : StringSpec() {
val reader = autoClose(StringReader("xyz"))

...
}
  • Matcher haveLength. Ahora puedes escribir para cadenas:
someString should haveLength(10)
  • Matcher haveSize. Ahora puedes escribir para colecciones:
myCollection should haveSize(4)
  • Matcher contain. Ahora puedes escribir:
val col = listOf(1,2,3,4,5)
col should contain(4)
  • Matcher containInAnyOrder. Ahora puedes escribir:
val col = listOf(1,2,3,4,5)
col should containInAnyOrder(4,2,3)
  • haveKey Map<K,V> matcher. You can now write
val map = mapOf(Pair(1, "a"), Pair(2, "b"))
map should haveKey(1)
  • haveValue Map<K,V> matcher. You can now write
val map = mapOf(Pair(1, "a"), Pair(2, "b"))
map should haveValue("a")
  • contain Map<K,V> matcher. You can now write
val map = mapOf(Pair(1, "a"), Pair(2, "b"))
map should contain(1, "a")
  • Matcher de referencias beTheSameInstanceAs. Es un alias para x should be theSameInstanceAs(y), permitiendo x should beTheSameInstanceAs(y) que encaja con el nuevo estilo de matchers.

Cambios

Reemplazo de timeout + timeUnit por Duration (#29)

Ahora puedes escribir config(timeout = 2.seconds) en lugar de config(timeout = 2, timeoutUnit = TimeUnit.SECONDS).

Obsoleto

nada

Eliminado

nada

Corregido