name: Rails测试 description: Ruby on Rails 测试最佳实践,用于使用 RSpec 编写有效、可维护的测试套件。该技能应在编写、审查或重构 Rails 测试时使用,以确保正确的测试设计、数据管理和覆盖模式。触发涉及 RSpec 规范、模型测试、请求测试、系统测试、工厂定义、Capybara 交互、Sidekiq 作业测试或测试套件优化的任务。与 rails-dev、ruby-optimise 和 ruby-refactor 技能互补。
社区 Ruby on Rails 测试最佳实践
Ruby on Rails 应用程序的全面测试指南,由社区维护。包含 8 个类别的 46 条规则,按影响优先级排序,以指导自动化测试生成、审查和重构。
何时应用
参考这些指南当:
- 为模型、请求、系统测试或作业编写新的 RSpec 规范
- 使用特征和序列设置 FactoryBot 工厂
- 编写 Capybara 系统测试以模拟用户旅程
- 使用 Sidekiq 或 Active Job 测试后台作业
- 审查测试代码以识别反模式(神秘嘉宾、不稳定测试、慢速规范)
- 优化测试套件性能和 CI 管道速度
- 组织测试文件、共享示例和自定义匹配器
规则类别按优先级
| 优先级 | 类别 | 影响 | 前缀 |
|---|---|---|---|
| 1 | 测试设计与结构 | 关键 | design- |
| 2 | 测试数据管理 | 关键 | data- |
| 3 | 模型测试 | 高 | model- |
| 4 | 请求与控制器测试 | 高 | request- |
| 5 | 系统与验收测试 | 中高 | system- |
| 6 | 异步与后台作业测试 | 中 | async- |
| 7 | 测试性能与可靠性 | 中 | perf- |
| 8 | 测试组织与维护 | 低中 | org- |
快速参考
1. 测试设计与结构(关键)
design-four-phase-test- 使用四阶段测试结构(设置、执行、验证、清理)design-behavior-over-implementation- 测试可观察行为,而非内部实现design-one-assertion-per-test- 每个测试一个逻辑期望,用于精确故障诊断design-descriptive-test-names- 编写像规范一样的测试名称design-avoid-mystery-guest- 使所有测试数据在测试本身内可见design-avoid-conditional-logic- 测试代码中不使用 if/else 或循环design-explicit-subject- 明确命名主题,而不是使用隐式主题
2. 测试数据管理(关键)
data-factory-traits- 使用可组合的工厂特征,而不是单独的工厂data-minimal-attributes- 仅指定与测试相关的属性data-build-over-create- 当不需要持久化时,优先使用 build/build_stubbed 而不是 createdata-avoid-fixture-coupling- 使用工厂而不是共享夹具data-transient-attributes- 使用临时属性进行复杂工厂设置data-sequence-unique-values- 对唯一性约束字段使用序列
3. 模型测试(高)
model-test-validations- 测试验证,包括边界情况,而不仅仅是正常路径model-test-associations- 明确测试关联,包括依赖行为model-test-scopes- 测试作用域,包括匹配和非匹配记录model-test-callbacks-sparingly- 测试回调的副作用,而不是回调的存在model-test-custom-methods- 测试公共方法,跨场景使用输入/输出对model-avoid-testing-framework- 不要测试 ActiveRecord 或框架行为model-test-enums- 测试枚举转换和生成的作用域
4. 请求与控制器测试(高)
request-over-controller-specs- 使用请求测试而不是已弃用的控制器测试request-test-response-status- 明确断言 HTTP 状态码request-test-authentication- 为每个受保护的端点测试认证边界request-test-authorization- 为每个角色测试授权request-test-params-validation- 测试参数验证和边界情况request-json-response-structure- 为 API 端点断言 JSON 响应结构
5. 系统与验收测试(中高)
system-page-objects- 将页面交互封装在页面对象中system-use-accessible-selectors- 使用可访问的选择器而不是 CSS/XPathsystem-avoid-sleep- 永远不要使用 sleep — 依赖 Capybara 的内置等待system-test-critical-paths- 保留系统测试用于关键用户旅程system-database-state- 使用截断策略进行系统测试数据库清理system-screenshot-on-failure- 在系统测试失败时捕获截图
6. 异步与后台作业测试(中)
async-separate-enqueue-from-perform- 分别测试入队和执行async-use-fake-mode-default- 默认全局使用 Sidekiq 假模式async-test-job-perform- 直接测试作业执行方法async-test-mailer-delivery- 使用入队邮件匹配器测试邮件发送async-test-after-commit- 在 Rails 7.2+ 中考虑事务感知的作业入队
7. 测试性能与可靠性(中)
perf-parallel-tests- 跨 CPU 核心并行运行测试perf-database-strategy- 对非系统测试使用事务策略perf-profile-slow-specs- 分析并修复最慢的规范perf-quarantine-flaky-tests- 隔离不稳定测试而不是重试perf-avoid-before-all-mutation- 永远不要修改在 before(:all) 中创建的状态
8. 测试组织与维护(低中)
org-avoid-deep-nesting- 限制上下文嵌套到 3 层org-shared-examples-sparingly- 仅对真正的行为契约使用共享示例org-custom-matchers- 为重复的领域断言提取自定义匹配器org-file-structure-mirrors-app- 在 spec 目录中镜像应用目录结构
如何使用
阅读单独的参考文件以获取详细解释和代码示例:
- Section definitions - 类别结构和影响级别
- Rule template - 添加新规则的模板
参考文件
| 文件 | 描述 |
|---|---|
| references/_sections.md | 类别定义和排序 |
| assets/templates/_template.md | 新规则的模板 |
| metadata.json | 版本和参考信息 |