Mistral AI Rails 测试代理

Mistral AI 开发了一种自主代理,旨在通过自动生成和改进 RSpec 测试,消除大型 Ruby on Rails 单体架构中的测试差距。该代理在 CI/CD 流水线中运行,无需人工干预,并利用并行执行来处理大规模代码库。

自主测试生成工作流

该代理采用结构化的执行计划,以确保全面的测试覆盖率并遵循样式指南。此过程通过仓库级别的 AGENTS.md 文件进行管理,该文件引导代理执行以下步骤:

  1. 源码分析: 读取源文件和任何可用的文档。
  2. 现有测试检查: 确定是否已存在 spec。
  3. 技能选择: 根据源文件位置选择专门的技能。
  4. 模式识别: 识别现有的模式、factories 和 helpers。
  5. 执行: 提取逻辑、管理 factories 并生成测试。
  6. 验证: 使用 RuboCop 和 SimpleCov 工具验证代码。

为了防止代理跳过公共方法,工作流包含一个强制性的自我审查步骤,代理必须统计并验证源文件中的每个公共方法是否都已通过测试。

通过 Vibe 进行技术实现

该代理基于 Mistral 的开源编程助手 Vibe 构建。实现过程依赖于三个主要杠杆:上下文工程、专门的技能和自定义工具。

上下文工程与专门的技能

由于不同的 Rails 组件需要不同的测试策略,代理为每个类别(例如 models、controllers、serializers、mailers、helpers 和纯 Ruby 文件)使用单独的 "skills" 文件。例如,一个 controller 技能会强制执行特定规则,例如断言 JSON 内容而不仅仅是 HTTP 状态码,并验证每个 action 的身份验证。

自定义验证工具

为了确保生成的测试是功能完备且合规的,代理利用了集成到 Vibe 框架中的自定义工具:

  • RuboCop Tool: 一个 linting 工具,用于检测样式违规,触发代理重写代码直到其符合规范。
  • SimpleCov Tool: 该工具通过 RSpec 执行 spec 文件,并报告测试通过/失败的结果以及行覆盖率百分比。这一步至关重要,因为它可以防止 "missing parenthesis problem"(即测试在 LLM 看来质量很高,但由于语法错误而无法执行)。

衡量测试质量

Mistral AI 使用混合方法来评估生成测试的质量,结合了基于工具的定量指标与基于 LLM 的定性评分。

定量指标

代理使用标准 Ruby 工具跟踪以下指标:

  • RSpec: 测试的通过/失败状态。
  • RuboCop: 每个文件的样式违规数量。
  • SimpleCov: 代码覆盖率百分比。

LLM-as-a-Judge

为了评估定性方面——例如是否测试了错误条件或断言是否精确——Mistral 使用了 "LLM-as-a-judge" 模型。该评判者使用严格的评分细则(0.0 到 1.0),基于精确值的存在(例如,使用 eq(100) 而不是 be_present)以及对 happy、error 和 boundary paths 的覆盖情况。

实验结果

在一项涉及 275 个源文件的仓库实验中,代理的任务是为未覆盖的文件生成测试并改进现有测试。结果显示测试质量和覆盖率显著提高:

| Metric | Result | | :--- | :--- | | | Files processed | 275 | | Tests passing | 100% | | Average line coverage (SimpleCov) | 100% | | RuboCop violations after self-correction | 0 | | LLM-as-a-judge score | 0.74 |

按文件类型划分的性能

代理的有效性因所测试的逻辑类型而异,其中自包含的业务逻辑最容易实现自动化:

  • Models: 0.81 分
  • Serializers: 0.80 分
  • Controllers: 0.67 分

Mistral AI 指出,在第一次执行时只有三分之一的测试通过,这突显了由 SimpleCov 和 RSpec 驱动的迭代自我修正循环是系统设计中最具影响力的部分。

Sources

相关

  • Dispatch
  • Dispatch
  • Dispatch
  • Dispatch
  • Dispatch