Kotest 4.2.0 新特性全面解析
Kotest 是一个功能强大的 Kotlin 测试框架,它提供了丰富的测试功能和灵活的配置选项。最新发布的 4.2.0 版本带来了许多令人兴奋的新特性和改进。本文将详细介绍这些变化,帮助开发者更好地理解和使用 Kotest。
模块结构调整
在 4.2.0 版本中,Kotest 对模块结构进行了优化调整:
- 移除了
kotest-runner-console
依赖项,IntelliJ 插件不再需要它 - 将
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.include
和 kotest.tags.exclude
系统属性仍然可用,但新功能提供了更强大的控制能力。
规范级别的超时设置
现在可以在规范级别为所有测试设置默认超时:
class TimeoutTest : DescribeSpec({
timeout = 1000 // 所有测试默认超时1000毫秒
describe("测试") {
it("用例1") { } // 使用默认超时
it("用例2").config(timeout = 500.milliseconds) { } // 覆盖默认设置
}
})
详尽属性测试增强
当使用 exhaustive
生成器进行属性测试时,forAll
和 checkAll
方法现在会确保:
- 迭代次数等于详尽组合的总数
- 所有组合都会被测试
例如:
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 开发者提供了更强大的测试工具。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考