关于 exunit-code-review
面向 Elixir 团队的 ExUnit 测试代码审查指南,说明测试结构、外部边界模拟、测试适配器和数据库隔离。它还设定基于文件行号和验证步骤的审查门槛。
主要功能
- 01检查异步测试与测试组织
- 02仅在外部边界使用 Mox 模拟
- 03核对 Bypass、Swoosh 与 Oban 测试适配器
- 04检查 Ecto sandbox 数据库隔离
- 05按步骤验证审查发现并标注行号
适用场景
- 01审查 ExUnit 测试模块
- 02判断外部依赖是否需要模拟
- 03检查异步测试与数据库共享状态
- 04提交带文件和行号证据的审查发现
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ existential-birds/ beagle --skill exunit-code-review安装后在 Claude Code 中输入/exunit-code-review确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/exunit-patterns.mdintegration-tests.mdmox-boundaries.mdtest-adapters.md详细介绍
ExUnit 代码审查
快速参考
| 问题类型 | 参考资料 |
|---|---|
| 异步测试、setup、describe、标签 | references/exunit-patterns.md |
| 基于行为的模拟、预期 | references/mox-boundaries.md |
| Bypass、Swoosh、Oban 测试 | references/test-adapters.md |
| 模拟什么与使用真实对象、Ecto sandbox | references/integration-tests.md |
模拟边界原则
在外部边界进行模拟:
- HTTP 客户端、外部 API、第三方服务
- 缓慢的资源:文件系统、电子邮件、作业队列
- 非确定性对象:DateTime.utc_now()、:rand
不要模拟内部代码:
- Context、schema、GenServer
- 内部模块、PubSub
- 你编写的任何内容
审查清单
测试结构
- 除非需要共享数据库状态,否则测试均为
async: true - 使用 describe 块对相关测试进行分组
- 使用 setup 提取通用测试数据
- 测试具有清晰的准备/执行/断言结构
模拟
- 使用 Mox 模拟外部边界(HTTP、API)
- 为可模拟的接口定义行为
- 不模拟内部模块
- 在 setup 中使用 verify_on_exit! 执行严格模拟
测试适配器
- 使用 Bypass 模拟 HTTP 端点
- 使用 Swoosh.TestAdapter 测试电子邮件
- 使用 Oban.Testing 断言后台作业
数据库
- 使用 Ecto.Adapters.SQL.Sandbox 实现隔离
- 异步测试不共享数据库状态
- 一致地使用 fixtures/factories
有效模式(不要标记)
- 单元测试中使用模拟,集成测试中使用真实对象 — 不同测试级别有不同需求
- 集成测试中不模拟数据库 — 数据库属于内部组件
- 简单的内联测试数据 — 并非所有内容都需要工厂
- 通过公共 API 测试私有函数 — 正确做法
上下文相关规则
| 问题 | 仅在以下情况下标记 |
|---|---|
| 未启用异步 | 测试确实需要共享状态 |
| 缺少模拟 | 存在外部调用,且没有模拟/Bypass |
| 模拟内部模块 | 被模拟的模块属于内部代码 |
检查关卡(按顺序)
按顺序完成。对于某个问题,在前一步通过之前不要给出审查发现。
-
文件中的证据 — 打开测试模块(或辅助文件),并将判断关联到具体行。
- 通过条件: 每条潜在的审查发现都包含
[FILE:LINE],并且对该行(或明确指出的相邻行)上的内容作出一句事实描述,而不是泛泛地批评风格。
- 通过条件: 每条潜在的审查发现都包含
-
ExUnit 误报否决 — 根据具体情况检查本技能的有效模式和上下文相关规则。
- 通过条件: 你能用一句话说明“此情况不属于‘不要标记’/‘仅在以下情况下标记’”,否则就放弃该审查发现。
-
跨协议验证 — 对同一条审查发现应用 review-verification-protocol(例如,阅读完整函数/代码块,在声称“未使用”之前搜索其用法)。
- 通过条件: 至少满足一项与该判断类型相关的协议检查;若有人质疑,该检查应能出现在你的理由中。
提交审查发现前
只有在通过**检查关卡(按顺序)**并满足所链接协议的要求后,才按每条审查发现使用 [FILE:LINE] ISSUE_TITLE 格式。
评论
支持 Markdown