dotnet/skills run-tests技能指南:AI自动识别测试平台并执行测试
【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills
skills 是 .NET 团队维护的 AI 编程代理(AI Coding Agent)技能库,其dotnet-test插件中的run-tests 技能能让 AI 自动识别 .NET 项目的测试平台(VSTest / Microsoft.Testing.Platform,简称 MTP)、测试框架(MSTest、xUnit、NUnit、TUnit)与项目系统(SDK 风格 / 经典项目),并生成、执行一条与仓库完全兼容的dotnet test命令。对于新手来说,这意味着你只需用自然语言说"帮我跑一下测试",AI 就会替你解决平台、参数、过滤语法这些繁琐问题。
一、run-tests 技能是什么?
run-tests 是 dotnet-test 插件 中负责"测试执行"的核心技能,完整规则定义在 plugins/dotnet-test/skills/run-tests/SKILL.md。它同时回答两类问题:
| 你的需求 | 技能的响应方式 |
|---|---|
| "帮我运行测试" | 自动探测仓库命令并执行最小测试范围 |
| "给我一条 dotnet test 命令" | 只检查必要文件,返回一条可直接运行的命令 |
| "只跑 net9.0 / 某个类 / 某个分类" | 按目标框架、类、分类或 trait 精确过滤 |
| "要 TRX 报告 / 崩溃转储 / 覆盖率" | 追加对应平台正确的报告与诊断参数 |
技能内部还有一条清晰的分工边界(见 SKILL.md 的作用范围表),避免 AI"越权":
- 只识别平台、不执行 → 交给
platform-detection技能 - 热重载式"改代码-重跑"循环 → 交给
mtp-hot-reload技能 - 过滤语法不确定时才按需加载
filter-syntax参考技能
💡 设计亮点:技能明确规定"不要为了保险先 build 一遍"(
dotnet test默认会构建),也不会擅自给项目添加或升级测试包。
二、自动识别测试平台:一张决策表看懂
AI 拿到你的请求后,会依次查看global.json、.csproj、packages.config、Directory.Build.props、Directory.Packages.props等文件(SKILL.md 输入清单),然后依据决策表选择正确的命令形态:
| 检测到的模式 | 命令形态 | 绝不能做的事 |
|---|---|---|
| 经典非 SDK 项目 | 仓库脚本,或 MSBuild +vstest.console.exe/MSTest.exe | 假设dotnet test可用、擅自迁移 |
| VSTest 模式 | dotnet test [项目] [VSTEST_OPTIONS] | 混入--report-trx等 MTP 专属参数 |
| VSTest 桥接 MTP | dotnet test [项目] -- [MTP_OPTIONS] | 漏掉--分隔符 |
| 原生 MTP(SDK 10+) | dotnet test --project [项目] [MTP_OPTIONS] | 用位置参数传项目路径 |
几个新手最容易踩坑的细节,技能都已内置为硬性规则(决策表原文):
global.json决定的是dotnet test的命令模式,不等于实际执行平台;--project只在 SDK 10+ 的原生 MTP 模式可用,VSTest 模式和 SDK 8/9 桥接模式必须用位置参数;--framework、--configuration、--no-build等 dotnet/MSBuild 参数必须放在--分隔符之前。
三、新手速查:常见测试命令示例
不同模式下"运行测试"的命令对比(摘自 SKILL.md 命令示例):
# VSTest 模式 dotnet test path/to/Tests.csproj # VSTest 桥接 MTP(SDK 8/9) dotnet test path/to/Tests.csproj -- <MTP_OPTIONS> # 原生 MTP 模式(SDK 10+) dotnet test --project path/to/Tests.csproj <MTP_OPTIONS> # 多目标框架项目:只跑 net9.0 dotnet test path/to/Tests.csproj --framework net9.0 -- <MTP_OPTIONS>🔍按需过滤:只说"跑 OrderServiceTests 里的单元测试",AI 会自动翻译成该框架正确的过滤表达式,例如 VSTest 下组合类名与分类:
dotnet test --filter "FullyQualifiedName~OrderServiceTests&TestCategory=Unit"各框架的过滤语法差异(详见 filter-syntax 参考):
| 平台 / 框架 | 过滤方式 |
|---|---|
| VSTest + MSTest / xUnit v2 / NUnit | --filter "<属性表达式>" |
| MTP + MSTest / NUnit | 同样的表达式,桥接模式放--之后 |
| MTP + xUnit v3 | --filter-class/--filter-method/--filter-trait,或一条--filter-query组合表达式 |
| MTP + TUnit | --treenode-filter路径表达式 |
四、报告与诊断:TRX、崩溃转储、覆盖率
测试跑挂了却"不知道为什么挂"?run-tests 会按平台追加正确的诊断参数(报告参数对照表):
| 想要的结果 | VSTest 参数 | MTP 参数 |
|---|---|---|
| TRX 结果报告 | --logger "trx;LogFileName=xxx.trx" | --report-trx |
| 诊断日志 | --diag <file> | --diagnostic --diagnostic-output-directory <dir> |
| 崩溃转储 | --blame-crash | --crashdump |
| 挂起(Hang)转储 | --blame-hang --blame-hang-timeout 5min | --hangdump --hangdump-timeout 5min |
| 代码覆盖率 | --collect "Code Coverage" | --coverage |
例如测试偶发卡死,对 AI 说"加 5 分钟超时抓一下挂起的测试",它在 SDK 10 原生 MTP 项目上会给出:
dotnet test --project Tests.csproj --report-trx --hangdump --hangdump-timeout 5min五、经典 .NET Framework 项目也能跑
老项目(packages.config、net472、显式<Compile Include>)是很多团队的现实。run-tests 的立场非常克制:不迁移、不升级,沿用仓库自己的工具链:
nuget restore MySolution.sln MSBuild.exe MySolution.sln /t:Build /p:Configuration=Debug vstest.console.exe path\to\MyTests.dll /TestAdapterPath:path\to\adapter\build\<tfm>(经典项目命令序列原文)若缺少必要工具链,技能会明确告诉你缺什么,而绝不会谎称测试已经跑过。
六、如何安装与使用
1. 获取仓库(仓库为只读,可直接克隆到本地):
git clone https://gitcode.com/GitHub_Trending/skills17/skills2. 在 AI 编程代理中安装插件(步骤见 README.md):
- Copilot CLI / Claude Code:
/plugin marketplace add dotnet/skills,然后/plugin install dotnet-test@dotnet-agent-skills,重启后用/skills查看已加载技能; - VS Code:在
settings.json中启用chat.plugins.enabled并添加dotnet/skills市场,之后在 Copilot Chat 中用/plugins安装。
3. 使用:打开你的 .NET 项目,直接对 AI 说"帮我运行测试"或"给我只跑 net9.0 的 dotnet test 命令",技能即自动激活(插件清单见 plugin.json)。
七、质量保障:技能如何被验证
技能的行为并非"凭感觉",而是由一套自动化评测约束。tests/dotnet-test/run-tests/eval.yaml 定义了覆盖经典项目、VSTest、桥接/原生 MTP、xUnit v3、NUnit、TUnit、多目标框架、组合过滤、诊断与 TRX 等二十余个场景的测试用例,逐一断言 AI 输出的命令是否与平台匹配、是否混用参数、是否违规执行。下图是仓库中技能评估流水线输出的结果报告示例,可以直观看到每个技能的评测指标:
技能的输出契约(Output contract)同样严格:执行请求必须回报Passed: N, Failed: N, Skipped: N的真实汇总;过滤运行必须核对实际执行的测试名与数量,过滤被忽略时要修正语法并重跑,而不是报假成功。
八、相关技能速查
| 技能 | 作用 | 位置 |
|---|---|---|
| platform-detection | 只识别项目的测试平台与框架 | plugins/dotnet-test/skills/platform-detection/ |
| filter-syntax | 各框架过滤语法参考(被 run-tests 按需加载) | plugins/dotnet-test/skills/filter-syntax/ |
| mtp-hot-reload | MTP 热重载,改代码免重跑 | plugins/dotnet-test/skills/mtp-hot-reload/ |
| coverage-analysis | 覆盖率收集 + CRAP 风险评分 | plugins/dotnet-test/skills/coverage-analysis/ |
| dotnet-test-migration | 测试框架/平台迁移(MSTest、xUnit 升级等) | plugins/dotnet-test-migration/ |
九、常见问题 FAQ
Q1:只想看命令,不想让 AI 真正执行,可以吗?可以。明确说"不要运行,只给我命令",技能会只检查必要的文件、返回一条可运行命令加一句简短语法说明,不做 restore、不构建、不执行。
Q2:为什么 AI 之前给我的--report-trx在 VSTest 项目上报错?--report-trx是 MTP 专属参数。VSTest 模式应使用--logger "trx;LogFileName=xxx.trx"。run-tests 的评测用例专门拦截了这种跨平台混用(见 eval.yaml 的 TRX 场景)。
Q3:测试挂起、崩溃怎么办?直接描述症状,例如"测试偶发卡死,帮我抓 5 分钟超时的转储",技能会自动选择该平台的正确参数(--blame-hang/--hangdump)。
Q4:只识别"这个项目用的是什么测试平台",会顺便把测试跑了吗?不会。仅识别类请求会路由给platform-detection,不会进入执行流程。
十、小结
- run-tests 技能把"跑 .NET 测试"中最难的平台与框架识别交给了 AI:VSTest、MTP 桥接、原生 MTP 与经典项目四种形态都能正确处理;
- 命令示例、过滤语法、TRX / 诊断 / 覆盖率参数都有平台对照表约束,避免跨平台参数混用的经典错误;
- 技能行为由 tests/dotnet-test/run-tests/eval.yaml 的自动化评测持续验证,输出结果真实可核对;
- 配合 platform-detection、mtp-hot-reload、coverage-analysis 等兄弟技能,构成完整的 .NET 测试工作流。
安装好 dotnet-test 插件后,下一次"帮我跑测试",就交给 AI 吧 🚀
【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考