mcpField
T
testing

testing

github.com/oliver-kriska测试与质量57152 次安装1 周前更新
代码仓库

关于 testing

testing 是面向 Elixir 项目的测试速查技能,涵盖测试用例选择、异步行为、数据库隔离、Mock 和工厂模式。它提供 ExUnit、Mox 与 LiveView 测试的实用规则和模式。

主要功能

  1. 01按测试类型选择测试用例
  2. 02遵循异步与 Sandbox 指引
  3. 03明确 Mock 的使用边界
  4. 04恰当选择 build 或 insert
  5. 05参考 ExUnit、Mox 和 LiveView 模式

适用场景

  1. 01为控制器或上下文设置测试
  2. 02测试 LiveView 行为
  3. 03不用 sleep 处理异步消息
  4. 04判断工厂是否需要持久化记录

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/oliver-kriska/claude-elixir-phoenix --skill testing

安装后在 Claude Code 中输入/testing确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
exunit-patterns.md
factory-patterns.md
liveview-testing.md
mox-patterns.md

详细介绍

Elixir 测试参考

Ash 项目:使用 DataCase 和 Ash.Test 辅助工具;通过域代码接口测试操作,而不是直接调用 Repo。请参阅 ash-framework 技能。

Elixir 测试模式速查。

铁律——绝不可违反

  1. 默认启用异步——除非测试会修改全局状态,否则使用 async: true
  2. Sandbox 隔离——所有数据库测试都使用 Ecto.Adapters.SQL.Sandbox
  3. 只在边界处模拟——绝不模拟数据库、内部模块或标准库
  4. 行为作为契约——所有模拟都必须实现已定义的 @callback 行为
  5. 默认构建——在工厂中使用 build/2;只有需要数据库时才使用 insert/2
  6. 禁止 PROCESS.SLEEP——异步操作使用带超时的 assert_receive
  7. VERIFY_ON_EXIT!——在 Mox 测试设置中始终调用
  8. 工厂匹配架构必填字段——工厂定义必须包含架构变更集中所有 validate_required 字段。缺少字段会导致一连串测试失败

快速决策

使用哪种测试用例?
测试内容使用
控制器/APIuse MyAppWeb.ConnCase
上下文/架构use MyApp.DataCase
LiveViewuse MyAppWeb.ConnCase + import Phoenix.LiveViewTest
纯逻辑use ExUnit.Case, async: true
何时使用 async: true?
  • ✅ 纯函数,无共享状态
  • ✅ 使用 Sandbox 的数据库测试(PostgreSQL)
  • ❌ 修改 Application.put_env 的测试
  • ❌ 使用 Mox 全局模式的测试
是否要模拟?
  • ✅ 模拟:外部 API、邮件服务、文件存储
  • ❌ 不要模拟:数据库、内部模块、标准库
使用 build() 还是 insert()?
  • 默认使用 build() 以提升速度
  • 只有需要数据库 ID、约束或持久化关联时才使用 insert()

快速模式

# Setup chain
setup [:create_user, :authenticate]

# Pattern matching assertion
assert {:ok, %User{name: name}} = create_user(attrs)

# Async message assertion
assert_receive {:user_created, _}, 5000

# Mox setup
setup :verify_on_exit!
expect(MockAPI, :call, fn _ -> {:ok, "data"} end)

# LiveView async
html = render_async(view)  # MUST call for assign_async

常见反模式

错误正确
Process.sleep(100)assert_receive {:done, _}, 5000
在工厂中使用 insert(:user)在工厂中使用 build(:user)
使用 set_mox_global() 时设置 async: trueasync: false
模拟内部模块通过公共 API 测试

参考资料

如需了解详细模式,请参阅:

  • ${CLAUDE_SKILL_DIR}/references/exunit-patterns.md - 设置、断言、标签
  • ${CLAUDE_SKILL_DIR}/references/mox-patterns.md - 行为、expect/stub、异步
  • ${CLAUDE_SKILL_DIR}/references/liveview-testing.md - 表单、异步、上传
  • ${CLAUDE_SKILL_DIR}/references/factory-patterns.md - ExMachina、序列、特征

评论

支持 Markdown