Azure DevOps中xUnit VSTest Adapter无法发现.NET Framework 4.8测试问题
我在Azure DevOps中使用VSTest任务运行基于.NET Framework 4.8的xUnit测试,但xUnit.net VSTest Adapter无法发现任何测试。本地使用相同版本的vstest.console.exe运行则一切正常。
本地运行输出
Microsoft (R) Test Execution Command Line Tool Version 17.9.0 (x64) Copyright (c) Microsoft Corporation. All rights reserved. Starting test execution, please wait... A total of 1 test files matched the specified pattern. [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.5.7+8f2703126a (64-bit .NET Framework 4.8.4645.0) [xUnit.net 00:00:02.96] Discovering: <assembly>.UnitTests [xUnit.net 00:00:03.34] Discovered: <assembly>.UnitTests [xUnit.net 00:00:03.34] Starting: <assembly>.UnitTests <test output> [xUnit.net 00:00:17.86] Finished: <assembly>.UnitTests Total tests: 942 Passed: 924 Failed: 18 Total time: 18.2128 Seconds
DevOps运行输出
Microsoft (R) Test Execution Command Line Tool Version 17.9.0 (x64) Copyright (c) Microsoft Corporation. All rights reserved. vstest.console.exe "..." /Settings:"C:\a\_temp\t2c4p5qgmxl.tmp.runsettings" /Logger:"trx" /TestAdapterPath:"C:\a\1\s" Starting test execution, please wait... A total of 1 test files matched the specified pattern. [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.5.7+8f2703126a (64-bit .NET Framework 4.8.4614.0) [xUnit.net 00:00:00.39] Discovering: <assembly>.UnitTests [xUnit.net 00:00:00.79] Discovered: <assembly>.UnitTests [xUnit.net 00:00:00.80] Starting: <assembly>.UnitTests [xUnit.net 00:00:01.43] Finished: <assembly>.UnitTests No test is available in C:\a\1\s\<test assembly>. Make sure that test discoverer & executors are registered and platform & framework version settings are appropriate and try again.
我已尝试本地运行验证、对比程序集版本、增删相关程序集,当前依赖包列表如下:
<packages> <package id="AutoMapper" version="3.3.1" targetFramework="net48" /> <package id="Castle.Core" version="5.1.1" targetFramework="net48" /> <package id="FluentAssertions" version="6.10.0" targetFramework="net48" /> <package id="MassTransit" version="8.0.16" targetFramework="net48" /> <package id="MassTransit.Abstractions" version="8.0.16" targetFramework="net48" /> <package id="Microsoft.Bcl.AsyncInterfaces" version="7.0.0" targetFramework="net48" /> <package id="Microsoft.CodeCoverage" version="17.9.0" targetFramework="net48" /> <package id="Microsoft.Extensions.Configuration.Abstractions" version="7.0.0" targetFramework="net48" /> <package id="Microsoft.Extensions.DependencyInjection" version="7.0.0" targetFramework="net48" /> <package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="7.0.0" targetFramework="net48" /> <package id="Microsoft.Extensions.Diagnostics.HealthChecks" version="6.0.1" targetFramework="net48" /> <package id="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" version="6.0.1" targetFramework="net48" /> <package id="Microsoft.Extensions.FileProviders.Abstractions" version="7.0.0" targetFramework="net48" /> <package id="Microsoft.Extensions.Hosting.Abstractions" version="7.0.0" targetFramework="net48" /> <package id="Microsoft.Extensions.Logging.Abstractions" version="6.0.1" targetFramework="net48" /> <package id="Microsoft.Extensions.Options" version="6.0.0" targetFramework="net48" /> <package id="Microsoft.Extensions.Primitives" version="7.0.0" targetFramework="net48" /> <package id="Microsoft.NET.Test.Sdk" version="17.9.0" targetFramework="net48" /> <package id="Microsoft.TestPlatform.ObjectModel" version="17.8.0" targetFramework="net48" /> <package id="MongoDB.Bson" version="2.14.1" targetFramework="net48" /> <package id="Moq" version="4.18.4" targetFramework="net48" /> <package id="NuGet.Frameworks" version="6.5.0" targetFramework="net48" /> <package id="System.Buffers" version="4.5.1" targetFramework="net48" /> <package id="System.Collections.Immutable" version="1.5.0" targetFramework="net48" /> <package id="System.ComponentModel.Annotations" version="4.7.0" targetFramework="net48" /> <package id="System.Diagnostics.DiagnosticSource" version="6.0.0" targetFramework="net48" /> <package id="System.Memory" version="4.5.5" targetFramework="net48" /> <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" /> <package id="System.Reflection.Metadata" version="1.6.0" targetFramework="net48" /> <package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net48" /> <package id="System.Text.Encodings.Web" version="6.0.0" targetFramework="net48" /> <package id="System.Text.Json" version="6.0.7" targetFramework="net48" /> <package id="System.Threading.Channels" version="6.0.0" targetFramework="net48" /> <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" /> <package id="System.ValueTuple" version="4.5.0" targetFramework="net48" /> <package id="xunit" version="2.7.0" targetFramework="net48" /> <package id="xunit.abstractions" version="2.0.3" targetFramework="net48" /> <package id="xunit.assert" version="2.7.0" targetFramework="net48" /> <package id="xunit.core" version="2.7.0" targetFramework="net48" /> <package id="xunit.extensibility.core" version="2.7.0" targetFramework="net48" /> <package id="xunit.extensibility.execution" version="2.7.0" targetFramework="net48" /> <package id="xunit.analyzers" version="1.11.0" targetFramework="net48" /> <package id="xunit.runner.visualstudio" version="2.5.7" targetFramework="net48" developmentDependency="true" /> </packages>
可能的解决方法和诊断步骤
修正TestAdapterPath参数:DevOps运行时指定的
/TestAdapterPath:"C:\a\1\s"指向源码根目录,而xUnit测试适配器通常在测试项目的输出目录(如bin/Debug/net48)。修改VSTest任务的「Test adapter path」设置为测试程序集所在的输出目录,或者直接移除该参数,让系统自动查找适配器。同步.NET Framework补丁版本:本地用的是.NET Framework 4.8.4645.0,DevOps代理是4.8.4614.0,补丁版本差异可能引发兼容性问题。在DevOps代理上安装最新的.NET Framework 4.8累积更新,或在测试项目的
app.config中添加版本绑定配置。排查runsettings配置:DevOps使用的临时runsettings文件可能包含错误的过滤规则。导出本地使用的runsettings文件(如果有),在DevOps任务中指定使用该文件,或临时移除
/Settings参数测试。启用详细日志:在VSTest任务中添加
/Verbosity:detailed参数,获取测试发现的详细日志,排查是否存在程序集加载失败、依赖缺失等问题。同时可添加环境变量XUNIT_LOG=verbose启用xUnit的详细日志。验证输出目录文件完整性:在DevOps构建后添加「复制文件」或「发布构建工件」任务,保存测试项目输出目录的所有文件,对比本地输出目录,确认是否缺少
xunit.runner.visualstudio.dll等适配器文件或依赖包。统一测试平台版本:当前
Microsoft.NET.Test.Sdk版本为17.9.0,而Microsoft.TestPlatform.ObjectModel是17.8.0,版本不一致可能导致兼容问题。将Microsoft.TestPlatform.ObjectModel升级到17.9.0,保持版本统一。确认测试访问修饰符:确保所有测试类和测试方法都是
public,xUnit默认不会发现非公开的测试(本地能运行则此问题概率较低,但可快速验证)。
内容的提问来源于stack exchange,提问作者jsp

