
Atrium双API风格对比fluent与infix怎么选Kotlin断言库团队最佳实践完整指南【免费下载链接】atriumA multiplatform expectation library for Kotlin项目地址: https://gitcode.com/gh_mirrors/atr/atriumAtrium 是一个开源的Kotlin 多平台断言/期望库Expectation Library支持 JVM、JS 和 Android并且同时提供fluent与infix 两种 API 风格。对于刚接触它的团队最容易困惑的问题就是这两个风格到底有什么区别我该给项目选哪一个本文用一份选型清单 差异对照表的方式帮你快速做出决定 一、先认识 Atrium一个库两种写法Atrium 的核心用法是通过expect(被测对象)发起一条期望然后声明断言。同一个断言在两种风格下长这样// fluent 风格链式方法调用 expect(x).toEqual(2) // infix 风格中缀表达读起来像句子 expect(x) toEqual 2可以看到两者的功能完全等价区别只在语法糖层面fluentexpect(x).toContain(hello)传统的链式调用和你熟悉的 Java 断言库写法几乎一致infixexpect(x) toContain hello利用 Kotlin 的infix关键字让断言读起来更像自然语言。两者都由同一套底层逻辑atrium-logicatrium-core模块驱动报错信息、期望分组、软断言等高级能力两边完全一致所以切换风格不会损失任何功能。 两种风格的差异对照官方文档整理在 apis/differences.md 中是选型时的权威参考资料。二、5个关键差异点fluent 与 infix 对照表下面是两种风格在实际命名上的典型差异摘自apis/differences.md场景fluent 风格infix 风格判空集合/字符串expect(x).toBeEmpty()expect(x) toBe empty链式断言连接.toBeGreaterThan(1).and.toBeLessThan(10)toBeGreaterThan 1 and o toBeLessThan 10字符串精确包含toContain.exactly(1).values(a, b)toContain o exactly 1 the values(a, b)集合无序包含toContain.inAnyOrder.only.values(a, b)toContain o inAny order but only the values(a, b)Map 取值断言getExisting(a).toBeLessThan(1)getExisting a toBeLessThan 1按索引取列表元素get(0).toBeLessThan(1)get 0 toBeLessThan 1 你会发现两个值得注意的细节infix 风格会多出一个o占位符因为它要把无参扩展方法改写成带一个参数的中缀方法o就是为此存在的填充对象filler object对无参场景的调用者是透明的复杂构建器在 infix 下会更长例如至多包含 2 个正则匹配这种多级构建fluent 写toContain.atMost(2).regex(...)很紧凑infix 则要写toContain o atMost 2 regex ...。一句话总结简单断言两者都很优雅复杂断言 fluent 更紧凑infix 更有读句子的仪式感✍️三、fluent 与 infix 怎么选一张决策清单你的情况推荐选择理由团队成员来自 Java / AssertJ 背景✅ fluent链式写法零学习成本团队偏爱 Kotest / Hamkrest 风格✅ infix中缀断言更符合 Kotlin 社区习惯测试代码量大、追求少写字符✅ fluent复杂构建器下更短、括号即参数边界断言以简单判断为主toEqual、toContain✅ 均可两者体验几乎无差多人协作、希望强制统一风格✅ 选一个并写进规范两种风格可以混用但不建议混 官方给出的最佳实践是通过 bundle 模块来物理隔离风格。atrium-fluent只包含纯 fluent APIatrium-infix只包含纯 infix API——依赖哪个 bundleIDE 里就只能看到哪种风格的函数从源头上杜绝团队内风格漂移。四、一键安装步骤引入 bundle 模块Atrium 的 bundle 模块把API 逻辑 核心 翻译 预定义动词打包好你只需一条依赖发布在 Maven Central最低要求 Kotlin 1.4 / JVM 11// fluent 风格 testImplementation(ch.tutteli.atrium:atrium-fluent:1.2.0) // 或infix 风格 testImplementation(ch.tutteli.atrium:atrium-infix:1.2.0)对应源码位置fluent bundlebundles/fluent/atrium-fluent/infix bundlebundles/infix/atrium-infix/fluent API 函数定义apis/fluent/atrium-api-fluent/src/commonMain/kotlin/ch/tutteli/atrium/api/fluent/infix API 函数定义apis/infix/atrium-api-infix/src/commonMain/kotlin/ch/tutteli/atrium/api/infix/⚠️ 如果确实需要两种风格并存官方允许混用可以在项目里同时依赖atrium-fluentatrium-api-infix但建议只用于渐进式迁移期。五、新手快速上手5 行代码跑通第一个断言以 fluent 风格为例完整体验见bundles/fluent/atrium-fluent/src/commonTest/kotlin/SmokeTest.ktimport ch.tutteli.atrium.api.fluent.en_GB.* import ch.tutteli.atrium.api.verbs.expect fun smokeTest() { expect(1).toEqual(1) // 相等 expect(hello) { messageToContain(he) } // 异常消息包含 expect { throw IllegalArgumentException() }.toThrowIllegalArgumentException() }infix 版本则对应bundles/infix/atrium-infix/src/commonTest/kotlin/SmokeTest.kt写法是expect(1) toEqual 1。更多示例可直接看官方 samples 目录fluent 示例集apis/fluent/atrium-api-fluent/src/commonTest/kotlin/ch/tutteli/atrium/api/fluent/en_GB/samples/infix 示例集apis/infix/atrium-api-infix/src/commonTest/kotlin/ch/tutteli/atrium/api/infix/en_GB/samples/每个断言类别集合、Map、特征提取、浮点容差……都有一对同名示例文件方便你左右对照同一功能在两种风格下的写法是学习时最好的活文档 六、总结选型三句话功能上完全等价——报错质量、期望分组、扩展自定义断言等能力两种风格共享同一套核心fluent 胜在紧凑与 Java 互认infix 胜在 Kotlin 化的自然语言可读性用 bundle 模块锁定团队风格依赖哪个 bundle 就只暴露哪套 API这是官方推荐、也是长期协作成本最低的做法。现在打开apis/differences.md对照团队口味选一个风格把 bundle 依赖加进 build 文件——你的 Kotlin 多平台项目就能用上 Atrium 的高质量断言了 ✅【免费下载链接】atriumA multiplatform expectation library for Kotlin项目地址: https://gitcode.com/gh_mirrors/atr/atrium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考