用途:把测试项目从 MSTest v3 迁移到 v4,目标是项目可干净生成、测试通过,并处理所有源码不兼容与行为变更。适用升级 MSTest.TestFramework、MSTest.TestAdapter、MSTest 元包或 MSTest.Sdk(3.x 到 4.x)、修复升级后生成错误、处理执行行为变化、更新自定义 TestMethodAttribute 或 ConditionBaseAttribute。不适用于已用 v4 且生成干净、从 v1/v2 升级(先用 migrate-mstest-v1v2-to-v3)、未使用 MSTest、或更换测试框架。流程:先检查 .csproj、Directory.Build.props、Directory.Packages.props 中的 MSTest 版本,确认当前为 3.x;检查目标框架,v4 支持 net8.0、net9.0、net462、uap10.0.16299、net9.0-windows10.0.17763.0、net8.0-windows10.0.18362.0;检查自定义 TestMethodAttribute 与 ExpectedExceptionAttribute、Assert.ThrowsException 用法;跑一次干净生成建立基线。随后把元包、单独包、MSTest.Sdk 及集中包管理固定到从配置源解析出的最新稳定 v4 版本,执行 dotnet restore 与 dotnet build。再按编译错误修复源码:Execute 改 ExecuteAsync 返回 Task<TestResult[]>;[TestMethod("name")] 改用 DisplayName 命名参数并在子类构造中传播 CallerInfo;移除 ClassCleanupBehavior 参数(EndOfAssembly 逻辑迁到 AssemblyCleanup);Properties.Contains 改 ContainsKey;[Timeout(TestTimeout.Infinite)] 改 [Timeout(int.MaxValue)];ManagedType 改 FullyQualifiedTestClassName;消息+参数重载改用字符串插值;Assert.ThrowsException 改 Assert.ThrowsExactly 或 Assert.Throws;Assert.IsInstanceOfType 去掉 out 参数改为赋值;ExpectedException 改为在测试体内用 Assert.ThrowsExactly。CI 发现问题时注意 MSTest.Sdk v4 的 MTP 模式不再提供 Microsoft.NET.Test.Sdk:可保留 MTP 并添加该包以兼容 VSTest 发现、设置 UseVSTest 切换运行器,或把 CI 迁移到 dotnet test。限制:不得凭记忆编造版本或行为,需先读取实际项目并解析版本;结果证明须给出检测到的 v3 版本、解析出的 v4 版本、运行器选择、变更文件及实际构建/测试计数;其他细节暂未提供。
migrate-mstest-v3-to-v4
测试与质量
更新于 10-16 00:05