ADO中VSTest任务能否同时运行.NET Framework与.NET 6测试?
两类测试能否共存?
可以共存,但需要针对不同目标框架的测试项目做差异化配置,避免运行时依赖冲突导致的测试发现失败。
具体解决方法
拆分VSTest任务,分框架执行
将原有的单个VSTest v2任务拆分为两个独立任务:- 第一个任务专门处理.NET 4.7.2测试:在任务配置中,将测试平台版本设为VS 2022,通过测试程序集筛选规则(比如指定路径包含
net472的程序集)或者设置TargetFramework参数为net472,确保只加载.NET Framework的测试程序集。 - 第二个任务处理.NET 6测试:同样使用VS 2022测试平台,筛选
net6.0路径下的测试程序集,或设置TargetFramework为net6.0。
拆分后VSTest会分别为不同框架加载对应的运行时环境,避免System.Runtime这类跨框架组件的加载冲突。
- 第一个任务专门处理.NET 4.7.2测试:在任务配置中,将测试平台版本设为VS 2022,通过测试程序集筛选规则(比如指定路径包含
隔离测试程序集输出目录
确保两类测试项目的编译输出目录完全分离,防止dll互相覆盖或混合。在每个测试项目的.csproj文件中添加配置:<PropertyGroup> <OutputPath>bin\$(Configuration)\$(TargetFramework)</OutputPath> </PropertyGroup>这样.NET 4.7.2的测试程序集会输出到
bin\Debug\net472,.NET 6的输出到bin\Debug\net6.0,后续VSTest任务可以通过路径精准筛选。针对.NET Framework项目调整Test SDK版本
最新版的Microsoft.NET.Test.SDK(如17.10.0)对.NET Framework的兼容性可能存在适配问题。可以给.NET 4.7.2的测试项目单独指定稍低版本的SDK(比如17.5.0),而.NET 6项目保留当前版本,同时保持MSTest.Adapter和MSTest.Framework版本在所有项目中一致。使用RunSettings文件区分框架
创建两个RunSettings文件,分别对应不同框架:- 针对.NET 4.7.2的
Net472.runsettings:<RunSettings> <RunConfiguration> <TargetFrameworkVersion>net472</TargetFrameworkVersion> </RunConfiguration> </RunSettings> - 针对.NET 6的
Net6.runsettings:<RunSettings> <RunConfiguration> <TargetFrameworkVersion>net6.0</TargetFrameworkVersion> </RunConfiguration> </RunSettings>
在对应的VSTest任务中指定各自的RunSettings文件,强制测试平台使用对应框架的上下文加载测试。
- 针对.NET 4.7.2的
验证代理环境依赖
确保Azure DevOps代理机器上已完整安装:- .NET 6 SDK
- .NET Framework 4.7.2目标包
- Visual Studio 2022测试平台组件
缺失必要的运行时组件会导致程序集加载失败,甚至超时。
为什么本地运行正常?
本地Visual Studio会自动识别测试项目的目标框架,为每个框架启动独立的测试运行上下文,自动隔离.NET Framework和.NET 6的依赖环境,因此不会出现冲突。而Azure DevOps的VSTest任务默认会尝试在同一个上下文加载所有匹配的测试程序集,从而触发依赖加载冲突。
内容的提问来源于stack exchange,提问作者Chris Martin

