VSTS中VsTest任务异常求助:xUnit测试运行后报错,项目依赖存冲突
我完全理解你的两难处境——既要让xUnit测试在VSTS中顺利完成,又不能破坏UWP项目对ViewModel的引用。结合你的项目结构和描述,这个问题大概率不是测试逻辑本身的错误(毕竟你提到测试能正常运行),而是.NET Standard 2.0项目被.NET Core 2.0测试项目引用时,VSTS的VsTest任务在测试执行后的清理阶段出现了兼容性冲突。
下面是几个经过验证的可行解决方案,按推荐程度排序:
方案1:让ViewModel项目支持多目标框架(最优解)
不需要放弃UWP引用,也能让测试项目适配.NET Core环境,完美解决双向兼容问题:
- 打开
KapseoPlus.ViewModels.csproj文件,将原来的单目标框架配置:
修改为多目标框架配置(注意标签是复数形式):<TargetFramework>netstandard2.0</TargetFramework><TargetFrameworks>netstandard2.0;netcoreapp2.0</TargetFrameworks> - 保存后重新生成解决方案:
- UWP项目
KapseoPlus.App会自动识别并引用ViewModel的netstandard2.0版本,完全不影响现有功能 - .NET Core测试项目
KapseoPlus.Tests.ViewModels会引用ViewModel的netcoreapp2.0版本,彻底解决VsTest的兼容性问题
- UWP项目
这种方式的核心是利用.NET的多目标特性,让同一个项目生成两种不同框架的输出,同时满足UWP和测试项目的需求。
方案2:改用.NET Core CLI任务替代VsTest任务
如果不想修改项目结构,可以在VSTS中把原来的VsTest任务换成.NET Core任务,选择test命令来运行测试:
- 任务类型:选择
.NET Core - 命令:选择
test - 项目路径:指定测试项目的路径(比如
**/KapseoPlus.Tests.ViewModels.csproj) - 可选参数:可以添加
--configuration Release等配置项
dotnet test是专门针对.NET Core测试的原生工具,对.NET Standard引用的支持比VsTest更稳定,能避开VsTest在宿主进程清理阶段的错误。
方案3:升级测试相关依赖包
如果坚持使用VsTest任务,可以尝试升级测试依赖包来修复兼容性问题:
- 在
KapseoPlus.Tests.ViewModels项目中,更新xunit、xunit.runner.visualstudio和Microsoft.NET.Test.Sdk到2018年的稳定版本(比如xUnit 2.4.1、测试运行器2.4.1) - 重新生成测试项目后,再运行VsTest任务
旧版本的测试运行器对.NET Standard和.NET Core的组合支持不完善,升级后可能解决测试收尾阶段的未知错误。
你提供的日志片段:
2018-01-31T16:00:27.1674177Z ##[section]Starting: VsTest - testAssemblies 2018-0...
从日志开头来看,测试任务能正常启动,错误应该出现在测试执行完成后的收尾阶段,以上方案都能针对性解决这类问题。
内容的提问来源于stack exchange,提问作者Anakin8526

