使用 Visual Studio 测试 运行 的 xUnit 测试 运行 的输出未显示在输出 window 中

Output from xUnit tests run with Visual Studio test runner not shown in Output window

我创建了一个名为 FooBarBaz 的全新 .NET Core Class 库项目。然后我使用包管理器控制台 运行:

这是我添加的唯一代码:

using Xunit;
using Xunit.Abstractions;

namespace FooBarBaz
{
    public class Class1
    {
        private readonly ITestOutputHelper output;

        public Class1(ITestOutputHelper output)
        {
            this.output = output;
            output.WriteLine("OUTPUT FROM MY CONSTRUCTOR");
        }

        [Fact]
        public void SmokeTest()
        {
            output.WriteLine("OUTPUT FROM MY TEST");
            Assert.True(true);
        }
    }
}

这直接基于 the xUnit.net documentation example。我知道文档继续谈论 "Message Sinks" 等等,但我可以发誓我在 Output [=49= 中看到消息 ],共 visual studio。在我的实际项目中,这似乎只是不稳定地工作。

我知道我可以在选择测试后单击 "Output" 超链接并查看它,但这只是额外的一步,而且输出也没有等宽字体(我想有)。

看到这个:

如何配置 xUnit 以在输出 window 中提供输出 ?

在输入问题并进一步摆弄之后,弹出了完全晦涩的解决方案:仅测试 失败 显示 ITestOutputHelper在Output中输出window.

尝试将断言更改为 Assert.True(false);,您将得到:

不确定为什么这是默认设置,或者您将如何更改它。

Jeroen 写的关于 ITestOutputHelper 的内容是正确的,因此您不能将其用于“实时”消息。但我有一个解决方法:

如果你正在调试并激活“调试”模式,没有什么能阻止你做类似

的事情

loopCount++;
System.Diagnostics.Debug.WriteLine($"Processing Entries ({loopCount} of {loopMax}) ...");

这将显示在“调试”中 window(即在输出 window 中有一个下拉菜单,您需要在其中 select“显示调试的输出”)。它立即出现,非常适合长 运行 循环等

别担心,这些消息只会出现在“调试”配置中。要禁用它们,select“释放”,它们将不再出现 - 因此打开或关闭它们很容易。

您还可以编写辅助函数,例如:

private void Print(string msg, string test = "") 
{ 
    Debug.WriteLine($"{nameof(NameOfTestClass)}{test}: {msg}"); 
    output?.WriteLine(msg); 
}

这将实时写入调试控制台,但同时写入测试运行器的输出space。

你可以在你的事实和理论中使用它,比如

Print("Something happened");

Print("Something happened", "-Test1");

完整的测试 class 看起来像:

using LiveOut = System.Diagnostics.Debug;
// using LiveOut = System.Console;
public class Test_Class
{

    ITestOutputHelper Output;
    public Test_Class(ITestOutputHelper _output)
    {
        Output = _output;
    }

    private void Print(string msg, string test = "") 
    {
        LiveOut.WriteLine($"{nameof(Test_Class)}{test}: {msg}");
        Output?.WriteLine(msg);
    }

    [Fact]
    void Test_Xunit()
    {
        void _print(string msg) => Print(msg, $"-{nameof(Test_Xunit)}");

        for (int i = 1; i < 100; i++)
        {
            _print(i.ToString());
            Assert.True(i > 0);
            Thread.Sleep(20);
        }
    }

}

在这种情况下,您可以在两个使用命令之间进行选择:

using LiveOut = System.Diagnostics.Debug;

using LiveOut = System.Console;

根据您的需要,您将在调试 window 或控制台 window.

上获得输出