xUnit中用于Collection Fixture的MessageSink不生成输出如何解决?
问题:xUnit使用Collection Fixture和IMessageSink无法输出诊断日志
我正尝试为xUnit测试添加诊断输出,因此结合使用了Collection Fixture和IMessageSink,代码如下:
using System; using Xunit; using Xunit.Abstractions; using Xunit.Sdk; namespace MessageSink { [Collection("My collection")] public class UnitTest1 { private readonly MyCollectionFixture _fixture; public UnitTest1(MyCollectionFixture fixture) { _fixture = fixture; } [Fact] public void Test1() { _fixture.Sink.OnMessage(new DiagnosticMessage("Hello World")); } } public class MyCollectionFixture : IDisposable { public MyCollectionFixture(IMessageSink sink) { Sink = sink; } public IMessageSink Sink { get; } public void Dispose() { } } [CollectionDefinition("My collection")] public class MyCollection : ICollectionFixture<MyCollectionFixture> { } }
我在测试项目内创建了如下xunit.runner.json配置:
{ "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json", "diagnosticMessages": true }
项目配置内容如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <Nullable>enable</Nullable> <IsPackable>false</IsPackable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" /> <PackageReference Include="xunit" Version="2.4.1" /> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="coverlet.collector" Version="3.0.2"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> </ItemGroup> <ItemGroup> <Content Include="xunit.runner.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> </Project>
我期望测试运行器的输出中包含Hello World内容,但实际输出为空。我已按照官方文档完成配置,参考的文档包括测试间共享上下文、输出捕获、配置文件相关说明,请问我的配置存在什么问题?
解决方案
问题1:诊断日志查看位置错误
你通过IMessageSink发送的DiagnosticMessage属于xUnit框架级诊断消息,不会输出到单条测试的独立输出面板。如果使用Visual Studio测试资源管理器,需要点击测试资源管理器顶部的「输出」按钮(而非单条测试右键的「查看输出」选项),才能看到全局诊断日志。
问题2:Visual Studio运行器未启用诊断消息转发
你使用的xunit.runner.visualstudio 2.4.3版本默认不会把xUnit的诊断消息转发到测试平台输出流,仅配置xunit.runner.json不会生效,需要额外添加.runsettings配置文件:
<?xml version="1.0" encoding="utf-8"?> <RunSettings> <Xunit> <DiagnosticMessages>True</DiagnosticMessages> </Xunit> </RunSettings>
配置完成后,在VS顶部菜单选择「测试」->「配置运行设置」->「选择解决方案范围的运行设置文件」,指定刚才创建的.runsettings文件即可。
替代方案:使用ITestOutputHelper输出测试日志
如果你只是需要在单条测试的输出中打印内容,不需要用到IMessageSink,直接在测试类构造函数注入ITestOutputHelper即可,输出的内容可以直接在单条测试的输出面板查看,无需额外配置:
[Collection("My collection")] public class UnitTest1 { private readonly ITestOutputHelper _output; public UnitTest1(ITestOutputHelper output) { _output = output; } [Fact] public void Test1() { _output.WriteLine("Hello World"); } }
内容的提问来源于stack exchange,提问作者mu88
相关产品推荐
相关产品推荐

