我可以在单元测试中写入控制台吗? 如果可以,为什么控制台窗口不打开?

我在 VisualStudio 中有一个测试项目。我使用 Microsoft.VisualStudio.TestTools. UnitTest

我在我的一个单元测试中添加了这一行:

Console.WriteLine("Some foo was very angry with boo");
Console.ReadLine();

当我运行测试时,测试通过了,但是控制台窗口根本没有打开。

是否有办法使控制台窗口可以通过单元测试进行交互?

217591 次浏览

首先,通过 设计,单元测试应该在没有交互的情况下完全运行。

除此之外,我认为没有任何可能性。

您可以尝试使用 AllocConsole P/Invoke进行黑客攻击,即使您当前的应用程序是 GUI 应用程序,它也会打开控制台。然后,Console类将发送到现在打开的控制台。

注意: 下面的原始答案应该适用于直到 VisualStudio2012的任何版本的 VisualStudio。VisualStudio2013似乎不再具有“测试结果”窗口。相反,如果需要特定于测试的输出,可以使用@Stretch 的 Trace.Write()建议将输出写入 Output 窗口。


Console.Write方法不写入“控制台”——它写入连接到正在运行的进程的标准输出句柄的任何内容。类似地,Console.Read从连接到标准输入的任何内容中读取输入。

通过 VisualStudio2010运行单元测试时,标准输出由测试工具重定向,并作为测试输出的一部分存储。您可以通过右键单击 Test Results 窗口并将名为“ Output (StdOut)”的列添加到显示中来看到这一点。这将显示写入标准输出的任何内容。

您可以使用 请求作为 Sinni800说手动打开控制台窗口。从阅读 AllocConsole文档可以看出,该函数将重置 stdinstdout句柄以指向新的控制台窗口。(我不能100% 肯定这一点; 如果我已经为 Windows 重定向了 stdout来窃取它,那么对我来说似乎是错误的,但我还没有尝试过。)

但是,总的来说,我认为这是一个坏主意; 如果您只想使用控制台来转储关于单元测试的更多信息,那么输出就在那里。保持使用 Console.WriteLine的方式,并在完成后检查“测试结果”窗口中的输出结果。

如前所述,单元测试被设计为在没有交互的情况下运行。

但是,您可以进行 调试单元测试,就像任何其他代码一样。最简单的方法是使用 Test Results 选项卡中的 调试按钮。

能够调试意味着能够使用断点。因此,能够使用断点意味着能够使用 跟踪点(Tracepoints),我发现它在每天的调试中非常有用。

实际上,Tracepoint 允许您写入 输出窗口(或者,更准确地说,写入标准输出)。您可以选择继续运行,也可以像常规断点那样停止。这就提供了您所要求的“功能”,而不需要重新构建代码,或者用调试信息填充代码。

只需添加一个断点,然后右键单击该断点,选择“ When Hit...”选项:

When hitting option

这就引出了一个对话:

When a breakpoint is hit

有几点需要注意:

  1. 注意,现在断点显示为菱形,而不是球形,表示跟踪点
  2. 可以通过像{ this }这样封闭变量来输出变量的值。
  3. 取消选中“继续执行”复选框,使代码中断位于此行上,就像任何常规断点一样
  4. 您可以选择运行宏。请小心-您可能会造成有害的副作用。

有关详细信息,请参阅文档。

您可以使用此行写入 VisualStudio 的 输出窗口:

System.Diagnostics.Debug.WriteLine("Matrix has you...");

必须在调试模式下运行。

你可以用

Trace.WriteLine()

在调试单元测试时写入 输出窗口。

也可以使用 Debug. WriteLine ()。

用 C # 编写 Visual Studio 单元测试的输出有几种方法:

  • 控制台。Write-VisualStudio 测试工具将捕获这个属性,并在您在测试资源管理器中选择测试并单击 Output 链接时显示它。在运行或调试单元测试时,没有是否显示在 VisualStudio 输出窗口中(可以说这是一个 bug)。
  • 调试。Write-VisualStudio 测试工具将捕获这一点并在测试输出中显示出来。除非将 VisualStudio 调试选项配置为将输出重定向到“即时”窗口,否则在调试单元测试时,将在 VisualStudio 输出窗口中显示 是的。如果只是运行测试而不进行调试,则“输出”(或“即时”)窗口中不会显示任何内容。默认情况下,只能在调试版本(即定义 DEBUG 常量时)中使用。
  • 崔思。Write-VisualStudio 测试工具将捕获这一点并在测试输出中显示出来。在调试单元测试时(但不是在没有调试的情况下简单地运行测试时) ,在 VisualStudio 输出(或即时)窗口中出现 是的。默认情况下,在调试版本和发布版本中都可用(也就是说,当定义 TRACE 常量时)。

在 VisualStudio2013专业版中确认。

有人对 VisualStudio2013中这个明显的新功能进行了评论。一开始我不确定他是什么意思,但现在我知道了,我觉得它应该有自己的答案。

我们可以用控制台。通常情况下,WriteLine 和输出都会显示出来,只不过不是在 Output 窗口中,而是在测试详细信息中单击“ Output”之后的新窗口中。

Enter image description here

在 VisualStudio2017中,“ TestContext”不会将输出链接显示到测试资源管理器中。

但是,Trace.Writeline ()显示 Output 链接。

Mac 的 Visual Studio

在 VisualStudioforMac 上没有其他解决方案可用

如果您正在使用 NUnit,您可以添加一个小的 .NET 控制台计划到您的解决方案,然后参考项目,您希望测试的 参考文献的新的 控制台计划

无论你在你的 [Test()]方法中做什么,都可以在控制台应用的 Main中以这种方式完成:

class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("Console");


// Reproduce the unit test
var classToTest = new ClassToTest();
var expected = 42;
var actual = classToTest.MeaningOfLife();
Console.WriteLine($"Pass: {expected.Equals(actual)}, expected={expected}, actual={actual}");
}
}

在这些情况下,您可以在代码中自由地使用 Console.WriteConsole.WriteLine

恕我直言,在大多数情况下,输出信息仅与 测试失败病例相关。下面的格式是我自己做的,你也可以自己做。这将显示在 VisualStudio 测试资源管理器窗口本身中。

如何在 VisualStudio 测试资源管理器窗口中引发此消息?

这样的示例代码应该可以工作:

if(test_condition_fails)
Assert.Fail(@"Test Type: Positive/Negative.
Mock Properties: someclass.propertyOne: True
someclass.propertyTwo: True
Test Properties: someclass.testPropertyOne: True
someclass.testPropertyOne: False
Reason for Failure: The Mail was not sent on Success Task completion.");

您可以有一个单独的类专门为您处理这个问题。

我有一个更简单的解决方案(出于一系列懒惰的原因,我最近自己使用了这个方案)。将此方法添加到您正在使用的类中:

public static void DumbDebug(string message)
{
File.WriteAllText(@"C:\AdHocConsole\" + message + ".txt", "this is really dumb. I wish Microsoft had more obvious solutions to its solutions problems.");
}

然后... 打开 AdHocConsole 目录,按照创建的时间进行排序。请确保当您添加您的“打印声明”。不过,它们是截然不同的,否则就会有杂耍。