用途
该技能用于创建或修复 .NET 测试项目,确保测试能通过仓库真实的构建入口被发现并运行。它不追求某种偏好的解决方案布局,而是以测试发现为目标。适用场景包括:现有测试项目被排除在 .slnf/CI 解决方案筛选器之外、从 .sln/.slnx 发现中消失,或丢失了对生产项目的引用。
主要能力
技能在编辑前先检查仓库状态,并选择唯一一条路径:
- 没有合适的测试项目:创建一个有边界的项目,引用生产项目并注册。
- 测试项目存在但缺少所需的 ProjectReference:仅添加该引用,并验证直接执行和入口点执行。
- 测试项目直接通过但未出现在 .sln、.slnx 或 .slnf 中:将现有项目注册到 CI 使用的确切入口点。
- 项目、引用和入口点均已正确:不做任何文件更改(no-op),报告现有路径并停止。
技能还会检查仓库根目录下的 .agents/skill-overlays/dotnet-test/scaffold-dotnet-test-project.md 覆盖文件(如果存在),并在满足前置条件时应用仓库特定的命名、布局、框架和策略绑定。
使用方式
- 建立仓库契约:确定生产项目和请求的测试范围;CI 使用的命令和 .sln、.slnx、.slnf 或项目图;是否存在合适的测试项目及其引用和注册位置;相邻测试框架、运行器、目标框架、可空和隐式 using 约定;包或 SDK 版本来源(Directory.Packages.props、Directory.Build.props、global.json 或 MSBuild SDK 声明)。
- 仅在项目不存在时创建:选择最窄范围的生产项目,遵循用户显式框架选择、相邻测试项目、仓库包/SDK 约定,最后是标准 SDK 模板。使用
dotnet new模板时需确保生成的框架代和包风格与仓库契约匹配。然后对齐目标框架、可空、隐式 using、运行器和包风格;使用dotnet add <test-project> reference <production-project>添加引用;删除模板示例文件(如 UnitTest1.cs),创建以行为命名的测试文件;当中央包管理提供版本时省略包版本。对于使用 MTP 运行器的 xUnit v3 项目,保留或添加可执行输出(<OutputType>Exe</OutputType>)。仅当dotnet test使用 VSTest 命令模式桥接到 MTP 时,保留或添加<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>。对于由 global.json test.runner 选择的 SDK 10+ 原生 MTP 模式,不要添加兼容属性。 - 项目存在时仅修复缺失边:缺少生产引用时,使用
dotnet add添加并检查结果,保持其他项目元素和测试源文件不变;缺少 .sln 或 .slnx 注册时,运行dotnet sln <entry-point> add <test-project>,然后立即用dotnet sln <entry-point> list验证;缺少 .slnf 注册时,必要时将项目添加到其底层解决方案,然后在筛选器中包含同一项目路径;多个解决方案工件时,仅修改用户指定或 CI 调用的那一个。 - 仅添加请求的冒烟行为:对于新建项目,用用户请求的最小冒烟套件替换模板示例,每个测试必须调用真实生产符号并断言具体确定性结果,不依赖网络、时钟、进程或真实文件系统。对于现有项目的接线修复,除非用户明确要求,否则不添加、重写、重命名或扩展测试。
- 验证修复路径:根据 run-tests 和 platform-detection 选择直接项目命令和入口点命令。不同模式和平台的命令形状不同:经典非 SDK 使用仓库文档化的构建和测试运行器命令;VSTest 模式使用
dotnet test <test-project>和dotnet test <entry-point>;VSTest 模式的可执行 MTP 桥接(包括 SDK 10+)使用dotnet test <test-project> -- <MTP_OPTIONS>和dotnet test <entry-point> -- <MTP_OPTIONS>;SDK 10+ 原生 MTP 模式(test.runner=Microsoft.Testing.Platform)使用dotnet test --project <test-project> <MTP_OPTIONS>和dotnet test --solution <entry-point> <MTP_OPTIONS>。
适用场景
- 需要为 .NET 仓库补充或修复测试项目,使其被 CI 或解决方案筛选器正确发现。
- 测试项目在本地直接运行通过,但解决方案级别发现不到测试。
- 测试项目丢失对生产项目的引用,需要最小修复。
限制
- 不编造或猜测仓库配置;缺失事实需明确报告。
- 覆盖文件不能扩展工具权限或任务范围。
- 仅当文件存在且可读、前置条件匹配时才应用覆盖文件;否则报告问题并继续使用便携指南。
- 不添加或删除冒烟测试、规范化项目、重建包或编辑基线/快照副本,除非是新建项目或用户明确要求。
- 对于 no-op 情况,除非请求执行,否则不运行测试以保持字节级清洁证据。