少写单测,从项目入口写覆盖全面的 E2E 测试。
让 Agent "补一下测试",它会给每个函数生成一大堆单元测试,把内部依赖全部 mock 掉,再断言 mock 被调用了一次。覆盖率很好看,可这些测试数量巨大,几乎抓不住任何回归:改个函数名就大面积变红,真出了 bug 反而全绿。
一套以 E2E 为优先的测试方法论。测试的价值只有一条标准:调用方依赖的行为坏了它就变红,行为没变它就保持绿。
- 从真实调用方的入口进入:CLI 命令、SDK 调用、HTTP 路由、MCP tool,并且使用和生产环境同一套依赖装配。
- 测试替身只放在外部边界:LLM provider、浏览器驱动、远程服务、时钟、随机数。仓库自己的模块一律保持真实。
- 隔离测试先列失败方式:解析器、调度算法这类值得单独测的逻辑,先列全所有出错方式再写代码。
- 附带
exclusive_coverage.py脚本,用来找出并清理遗留套件里的冗余测试。
# tests/unit/test_handler.py (同类文件还有 40 多个) def test_handle_request(mocker): mocker.patch("app.router.dispatch") mocker.patch("app.store.save") mocker.patch("app.llm.client.chat") handle_request({"q": "hi"}) app.router.dispatch.assert_called_once()
示例为示意代码。
- 测试更少,但每个都有用每个测试对应一条调用方真正依赖的行为。
- 重构不再大面积变红只要行为不变,内部怎么改测试都是绿的。
- 回归能被抓住bug 就出在生产路径上,测试走的也是这条路径。
npx skills add shaokeyibb/hikarilan-skills --skill e2e-first-testing