Kotest 4.2.0 新特性全面解析:测试框架的重大升级
kotest 项目地址: https://gitcode.com/gh_mirrors/kot/kotlintest
作为 Kotlin 生态中最受欢迎的测试框架之一,Kotest 在 4.2.0 版本中带来了多项重要改进和功能增强。本文将深入解析这些新特性,帮助开发者更好地理解和使用这个强大的测试工具。
模块结构调整
在 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 显著扩展了对 Kotlin 多平台的支持,现在断言库已支持以下平台:
- iOS 平台:iosX64, iosArm64, iosArm32
- tvOS 平台:tvosX64, tvosArm64
- watchOS 平台:watchosX86, watchosArm64
- 桌面平台:linuxX64, mingwX64, macosX64
这使得 Kotest 成为跨平台 Kotlin 开发的更全面测试解决方案。
Kotlinx DateTime 断言支持
新增了 kotest-assertions-kotlinx-time
模块,专门为 Kotlinx DateTime 库提供丰富的断言支持。由于 DateTime 库仍处于孵化阶段,这些断言未来可能会有破坏性变更。
使用示例:
val date = LocalDateTime(2019, 2, 15, 12, 10, 0, 0)
date.shouldHaveHour(12) // 验证小时是否为12
该模块支持的主要功能包括:
- 日期时间比较断言
- 日期组件验证(年、月、日等)
- 时间间隔计算验证
- 时区相关断言
测试配置增强
多项目配置支持
现在可以创建多个继承自 AbstractProjectConfig
的配置类,所有配置都会被检测并合并。这在多模块项目中特别有用:
- 在根模块中定义共享配置
- 在各子模块中定义特定配置
- 配置冲突时会自动选择一个值(建议避免冲突配置)
扩展的回调函数
新增了更细粒度的测试生命周期回调:
beforeEach
/afterEach
:仅在叶子测试节点(实际测试用例)执行beforeContainer
/afterContainer
:仅在容器节点(测试分组)执行- 原有的
beforeTest
/afterTest
仍会在所有测试节点执行
示例:
class CallbacksTest : DescribeSpec({
beforeEach { println("Test: " + it.displayName) }
beforeContainer { println("Container: " + it.displayName) }
beforeTest { println("All: " + it.displayName) }
describe("容器作用域") {
it("测试用例") { }
}
})
测试执行控制增强
基于注解的测试类排序
新增了 @Order
注解来控制测试类的执行顺序:
- 使用
@Order(数字)
注解标记测试类 - 数字值越小越先执行
- 未注解的测试类最后执行
- 相同顺序的测试类执行顺序不确定
标签表达式
标签系统现在支持复杂的布尔表达式:
gradle test -Dkotest.tags="Linux & !Database"
支持的功能包括:
- 逻辑运算符:& (AND), | (OR), ! (NOT)
- 括号分组
- 任意复杂度的表达式
- 向后兼容旧的 include/exclude 方式
超时控制增强
现在可以在测试类级别设置全局超时,并可在测试用例级别覆盖:
class TimeoutTest : DescribeSpec({
timeout = 1000 // 所有测试默认1秒超时
describe("测试组") {
it("使用类级别超时") { }
it("自定义超时").config(timeout = 500.milliseconds) { }
}
})
属性测试改进
当使用穷举生成器(Exhaustive generators)时,forAll
/checkAll
现在会:
- 确保迭代次数等于穷举组合数
- 执行所有可能的组合
- 保证组合的完整性
示例:
checkAll(
Exhaustive.ints(0..5),
Exhaustive.ints(0..5),
Exhaustive.ints(0..5)
) { a, b, c -> ... }
将执行 216 次(6×6×6),覆盖所有 (0-5, 0-5, 0-5) 的组合。
类型断言增强
shouldBeInstanceOf<T>
和 shouldBeTypeOf<T>
现在支持泛型合约,可以智能转换泛型实例:
val list: Any = arrayListOf(1, 2, 3)
list.shouldBeTypeOf<ArrayList<Int>>()
list[0] shouldBe 1 // 智能转换后可直接访问
JUnit XML 报告改进
Kotest 现在提供了自定义的 JUnit XML 报告生成器,解决了嵌套测试在传统 JUnit XML 中的表示问题:
class ProjectConfig : AbstractProjectConfig() {
override fun listeners() = listOf(
JunitXmlReporter(
includeContainers = true, // 包含所有测试状态
useTestPathAsName = true // 使用完整测试路径
)
)
}
其他重要改进
-
IntelliJ 插件更新:
- 无需额外依赖
- 支持新回调函数的可视化
- 增强对 Android Studio 的支持
-
Spring 集成警告:
- 当在 final 类上使用 SpringListener 时会发出警告
- 可通过系统属性
kotest.listener.spring.ignore.warning
禁用
Kotest 4.2.0 通过上述改进,进一步巩固了其在 Kotlin 测试生态中的领先地位,为开发者提供了更强大、更灵活的测试工具。无论是基础断言、测试组织还是多平台支持,这个版本都带来了显著的提升。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考