Kotest 4.2.0 新特性全面解析

Kotest 4.2.0 新特性全面解析

kotest Powerful, elegant and flexible test framework for Kotlin with additional assertions, property testing and data driven testing kotest 项目地址: https://gitcode.com/gh_mirrors/ko/kotest

Kotest 是一个功能强大的 Kotlin 测试框架,它提供了丰富的测试功能和灵活的配置选项。最新发布的 4.2.0 版本带来了许多令人兴奋的新特性和改进。本文将详细介绍这些变化,帮助开发者更好地理解和使用 Kotest。

模块结构调整

在 4.2.0 版本中,Kotest 对模块结构进行了优化调整:

  1. 移除了 kotest-runner-console 依赖项,IntelliJ 插件不再需要它
  2. kotest-core 重命名为 kotest-framework-engine

对于不同平台的使用者:

  • JVM 测试:继续使用 kotest-runner-junit5-jvm 依赖项
  • JS 测试:在 commonMain 源集中添加 kotest-framework-engine,或在 jsMain 源集中添加 kotest-framework-engine-js

多平台支持增强

Kotest 4.2.0 扩展了对多平台的支持,现在断言库已发布支持以下平台:

  • linuxX64
  • mingwX64
  • macosX64
  • tvosX64
  • tvosArm64
  • watchosX86
  • watchosArm64
  • iosX64
  • iosArm64
  • iosArm32

新增 Kotlinx 日期时间匹配器

Kotest 4.2.0 引入了对 Kotlinx Datetime 库的支持,提供了专门的断言模块 kotest-assertions-kotlinx-time。由于 Kotlinx Datetime 目前处于孵化阶段,这个断言模块未来可能会根据 API 变化进行必要的调整。

使用示例:

val date = LocalDateTime(2019, 2, 15, 12, 10, 0, 0)
date.shouldHaveHour(12)  // 断言日期时间的小时部分是否为12

该模块支持 JVM、JS、Linux、Mac 和 Windows 平台。

多项目配置支持

在之前的版本中,Kotest 只支持单个 AbstractProjectConfig 配置。4.2.0 版本现在支持多个项目配置,所有配置都会被检测并合并。这在多模块项目中特别有用:

  • 可以在根模块中定义共享配置
  • 在各个子模块中定义更细粒度的配置

注意:如果多个配置中存在冲突设置,Kotest 会任意选择一个值,因此不建议在不同配置中添加相互冲突的设置。

扩展的回调函数

Kotest 4.2.0 引入了更细粒度的测试回调函数:

  • beforeEach/afterEach:仅在叶子测试作用域(实际测试用例)执行前后调用
  • beforeContainer/afterContainer:仅在分支测试作用域(测试容器)执行前后调用

这些回调函数特别适用于支持嵌套测试作用域的测试风格(如 DescribeSpec)。

示例:

class CallbacksTest : DescribeSpec({
   beforeEach { println("Test: " + it.displayName) }
   beforeContainer { println("Container: " + it.displayName) }
   beforeTest { println("All: " + it.displayName) }
   
   describe("容器作用域") {
      it("测试作用域") { }
   }
})

测试规范排序

Kotest 4.2.0 新增了基于注解的测试规范排序功能。通过 @Order(int) 注解,可以指定测试规范的执行顺序:

  • 数值较小的规范先执行
  • 未注解的规范最后执行
  • 相同数值的规范执行顺序不确定

标签表达式增强

测试和规范可以通过 Tag 对象进行标记,并在运行时控制哪些测试执行。4.2.0 版本增强了标签功能,支持完整的布尔表达式:

gradle test -Dkotest.tags="Linux & !Database"

表达式可以嵌套使用括号,支持任意复杂的逻辑。原有的 kotest.tags.includekotest.tags.exclude 系统属性仍然可用,但新功能提供了更强大的控制能力。

规范级别的超时设置

现在可以在规范级别为所有测试设置默认超时:

class TimeoutTest : DescribeSpec({
   timeout = 1000  // 所有测试默认超时1000毫秒
   
   describe("测试") {
      it("用例1") { }  // 使用默认超时
      it("用例2").config(timeout = 500.milliseconds) { }  // 覆盖默认设置
   }
})

详尽属性测试增强

当使用 exhaustive 生成器进行属性测试时,forAllcheckAll 方法现在会确保:

  • 迭代次数等于详尽组合的总数
  • 所有组合都会被测试

例如:

checkAll(
   Exhaustive.ints(0..5),
   Exhaustive.ints(0..5),
   Exhaustive.ints(0..5)
) { ... }

这将测试 6×6×6=216 种组合,从 (0,0,0) 到 (5,5,5) 的所有可能组合。

类型匹配器的泛型契约

shouldBeInstanceOf<T>shouldBeTypeOf<T> 断言现在支持泛型契约,可以在断言成功后智能转换类型:

val list: Any = arrayListOf(1, 2, 3)
list.shouldBeTypeOf<ArrayList<Int>>()
list[0] shouldBe 1  // 智能转换后可以直接访问元素

JUnit XML 报告改进

Kotest 4.2.0 提供了自定义的 JUnit XML 报告实现,解决了嵌套测试的报告问题。可以通过项目配置启用:

class ProjectConfig : AbstractProjectConfig() {
   override fun listeners() = listOf(
      JunitXmlReporter(
         includeContainers = true,  // 包含所有测试状态
         useTestPathAsName = true    // 使用完整测试路径作为名称
      )
   )
}

其他改进

  • IntelliJ 插件更新:不再需要额外依赖,支持新的回调函数,支持在 AnnotationSpec 中运行单个测试
  • Spring 支持:当在 final 类上使用 SpringListener 时会发出警告
  • 完全兼容 Kotlin 1.4

Kotest 4.2.0 的这些新特性和改进进一步增强了测试的灵活性和表达能力,为 Kotlin 开发者提供了更强大的测试工具。

kotest Powerful, elegant and flexible test framework for Kotlin with additional assertions, property testing and data driven testing kotest 项目地址: https://gitcode.com/gh_mirrors/ko/kotest

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

裴锟轩Denise

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值