code-testing-generator — 微软官方出品,Agent 生成的测试必须先过"伪变异"安检才能叫完成
每个 AI 编码 Agent 都会欣然帮你写单元测试。失败模式不是它拒绝写,而是你得到 40 个绿色的 Assert.NotNull(result)——删掉方法体照样全绿。2026 年 7 月 31 日,微软在 dotnet/skills 仓库发布了 dotnet-test 插件,里面藏着一个叫 code-testing-generator 的内部编排器。它不让你直接调用,而是被上层技能调度,在写完测试之后、汇报"完成"之前,强制跑一轮三道安检。
第一道叫伪突变分析(pseudo-mutation analysis)。Agent 模拟对被测代码做小改动——改一个运算符、翻转一个条件、删一行赋值——然后重新跑测试,看有没有测试因此而变红。如果一个改动改了方法的行为、所有测试仍然全绿,这批测试就是白写的。它不是真正的突变测试(不会真的覆盖所有变异算子),但它只花几秒钟就给出一个信号:"你这些测试到底在不在保护代码。"第二道是断言深度审查——Agent 审视自己写的断言是不是弱到等于没有。Assert.NotNull(result) 过不了这一关,Assert.Equal(90.00m, result.Total) 才能过。第三道是需求-场景映射——你要求覆盖的每个功能场景是不是都有专属测试,而不是被某个泛泛的"验证方法不抛异常"顺手带过。
三道安检通过之后,才会执行全量构建 + 完整测试套件 + 确认仓库自己的测试发现命令能找到这些新测试。这种设计意味着 Agent 不能靠 40 个 NotNull 断言就收工邀功。
很多人看到仓库路径 dotnet/skills 会以为这是 .NET 专属工具。不是。它覆盖 12 种语言:.NET、Python、TypeScript/JavaScript、Java、Go、Ruby、Rust、Swift、Kotlin、PowerShell 和 C++。Agent 会先搜索仓库里已有的测试,学习这个项目的惯例——测试放在哪个目录、用的是 pytest 还是 Vitest、mock 的风格是 jest.mock 还是 Sinon——然后按这个惯例写新测试,而不是硬套 C# 模式。
微软在内部 benchmark 上测了四种配置:裸的 GitHub Copilot、裸的 Claude Code、Copilot + 本插件、Claude Code + 本插件。结果:本插件在 Copilot 上完成率 92.1%(140/152 任务),裸 Copilot 是 78.9%。差距在"模糊提示词"场景最大——"帮我写单元测试"这种不指定覆盖范围的提示,裸 Copilot 完成率 66.3%,加上本插件 88.8%。平均每个任务耗时 359 秒,产生 72.4% 行覆盖和 49.8% 分支覆盖。
实事求是地说,分支覆盖率 49.8% 不算高——这意味着大约一半的分支没有测试覆盖。但这个数字恰好反映了插件的设计哲学:它不是追覆盖率数字的,它是在有限步骤内产出有用测试的。当 Agent 达成了它的质量 checklist(伪突变通过、断言深度合格、需求对得上),它就停手,不去为了把分支覆盖率从 50% 推到 80% 而多跑十轮迭代。
还有一个值得展开的设计决策。插件定义了三种工作路径:Direct(只测一个函数时直接写,跳过子 Agent 管线,仅保留最终安检)、Single pass(中等范围,研究→规划→实现一轮)、Iterative(大范围,多轮循环缩小覆盖缺口)。官方建议是"大多数请求应该走 Direct 路径,不要启动完整的管线"——这在 AI Agent 产品里是少见的克制。大部分工具默认把最重的流程推给你,这个工具默认让你用最轻的。
# GitHub Copilot CLI 中安装
/plugin marketplace add dotnet/skills
/plugin install dotnet-test@dotnet-agent-skills
# 重启 CLI,选择 code-testing-generator agent
# 然后说一句:
"Generate unit tests."同类工具对比
| 工具 | 语言覆盖 | 核心特色 | 检验机制 | 价格 | 热度 |
|---|---|---|---|---|---|
| code-testing-generator(今日推荐) | 12 种 | 伪突变分析门控 + 断言深度审查,三工作路径自适应 | 变异模拟 + 断言质量 + 需求映射 | 开源 MIT | 🏪 官方 · 新发布 |
| Diffblue Testing Agent | Java/Python | 形式化方法 + 符号执行引擎,企业级批量覆盖 | 编译验证 + 覆盖率验证 + 不引入回归 | 企业付费 | 商业产品 |
| testpilot-ai | TypeScript | AST 分析 + 自修复循环,自动重试直到测试通过 | 运行验证 + 最优版本持久化 + 震荡检测 | 开源 MIT | 🆕 |
| RoostGPT | 7 种 | AST + 调用图 + 依赖映射,支持 10 种 AI 提供商 | 编译 + 运行 + 覆盖率 | 商业产品 | 商业产品 |
| Keploy UTG | 多语言 | PR diff 驱动的测试生成,多 LLM 投票选最优结果 | 编译 + 运行 + 覆盖率 | 免费/企业 | 商业产品 |
code-testing-generator 在这个品类里的独特之处不在于"生成更多测试"——Diffblue 在批量覆盖上更强,RoostGPT 的自我修复循环更成熟,testpilot-ai 的验证重试机制更激进。它独特的点在于那道安检门:写完测试之后、宣布完成之前,模拟破坏被测代码来验证测试是否真的在保护逻辑。这是把"测试质量判断"从主观感受变成了一个自动化的、可复现的流程。其他工具也会验证测试编译和运行通过,但只有这个工具会主动问:"如果我改了这段代码,你的测试会变红吗?"
🏪 GitHub Copilot CLI Marketplace · dotnet/skills · MIT · GitHub · 官方博客
Mu — 67 种互联网工具打包成一个 MCP 端点,Agent 不再为每个 API 单独装服务器
给 Agent 接外部工具,今天的标准做法是:搜一个 MCP Server → claude mcp add → 配 API Key → 重复 N 次。搜网页用 Tavily MCP,查天气用 Weather MCP,看新闻用 RSS MCP,发邮件用——等等,发邮件有 MCP 吗?这本质上是碎片化:每个能力是一个独立服务器,各自有各自的认证方式、各自的 API Key、各自的速率限制。Agent 接入 5 种能力就要维护 5 个 MCP 配置,还不算每个服务器被模型加载时额外消耗的上下文 token。
Mu 的思路反过来了。它在同一个 Go 二进制里跑着一整套日常互联网服务——搜索引擎、邮件服务器(SMTP + DKIM 签名)、RSS 聚合器、天气查询、加密货币/期货行情、YouTube 去广告播放、图片生成、日历提醒、甚至伊斯兰祈祷时间——一共 67 种,全部通过一个 MCP 端点 https://micro.mu/mcp 暴露。Agent 不需要为每种能力单独装一个 MCP Server,它只需要接一个 Mu,然后调用 mu__web_search、mu__mail_inbox、mu__weather_forecast 就行了。
这个架构和其他 MCP 工具的根本差异不在于"数量多",而在于谁在运行服务。大多数 MCP Server 是 API 包装层——它们在中间把 Agent 的请求翻译成第三方 API 调用。Mu 不包 API,它自己跑服务。mail_inbox 读的是 Mu 自己的 SMTP 服务器里的收件箱,不是 Gmail API。web_search 查的是 Mu 自己维护的搜索索引,不经过 Google 或 Bing。db_create 写的是 Mu 自己的存储。这种"自营"模式带来一个实际好处:Agent 接入时不需要配一堆 API Key,不需要管理速率限制配额,不需要担心某个第三方 API 改版了导致 MCP Server 挂掉。
但这同样意味着信任边界要重新画。邮件、联系人、文件、日历都是敏感数据。让 Agent 替用户收发邮件、写文件、查日程,对授权边界和可审计性的要求比"让 Agent 搜一下天气"高一个数量级。Mu 提供了自托管选项——一个 docker compose up 或 go install 就能在自己机器上跑——让团队可以在自己的基础设施上审查和适配这些能力。AGPL-3.0 许可,开源透明。
从开发者的视角看 Mu 的另一个巧思:同一套服务注册之后,自动出现在 MCP、REST API、A2A 端点、CLI 子命令和 Web 界面里。你不需要为"Agent 能调用"和"人能浏览"分别维护两套接口。注册一个服务,两个通道同时有了。
实际使用体验相当自然。启动后打开 http://localhost:8080,完成一次性设置(创建管理员账号 + 选择 AI 提供商),Mu 就跑起来了。在 Claude Code 或 Cursor 里配一行 MCP 指向 https://micro.mu/mcp(或用自托管地址),Agent 就能调用全部 67 种工具。OAuth 自动处理认证流程。工具目录和每次调用的费用在 micro.mu/tools 实时可见——Mu 通过 x402 协议支持 USDC 按次付费,前 10 次免费。
# 自托管(Docker)
git clone https://github.com/micro/mu.git
cd mu
docker compose up
# 或直接 go install
go install github.com/micro/mu@latest
mu --serve
# 在 Claude Code 中接入
claude mcp add --transport http mu https://micro.mu/mcp
# CLI 用法(每个 MCP 工具也是 CLI 子命令)
mu news
mu weather forecast --lat 39.9 --lon 116.4
mu search "AI agent tools 2026"同类工具对比
| 工具 | 工具数 | 服务模型 | 部署 | 自托管 | 价格 | 热度 |
|---|---|---|---|---|---|---|
| Mu(今日推荐) | 67 | 自营服务(自建 SMTP、搜索索引、存储) | Go 单二进制 | ✅ Docker / go install | 按次付费 USDC / 自托管免费 | ⭐ 97 |
| AgentSpan | 91 | API 包装层 + L1/L2/L3 缓存 + 自愈后端切换 | Rust 异步网关 | ✅ Docker | 开源 | 🆕 |
| Tavily MCP | 2(搜索+抓取) | API 包装层(自建搜索索引) | 远程 | ❌ | 免费层 1000/月 | 商业产品 |
| Exa MCP | 2(搜索+抓取) | API 包装层(自建搜索索引) | 远程 | ❌ | 免费层 + 付费 | 商业产品 |
| Browser MCP(Playwright 等) | 22+ | 通用浏览器操控 | npm / Docker | ✅ | 开源 | ⭐ 35.7K |
Mu 在这个品类里做了一件其他工具没做的事:它不仅提供工具,还运行工具背后的服务。Tavily 和 Exa 给你搜索能力但只做搜索,AgentSpan 覆盖 52 个平台但本质上是 API 包装层。Mu 的目标是成为一个 Agent 的"个人互联网工作台"——搜索、邮件、日程、文件、行情、天气,一个端点全包。这个雄心的代价是:你需要把更多个人数据交给它。自托管模式缓解了这个担忧,但也意味着你需要自己维护邮件服务器和搜索索引。当天平的一端是"67 种能力一键接入"、另一端是"运维成本和信任边界",你的团队技术栈和个人数据敏感度决定了 Mu 是神器还是过度设计。
⭐ 97 · v0.1.0+ · AGPL-3.0 · Go · GitHub · 官网 · 工具目录
夜雨聆风