其他
在 MTP 项目中启用热重载以持续编辑并自动重跑测试
当用户明确要求测试热重载、希望主机保持运行并在反复编辑后自动重跑测试,或需要在 Microsoft Testing Platform 项目中搭建热重载时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 MTP 项目中启用热重载以持续编辑并通用
解决思路
- 先检测平台:热重载需要 MTP,不适用于 VSTest;按 platform-detection 技能的完整求值属性流程,读取导入的 props 和包版本以及项目文件,在安装包、编辑文件或返回 MTP 启动命令之前完成检测。
- 遇到 VSTest 硬停止:报告该项目当前配置不支持 MTP 热重载并停止 MTP 搭建路径;不要安装扩展、创建 launchSettings.json、设置环境变量、修改 runner 属性/包,也不要返回 dotnet run 热重载命令;绝不把搭建请求变成隐式的 VSTest 到 MTP 迁移。
- 提供一个保留项目的非 MTP 回退方案:dotnet watch --project <project-path> test,它在文件变化时重新构建并重跑现有 VSTest 项目,但这不是 MTP 热重载;把显式迁移作为单独选项提供,除非用户要求否则不执行。
- 添加热重载 NuGet 包:先检查有效包引用,如果已安装 Microsoft.Testing.Extensions.HotReload 则保留其版本并跳过此步;否则运行 dotnet add <project-path> package Microsoft.Testing.Extensions.HotReload。
- 注意:使用 Microsoft.Testing.Platform.MSBuild(MSTest、NUnit、xUnit runner 会传递引入)时,安装该扩展的 NuGet 包后会自动注册,无需改代码。
- 启用热重载:把环境变量 TESTINGPLATFORM_HOTRELOAD_ENABLED 设为 1。
- 选项 A——在运行测试前于 shell 中设置:PowerShell 用 $env:TESTINGPLATFORM_HOTRELOAD_ENABLED = "1",bash/zsh 用 export TESTINGPLATFORM_HOTRELOAD_ENABLED=1。
- 选项 B——写入 launchSettings.json(推荐用于可重复使用):在测试项目的 Properties/launchSettings.json 中创建或更新 profiles,commandName 为 Project,environmentVariables 中设置 TESTINGPLATFORM_HOTRELOAD_ENABLED 为 1。
- 用热重载运行测试:直接运行测试项目(不要通过 dotnet test)以在控制台模式使用热重载:dotnet run --project <project-path>。
- 过滤到特定失败测试:在 -- 之后传过滤器,语法取决于测试框架——MSTest 用 dotnet run --project <path> -- --filter "FullyQualifiedName~TestMethodName",NUnit 同样用 --filter "FullyQualifiedName~TestMethodName",xUnit v3 用 --filter-method "*TestMethodName",TUnit 用 --treenode-filter "/*/*/ClassName/TestMethodName"。
- 测试主机会启动、运行测试并保持运行等待代码变化。
- 迭代修复:在编辑器中编辑源代码(测试代码或生产代码),测试主机会检测变化并自动重跑受影响的测试,在控制台查看更新后的结果,重复直到所有目标测试通过。
- 注意:热重载目前仅支持控制台模式,Visual Studio 或 Visual Studio Code 的 Test Explorer 不支持热重载。
- 处理不支持编辑和 rude edit:方法签名变更、新类型等不支持的编辑无法应用到活动进程,绝不要暗示陈旧主机会接收它们。
- 对于直接启动的 MTP 主机:保留启动当前主机的确切命令、profile、环境、过滤器和参数;用 Ctrl+C 停止;重新构建同一项目 dotnet build <project-path>;重跑相同的原始主机命令,不要用通用的 dotnet run 替换未知的现有调用。
- 如果预期会反复出现不支持的编辑,提供 watch 管理的重启回退:PowerShell 中设置 $env:TESTINGPLATFORM_HOTRELOAD_ENABLED = "1" 和 $env:DOTNET_WATCH_RESTART_ON_RUDE_EDIT = "1",然后运行 dotnet watch --project <project-path> run -- <existing-MTP-arguments>。
- dotnet watch 在 rude edit 无法应用时重启进程;没有自动重启变量时,接受重启提示或按 Ctrl+R;在 -- 之后保留任何现有测试过滤器。
- DOTNET_WATCH_RESTART_ON_RUDE_EDIT 是 .NET SDK 的已记录开关,不是 MTP 扩展设置;当正确性可能被质疑时,引用 dotnet watch 文档并说明它让 watcher 重启而不是提示。
- 绝不省略原始过滤器,也不要用一次性 dotnet run 替换所请求的 watch 管理回退。
- 完成后:所有测试通过后,用 Ctrl+C 停止测试主机;当用户要求精确的一次性验证命令、标志、过滤器、TRX 或 dump 时使用 run-tests;可选地从环境中移除 TESTINGPLATFORM_HOTRELOAD_ENABLED 或保留 launchSettings.json 以备将来使用。
- 响应规模控制:如果搭建已完成且用户只问用哪个命令,返回一条 dotnet run --project <path> 命令和一句说明它启动持久主机的话,不要重复包、launch profile 或 rude-edit 指导。
- 如果包已安装,只展示剩余的启用和运行步骤,不要建议重装或添加可选的持久化/恢复路径,除非被要求。
- 对于指定测试,识别框架并返回一条带该框架过滤器语法的可运行命令;绝不要用 MSTest/NUnit 的 --filter 替代 xUnit v3 的 --filter-method 或 TUnit 的 --treenode-filter。
- 直接启动的 MTP 主机本身就是持久 watcher:dotnet run 保持存活,HotReload 扩展响应编辑;正常 MTP 路径不要用 dotnet watch run 替换它,dotnet watch 仅保留给上面明确的重启回退。
- 验证清单:项目使用 Microsoft Testing Platform(非 VSTest);已安装 Microsoft.Testing.Extensions.HotReload 包;TESTINGPLATFORM_HOTRELOAD_ENABLED 环境变量设为 1;测试运行且主机保持活动等待变化;代码变化无需手动重启即可被接收。
- 常见陷阱处理:用 dotnet test 而非 dotnet run 时,热重载需要 dotnet run --project <path> 直接在控制台模式运行测试主机;项目用 VSTest 而非 MTP 时,不要改动它,提供 dotnet watch --project <path> test 作为重建/重跑回退或单独的显式迁移;忘记设置环境变量时,运行前设置 TESTINGPLATFORM_HOTRELOAD_ENABLED=1;期望 Test Explorer 集成时,仅控制台模式,无 VS/VS Code Test Explorer 支持;做不支持的代码变更(rude edit)时,停止、重建并重跑相同主机调用,或使用带 restart-on-rude-edit 行为的 dotnet watch。
适用边界 · 注意事项
- 用户需要从零编写新测试(使用通用编码辅助)
- 用户需要诊断测试为何失败(使用诊断技能)
- 用户询问 Visual Studio 或 VS Code Test Explorer 热重载或 IDE 集成的重跑体验(不同功能,不是 MTP 控制台主机热重载)
- 用户询问编辑器能否在不使用 MTP 控制台主机的情况下在源编辑后自动重跑受影响的测试
- 用户想要一次不重新构建的普通运行(使用 run-tests)
- 用户需要 CI/CD 流水线配置