DSH Test AutoFix:给 agent 的 run_tests 与结构化失败修复循环

前言

在 DSH 里让 agent「改完代码再跑测试、根据失败继续改」,常见做法是直接执行 npm test 或 pytest,把整段终端输出塞进对话。失败往往只占几十行,traceback 却可能几百行;模型还要自己在几千行里找「哪个文件、哪一行、什么断言挂了」。其他 AI 编码工具里已有类似的自动测修能力(例如 Aider 的 --test-cmd、Cline 的跑测并修复、Cursor Automations 等),而 DSH 生态里此前缺少把「执行测试 + 结构化失败 + 修复循环」做成 agent 工具的方案。DSH Test AutoFix(npm 包名 dsh-test-autofix,GitHub 仓库 1250589385/DSH-Test-Autofix)由维护者 1250589385 发布,分类为工作流,核心是给 agent 注册一个 run_tests 工具:自动识别常见测试框架、跑测、把失败压成 JSON(文件、行号、断言信息),并在同一失败反复出现时自动停止,避免死循环烧 token。

这是什么

一句话:跑测试 → 结构化提取失败 → 把精准失败点交给 agent 修,而不是整坨日志。

插件通过 Cordis patch 向 DSH 注册工具 run_tests,由 agent 自主调用(与同生态里斜杠命令 /test 的 @mkaliezz/dsh-test-runner 不同:后者需自行注入 run 适配器,本插件内置执行与框架探测)。两者命名空间不同,可共存。

核心功能

结构化失败输出

测试失败时,工具返回类似下面的结构(示例来自 README),而不是完整原始输出:

{
  "status": "failed",
  "framework": "pytest",
  "passed": 2,
  "failed": 1,
  "failures": [
    {
      "file": "tests/test_math.py",
      "test": "test_divide",
      "line": 12,
      "message": "ZeroDivisionError: division by zero",
      "detail": "def test_divide():\n>       assert divide(1, 0) == 0\nE       ZeroDivisionError: division by zero"
    }
  ]
}

为省 token:每个失败详情最多约 14 行(已知限制里写单个失败详情最多 16 行)、最多返回 20 个失败;通过时不带原始输出;失败时仅保留原始输出的最后 40 行作兜底。

自动识别测试框架

项目特征 使用
pyproject.toml / pytest.ini / setup.cfg / tox.ini pytest
Cargo.toml cargo test
go.mod go test ./...
package.json + vitest 依赖 vitest
package.json + jest 依赖 jest
package.json + test 脚本 npm test

也可用 framework 参数强制指定。Node 侧会按可用性选择启动器(node_modules/.bin、npx、pnpm exec、yarn、npm test);pytest 会按虚拟环境、DSH_PYTHON、PATH 上的 python 等顺序探测能 import pytest 的解释器。Windows 下通过 PYTHONIOENCODING / PYTHONUTF8 与解码回退,减轻中文断言乱码。

已支持解析的框架包括 pytest、jest / vitest、cargo、go(依赖各框架默认输出格式;自定义 reporter 可能导致解析失效并回退 raw_tail)。

死循环防护

对失败计算签名(文件 + 测试名 + 错误信息,故意忽略行号)。同一签名超过配置阈值时返回 status: "loop",提示 agent 停止反复编辑并向用户报告阻塞项。默认 repeatLimit 为 2(即同一失败重复到第 3 次会停止,README 示例文案为 3 times)。

安装与启用

--profile 为必填;将 <你的profile> 换成自己的 profile(可用环境变量 DSH_PROFILE 查看,桌面端常见 desktop,Web 端常见 web)。

方式一:从 npm 安装(推荐)

dsh plugin --profile <你的profile> add dsh-test-autofix

方式二:从 GitHub 安装

dsh plugin --profile <你的profile> add github:1250589385/DSH-Test-Autofix

方式三:本地源码目录(开发)

# macOS / Linux 示例
dsh plugin --profile web add /home/you/DSH-Test-Autofix

方式四:DSH 网页「添加插件」
输入框只填包名 dsh-test-autofix(或 Git 地址、本地路径),不要粘贴整条 dsh plugin ... 命令。

安装后重启 DSH,agent 即可看到 run_tests。当前 npm 版本为 0.1.3,许可证 MIT。

可选配置写在 profile 的 cordis.patch.yml:

- id: test-autofix
  name: DSH-Test-Autofix
  config:
    repeatLimit: 2      # 同一失败重复几次算循环(默认 2)
    timeoutMs: 300000   # 默认超时 5 分钟

典型用法

模型可直接调用工具,例如:

run_tests()                          # 自动识别并跑全部测试
run_tests(framework="pytest")        # 强制 pytest
run_tests(path_filter="test_math")   # 只跑匹配的测试
run_tests(timeout_ms=60000)          # 60 秒超时

也可以自然语言要求:「跑一下测试,把失败的修好」——agent 会走 run_tests 与后续编辑循环。

适用场景与注意

适合谁: 在 DSH 里做 TDD 或「改代码—跑测—修失败」闭环的开发者;多栈仓库(Python / Node / Rust / Go)希望 agent 少猜命令、少吞日志。

务必注意:

  • 插件以当前 DSH 进程权限执行子进程跑测试;安装前建议阅读 GitHub 源码 与 MIT 许可,确认符合你的安全策略。
  • 不替代 lint / typecheck;解析器绑定默认终端格式;特殊 Python 部署可设 DSH_PYTHON。
  • 参数错误、找不到 runner 等会返回结构化结果和 notes,不把失败伪装成测试失败。

社区目录页:DSH-Test-Autofix @ SkillHub(独立社区站点,与 DeepSeek / 幻方无官方从属关系)。DSH 理念是「一切皆插件」;若你只需要解析自己已有的测试输出,可考虑 @mkaliezz/dsh-test-runner;若要让 agent 自己跑、自己看、自己修,用本插件更合适。

结尾

DSH Test AutoFix 把「跑测 + 精准失败 + 循环止损」收成 agent 侧的 run_tests,补齐 DSH 工作流里测试自动修复这一环。详情与更新见 GitHub 仓库,目录介绍见 SkillHub 插件页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜