ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Hammox迁移清单:Mox用户如何3步无痛升级到自动化契约测试

Hammox迁移清单:Mox用户如何3步无痛升级到自动化契约测试 Hammox迁移清单Mox用户如何3步无痛升级到自动化契约测试【免费下载链接】hammox automated contract testing via type checking for Elixir functions and mocks项目地址: https://gitcode.com/gh_mirrors/ha/hammoxHammox 是一个面向 Elixir 函数的自动化契约测试库它在 Mox 的基础上更进一步不仅帮你创建 mock还会基于 behaviour 的 typespec自动校验mock 和真实实现是否守约。如果你正在使用 Mox本文将给你一份 3 步迁移清单让你无痛升级到 Hammox让契约 bug 在测试阶段就暴露出来。为什么需要 HammoxMock 也会背叛契约很多 Elixir 开发者都知道单元测试里用 mock 替代真实依赖是好习惯。但 Mox 有一个盲区它不检查 typespec。举个例子你的Databasebehaviour 约定返回{:ok, [binary()]}某天重构后实现改了但 mock 还在返回裸列表[joe, jim]——测试依然全绿上线却会炸 。换成 Hammox 后同样的测试会立刻报出清晰的错误** (Hammox.TypeMatchError) Returned value [joe, jim] does not match type {:ok, [binary()]} | {:error, term()}.错误信息由 lib/hammox/type_match_error.ex 生成参数、返回值、元组元素、map 键值……每个不匹配点都会用人类可读的话说明方便快速定位。类型匹配引擎的实现在 lib/hammox/type_engine.ex。 一句话总结Mox 管mock 怎么调Hammox 额外管mock 和实现是否遵守同一份契约。3步迁移清单从 Mox 到 Hammox 完整升级步骤第 1 步一行替换依赖——最快 mix.exs 配置方法在 mix.exs 中删掉:mox加入:hammoxdef deps do [ {:hammox, ~ 0.7, only: :test} ] end注意Hammox 本身就依赖 Mox见项目 mix.exs 的deps/0所以两者可以共存不需要担心兼容问题。第 2 步全局把 Mox 替换为 Hammox零成本开启类型检查这一步是无痛的关键——只需全局查找替换Mox为Hammox无需任何其他改动。原 Mox 用法替换后变化import Moximport Hammox直接替换defmock(Foo, for: Bar)defmock(Foo, for: Bar)API 完全相同expect(mock, :fn, fn ...)同左自动附加 typespec 检查 ✅stub / verify! / allow同左API 完全相同所有兼容函数都在 lib/hammox.ex 中定义defmock/2、set_mox_from_context/1等直接委托给 Mox而expect/4、stub/3会在原函数外包一层 typespec 校验对应源码中的wrap/3。替换完成后运行一次mix test——如果你的 mock 早就违反了契约现在就能被逮住 。第 3 步用 Hammox.protect 给真实实现也加上契约保护第 2 步只保护了 mock。Hammox 的真正目标是让behaviour、mock、实现三者始终保持同步所以推荐给真实实现也加上检查。Hammox.protect/2会返回一个受保护的匿名函数调用时自动校验参数和返回值setup_all do %{get_users_0: Hammox.protect({RealDatabase, :get_users, 0}, Database)} end直接传入实现模块 behaviour 模块还能一次性保护所有回调返回的 map 天然适合放进setup_all。完整的多种用法批量保护、多 behaviour、快捷方式都在 lib/hammox.ex 的protect/2文档注释中。如果嫌显式写法啰嗦还可以用宏一步到位——在测试模块里use Hammox.Protect, module: RealDatabase, behaviour: Database就像import一样直接调用受保护函数实现见 lib/hammox/protect.ex。Hammox 升级后常见问题Dialyzer、协议类型与性能Q1我已经有 Dialyzer 了还需要 Hammox 吗需要。Dialyzer 是静态分析工具无法发现 Mox 风格 mock 违反 typespec 的问题Hammox 是运行时契约测试二者互补各有能抓住对方漏掉的 bug。Q2Protocol 类型是怎么检查的协议中定义的t()类型如Enumerable.t()会被理解为实现了该协议的 struct。传入:atom会得到明确报错Value :atom does not implement the Enumerable protocol.Q3某个 mock 想关掉契约检查怎么办直接把那个 mock 改回原版 Mox 即可——Hammox 依赖 Mox两者可以无摩擦混用适合渐进式迁移。Q4有什么已知限制typespec 中匿名函数类型目前只检查 arity不检查参数和返回类型。Q5测试套件很大Hammox 影响速度怎么办Hammox 内置了 Telemetry 事件[:hammox, :expect]、[:hammox, :check_call]等在配置中开启enable_telemetry?: true即可诊断性能瓶颈事件清单见 guides/Telemetry.md。迁移完成度核对清单提交 PR 前对照这份清单逐项打勾mix.exs 中已移除:mox加入{:hammox, ~ 0.7, only: :test}全局替换完成无残留的import Mox/Mox.调用mix test全绿若变红正是契约 bug 被捕获按TypeMatchError提示修复核心 behaviour 的callback均带有完整 typespec这是自动检查的依据关键真实实现已通过Hammox.protect/2加入setup_all推荐如需排查性能已按 guides/Telemetry.md 开启遥测总结3 步换来契约永不同步的免疫能力回顾一下这次无痛迁移的 3 步换依赖mix.exs中一行:mox→:hammox换名字全局Mox→Hammoxmock 立即获得 typespec 自动检查加保护用Hammox.protect把真实实现也纳入契约校验补全behaviour—mock—实现三角。整个过程几乎不改变你的测试写法却能让 mock 与实现之间的契约漂移在测试阶段就被拦截。想深入了解实现细节可以从 lib/hammox.ex、lib/hammox/protect.ex 和测试用例 test/hammox_test.exs 入手如需拉取完整源码研究仓库地址为 https://gitcode.com/gh_mirrors/ha/hammox 。现在就可以动手给项目的 Elixir mock 测试加上契约护栏吧 【免费下载链接】hammox automated contract testing via type checking for Elixir functions and mocks项目地址: https://gitcode.com/gh_mirrors/ha/hammox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表