用途:把 .NET 测试项目从 xUnit.net v2 迁移到 xUnit.net v3,使所有测试项目引用 xunit.v3.* 包、编译通过且测试结果与迁移前一致。适用于升级 xunit(v2)包到 xunit.v3、修复升级后的编译错误;不适用于跨测试框架迁移(如 MSTest/NUnit 转 xUnit),也不适用于 VSTest 转 Microsoft.Testing.Platform(应使用 migrate-vstest-to-mtp)。
主要能力与流程:先识别引用 xunit、xunit.abstractions、xunit.assert、xunit.core、xunit.extensibility.core/execution、xunit.runner.visualstudio 的项目,检查 Directory.Build.props/targets 与 Directory.Packages.props;确认目标框架为 .NET 8+ 或 .NET Framework 4.7.2+(测试库项目支持 .NET Standard 2.0)且为 SDK 风格,否则先升级框架。随后按映射更新包:xunit→xunit.v3,xunit.abstractions 删除,xunit.assert→xunit.v3.assert,xunit.core→xunit.v3.core,extensibility 两包合并为 xunit.v3.extensibility.core;从已配置源查询并固定真实存在的最新稳定版本。为测试项目(非测试库)设置 OutputType=Exe,可放在共享 Directory.Build.props 或按项目名条件设置。保留原测试平台:若原用 YTest.MTP.XUnit2,则移除该 shim 并设 UseMicrosoftTestingPlatformRunner=true,不添加 xunit.runner.visualstudio;否则设 IsTestingPlatformApplication=false 保持 VSTest。删除 using Xunit.Abstractions。
条件性修复:async void 测试改为 async Task;CollectionBehavior、TestCaseOrderer、TestCollectionOrderer、TestFramework 等属性由两个字符串改为 System.Type;继承 FactAttribute/TheoryAttribute 的自定义属性需加入 CallerFilePath/CallerLineNumber 并转发给基类;继承 BeforeAfterTestAttribute 的 Before/After 需增加 IXunitTest 参数并传给 base;处理 xUnit1051 等新分析器警告;移除 Xunit.SkippableFact 并将 SkippableFact/Theory 改为 Fact/Theory、Skip.If→Assert.SkipWhen、Skip.IfNot→Assert.SkipUnless;Xunit.Combinatorial 1.x→2.x+、Xunit.StaFact 1.x 需与所选 xunit.v3 主版本兼容。net*-windows 项目在非 Windows 主机交叉构建时设 EnableWindowsTargeting=true。
限制与验证:不要猜测版本或更新无关包;中央包管理项目需回读确认 PackageVersion 持有版本、PackageReference 无版本、OutputType=Exe 生效。最终需构建并运行 dotnet test,报告源版本、运行器、包兼容集、改动文件及发现/通过/失败/跳过数量;仅编译成功不算完成。遇到权限或内容排除拒绝应停止并报告,不得绕过。未提供具体版本号、价格或平台支持细节。