Registro de cambios
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>.shouldHaveValuecomo matcher (#3637)Añadido soporte adicional para java.time en enlace reflexivo (#3636)
Añadidas aserciones para KProperty0 (#3621)
Implementación de
Arb.listcon soporte paraArb<IntRange>yArb.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
@RequireTagsque 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
- Se añade el matcher shouldHaveSameInstantAs para OffsetDateTime. Corrige #3488 por @Kantis en https://github.com/kotest/kotest/pull/3501
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
Actualiza writing_tests.md por @erikhuizinga en https://github.com/kotest/kotest/pull/3497
Actualiza documentación de shouldBeEqualToComparingFields por @ktrueda en https://github.com/kotest/kotest/pull/3416
Otros
- Compila biblioteca Kotlin/Native para ARM64 en Linux por @charleskorn en https://github.com/kotest/kotest/pull/3521
⚠️ 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
@rescribet realizó su primera contribución en https://github.com/kotest/kotest/pull/3491
@ktrueda realizó su primera contribución en https://github.com/kotest/kotest/pull/3416
@erikhuizinga realizó su primera contribución en https://github.com/kotest/kotest/pull/3497
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
ConstantNowse han movido a un nuevo módulo llamadoio.kotest:kotest-extensions-now(recuerda añadir el sufijo -jvm para Maven)- Añade este módulo como dependencia para seguir usando
withConstantNow
- Añade este módulo como dependencia para seguir usando
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
matchExactlypara Maps #3246Correcció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
ANDincorrectamente en lugar deOR) (#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
enabledOrReasonIfenFunSpecanidadosMensaje de error mejorado al pasar lista vacía en
Arb.of(#3195)Error al usar callback
afterEachtras registro de pruebas (#3191)Mejora en mensajes de error para
containExactlycon 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,shouldMatchAnySoporte 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)
shouldContainJsonKeydebe devolver true para claves con valores nulos (#3128)
5.4.1 Julio 2022
Correcciones
- Solución de regresión que causaba
NoSuchMethodErroren 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.bindvincule directamente tipos sellados, enumerados y privados (#3072)Corregir
kotest.propertiespara que se aplique antes de los tests #3087Solucionado que
shouldHaveSameContentAsno 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
shouldMatchAlla Maps donde cada valor es una función que contiene aserciones #3065shouldBeEqualToComparingFieldsahora permite configurar clases que requieren usarshouldBepara igualdad, en lugar deequalsconvencionalAñadidos arbs para
ZoneId,ZonedDateTimeyOffsetDateTime(#3113)Implementación de Arbitrary para
YearMonth(#2928)Hacer que
arb.orNullproporcione 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,maxItemsyuniqueItems#3026(BREAKING) Modificado el contrato del DSL de esquema JSON para requerir propiedades por defecto;
requiredha sido cambiado aoptional, con false como valor predeterminado.
Desaprobación
- Desaprobado el
shouldBeEqualToComparingFieldsexistente en favor de un nuevo matchershouldBeEqualToComparingFieldsque permite configurar el comportamiento mediante la claseFieldsEqualityCheckConfig(#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
AnnotationSpecno 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
withClueyassertSoftlycon 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
forSingley matchersmatchEach,matchInOrderymatchInOrderSubset(2695)Se añadieron matchers
shouldBeJsonObjectyshouldBeJsonArray(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
shouldBeSuccessyshouldBeFailure(2853)Eliminar valores predeterminados inconsistentes de exceptionClass en eventually (2831)
Hacer recursivo
shouldBeEqualToComparingFields(2833)Añadir
blockingTesta las opciones de configuración en FreeSpec 2805 (2807)Añadido contrato EqualsVerifier para
shouldBeEqualTopara mayor personalización (2795)Añadir
containExactlyque 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
ShouldContainExactlypara 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
checkAllde 2 aridades (#2510)Corrige índice incorrecto en forAll4 (#2533)
Corrige variables de entorno vacías en
withEnvironmenten Linux (#2615)Cambia should por
shouldNotenshouldNotBeEqualToComparingFieldsExcept(#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.valuesha sido eliminado. Estaba obsoleto desde 4.3 en favor deArb.sample. Actualiza los arbs personalizados que sobrescriban este método. Los que usan buildersarbitraryrecomendados no se ven afectados. #2277El motor ya no registra configuraciones en consola durante el inicio por defecto. Activa con la propiedad de sistema
kotest.framework.dump.configestablecida a true. #2276TextContextha sido renombrado aTestScope. Este es el tipo receptor usado en lambdas de prueba. Solo afecta si tienes funciones de extensión personalizadas que usanTestContext.Las funciones experimentales de pruebas de datos añadidas en 4.5 se han movido al módulo
kotest-framework-datatesty son estables.equalJsonañade un parámetro para soportar la nueva aserciónshouldEqualSpecifiedJsonCambiado
PostInstantiationExtensionpara ser suspendibleConstructorExtensionahora 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 porkotest.assertions.output.maxen la versión 4.0.Se ha eliminado la configuración obsoleta
isolationen Specs. UtiliceisolationMode.Se ha trasladado
assertionModedeTestCasea 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
shouldReceiveWithinyshouldReceiveNoElementsWithin.
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
withEnvironmentfalla con variables de entorno vacías en Linux #2615Correcció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
Se ha añadido soporte para Javascript IR.
Se ha añadido soporte para pruebas nativas.
Opción de configuración para habilitar depuración de corrutinas
Opción de configuración para habilitar TestCoroutineDispatchers en pruebas.
Pruebas no finalizadas deben generar error #2281
Añadida opción para fallar ejecución si no hay pruebas ejecutadas #2287
Añadido
@RequiresTagpara mejorar capacidad de exclusión de especificaciones #1820Añade interfaz fun a EnabledCondition #2343
En Configuración de Proyecto,
beforeAll/afterAllestán obsoletos; se añadenbeforeProject/afterProject(funciones suspend) #2333projectContextdisponible como valor de extensión en lambdas de prueba para acceso al estado del motor.Añadido módulo independiente para que herramientas puedan lanzar Kotest #2416
Módulo
kotest-framework-datatestpublicado para todos los destinosMarco soporta ahora tiempo de espera para todo el proyecto #2273
Nuevo punto de extensión ProjectExtension añadido.
Permite registrar extensiones mediante anotación
@ApplyExtension#2551Añade logging a ámbitos de prueba #2443
Añadido
DisplayNameFormatterExtensionpunto de extensión #2507Añade opción de configuración para enviar rutas completas de nombres de prueba a JUnit 5 #2525
Se ha añadido soporte para @Nested en AnnotationSpec #2367
Se han añadido propiedades del sistema para filtrar tests y especificaciones #2547
Debe producirse un error cuando los tests contenedores no incluyen un test anidado #2383
Aserciones
Devuelve el valor resultante del bloque de función en
shouldCompleteWithin#2309Se ha añadido
shouldEqualSpecifiedJsonpara comparar estructuras JSON en un subconjunto de claves (especificadas) #2298shouldEqualJsonahora soporta números de alta precisión #2458Se ha añadido
shouldHaveSameStructureAsa los matchers de archivosSe ha añadido
shouldHaveSameStructureAndContentAsa los matchers de archivosLos inspectores ahora son inline y pueden contener funciones suspendidas #2657
String.shouldHaveLengthBetweenahora acepta rangos #2643La aserción
beOneOfahora indica qué valor faltaba #2624Los matchers de cadenas ahora funcionan con cualquier
CharSequence#2278Se ha añadido el matcher
shouldThrowMessage#2376Se 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#2559Se ha actualizado
iterables.shouldContainpara devolver el receptor y permitir encadenamientoSe 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
CompareJsonOptionspara mayor control al comparar JSON #2520Soporte 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#2294Añ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.zipcomo alias deArb.bind#2644Añ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.distinctcon capacidad de terminación #2262Añ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#2532Reducción de casos al usar
Arb.bind#2542Introducció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.pairdebe devolverArb<Pair<K, V>>#2563Se ha añadido soporte para objetivos Linux ARM64 y macOS ARM64 (Silicon). #2449
Deprecaciones
CompareMode/CompareOrderparashouldEqualJsonha quedado obsoleto en favor decompareJsonOptions { }TestStatusha quedado obsoleto yTestResultse ha rediseñado como un ADT. Si realizabas pattern matching enTestResult.status, ahora puedes hacerlo directamente en la instancia del resultado.val namedentro deListenerha 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 deSpecRefExtensionySpecExtension.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
configurationha 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).SpecInstantiationListenerha quedado obsoleto en favor deInstantiationListenereInstantiationErrorListener, que soportan corrutinas en callbacks.SpecInstantiationListeneres un remanente precorrutinas y se eliminará en futuras versiones.El método
listenerspara añadir listeners a Specs ha quedado obsoleto. Al añadir listeners directamente, usafun extensions()en lugar defun listeners().SpecIgnoredListner(nótese el error tipográfico) ha sido renombrado aInactiveSpecListener.
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
IsStableTypeque, al usarse en un tipo, Kotest llamará al métodotoStringde ese tipo para crear el nombre de la prueba. Consulta la documentación actualizada #2248En pruebas basadas en datos, se añadió la interfaz
WithDataTestNameque permite modificar el nombre generado para la prueba. Consulta la documentación actualizada #2248Los métodos de reflexión se cachean para evitar llamadas lentas de reflexión.
Se añadieron versiones experimentales de
eventually,untilycontinuallyque no usankotlin.timeinternamente. Consulta la documentación actualizada #2149Actualizació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ó deio.kotest.core.config.ExperimentalKotestaio.kotest.common.ExperimentalKotest. #1950Para garantizar que
EventuallyListenerse invoque eneventuallycuando se lance una excepción, se cambió el camporesultdeListenerStatede tipoTaT?. Esto permite detectar cuándo falla la función productora eventually en lugar de aparentar que se bloquea. #2190Las 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 defun edgecases(): List<A>afun 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-datatestque soporta correctamente anidamiento en tiempo de ejecución para pruebas basadas en datos. Consulta la documentación actualizada. #2078Se añadió un nuevo comparador para DayOfWeek en el módulo
kotest-assertion-clock. #2124Se añadió un método factory para simplificar la creación de comparadores. #2122
Se añadió un método en
Exhaustivepara crear un nuevoExhaustiveque sea el producto cartesiano de dosExhaustivedados. #2120Se añadió soporte para escribir pruebas dentro de objetos además de clases. #1970
Se añadieron versiones suspend de
shouldCompleteWithin,shouldCompleteBetweenyshouldTimeOut. #2107Se añadió el proyecto kotest-extensions-wiremock para gestionar el ciclo de vida de
WireMockServeren pruebas Kotest. #2108Se añadió el proyecto kotest-extensions-kafka para usar Kafka embebido en tus pruebas.
Actualizada dependencia
klocka la versión 2.0.6 y añadidos objetivos de plataforma parabrowser,nodejs,linuxX64,mingwX64,macosX64,tvos,iosX64,iosArm64eiosArm32enkotest-assertions-klock. #2116Ejecuta eventually una última vez si las iteraciones son una y el retardo es mayor que el intervalo #2105
Mejoras en
eventually:
(1)EventuallyPredicateahora 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 elEventuallyPredicate.
(3) Nueva sobrecarga deeventuallysinEventuallyPredicatepara comportamiento similar auntil.Añadidos comparadores
shouldBeEqualToComparingFieldsyshouldBeEqualToComparingFieldsExceptque verifican igualdad comparando campos en lugar de usarequals. #2197oneyanyañadidos como alternativas aassertSoftly. Son métodos suspendidos que verifican que solo una aserción tuvo éxito (one) o al menos una tuvo éxito (any). #1950Nuevo reportero para generar informes HTML. #2011
Añadido
Exhaustive.cartesian. #2119kotest.tagsahora configurable mediante variables de entorno. #2098Los 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.plusOrMinusque 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 deProjectListener) no detectadas por el framework. #2088Corrige que
EventuallyListenerno sea invocado eneventuallycuando la función productora lanza una excepción. #2190Usa el nombre de clase como prefijo predeterminado para archivos temporales. #2140
Corrección para
SystemExitListenercon framework picocli. #2156Corrige generación de valores aleatorios en
Arb.choose(arb, arb2, ...). #2176Usar 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,beOfTypedel paqueteio.kotest.matchers. Se eliminarán en la versión 4.7. Usar equivalentes deio.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,
DescribeScopese ha convertido enDescribeSpecContainerContext. 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:
BeforeProjectListenerno siempre se detectabaCorrección de error: Al usar
shouldBecon excepciones, solo se comparaba el mensaje #2094Corrección de error: Se soluciona
withEnvironment()para que no distinga mayúsculas/minúsculas en Windows #2099Corrección de error: Se soluciona
IncorrectDereferenceExceptional llamar aserciones en hilos secundarios en Native #2128Corrección de error: Se soluciona el bloqueo de
Arb.bigdecimalcon ciertas combinaciones de valores mínimos/máximos #2135Mejora:
eventuallya veces solo verificaba una vez pese a intervalos programados cortos #2089Mejora: Se actualiza el mensaje de error para el matcher
shouldContainKeyspara incluir claves ausentes #2106Mejora:
haveCauseOfTypemuestra 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
itpara crear tests fuera de bloques describeAñ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#1775Mejoras 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
thispara 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-junit5extensionsahora se llamakotest-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#1736Se 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
Errordeben reportarse a los listeners del motorCorrecció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#1654Mejora: Arb y Exhaustive deben ser covariantes #1653
Mejora: Eliminada prueba extra
executionErrormolesta en Gradle #1655Mejora: 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
rangeenIntShrinkeryLongShrinker#1535 sksamuelFunció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únmenteExceptionInInitializerError) 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-junit5pasa a serio.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-corey 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-propertyy 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 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 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: 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 #559Novedad: BehaviorSpec permite anidamiento adicional con
Andentre palabras clave #562 #593Correcció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
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:
shouldNotBePositiveyshouldNotBeNegativepara matchers de Double #435Caracterí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:
shouldNotBeTrueyshouldNotBeFalsepara matchers booleanos #452Mejora: Documentación para
Gen.int()#419Mejora: 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
shouldNotBeExactlypara Double tenía una implementación incorrecta #432Corrección: Pruebas de un solo hilo ejecutaban
beforeyafteren hilo diferente al de la prueba #447Corrección: Pruebas con invocaciones > 1 no finalizaban si fallaban #413
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 comparadoressortedWith(#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
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ó
forNonepara 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ó
shouldNotpara 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 withorandandand can be negated withshouldNot.Se añadió matcher
betweenpara int y long, ej:
3 shouldBe between(2, 5)
- Se añadió matcher
singleElementpara colecciones, ej:
x shouldBe singleElement(y)
- Se añadió matcher
sortedpara 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
configy porque es esencialmente igual que StringSpec pero más complejo.Sobrecargas de métodos deprecados con
duration: Long, unit: TimeUnitexpectingpara 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 doubleskotlintestahora solo incluyemockito-coreen lugar demockito-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
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
Closeablepueden 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)
haveKeyMap<K,V> matcher. You can now write
val map = mapOf(Pair(1, "a"), Pair(2, "b"))
map should haveKey(1)
haveValueMap<K,V> matcher. You can now write
val map = mapOf(Pair(1, "a"), Pair(2, "b"))
map should haveValue("a")
containMap<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 parax should be theSameInstanceAs(y), permitiendox 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
Las pruebas ignoradas ahora se muestran correctamente. https://github.com/kotlintest/kotlintest/issues/43
Pruebas fallidas que se reportaban como éxito Y fallo https://github.com/kotlintest/kotlintest/issues/42