使用 Visual Studio 测试 运行 的 xUnit 测试 运行 的输出未显示在输出 window 中
Output from xUnit tests run with Visual Studio test runner not shown in Output window
我创建了一个名为 FooBarBaz
的全新 .NET Core Class 库项目。然后我使用包管理器控制台 运行:
Install-Package xunit xunit
Install-Package xunit xunit.runners.visualstudio
这是我添加的唯一代码:
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.
上获得输出
我创建了一个名为 FooBarBaz
的全新 .NET Core Class 库项目。然后我使用包管理器控制台 运行:
Install-Package xunit xunit
Install-Package xunit xunit.runners.visualstudio
这是我添加的唯一代码:
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.
上获得输出