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

pen*_*ake 124 .net c# unit-testing console-application visual-studio

我在Visual Studio中有一个测试项目.我使用Microsoft.VisualStudio.TestTools.UnitTesting.

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

Console.WriteLine("Some foo was very angry with boo");
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

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

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

Tia*_*rte 163

有人在VS2013中评论了这个显然是新的功能.我一开始并不确定他的意思,但现在我知道,我认为它应该是它自己的答案.

我们可以正常使用Console.WriteLine并显示输出,但不是在Output窗口中,而是在我们单击测试详细信息中的"Output"后的新窗口中.

在此输入图像描述

  • 不幸的是,人们无法在该输出区域中选择任何文本进行复制和粘贴:(他们在想什么?! (6认同)
  • 在2017年,您必须选择运行的每个测试,然后单击输出 - 当您进行大量测试时,这不是非常有用.我希望将所有输​​出结合在一起 - 而不是在单独的窗口中. (5认同)
  • 我从来没有注意到这一点,它真的很有用 (4认同)
  • @ORMapper,右键单击"标准输出"区域,然后选择全部复制 (3认同)
  • 优秀的解决方 确认它在VS2015 Enterprise中有效. (2认同)
  • @ Ovi-WanKenobi尝试使用Console.Write输出内容 (2认同)
  • 这看起来非常有用,但我在VS 2017中看不到按钮. (2认同)
  • 请注意,如果您需要查看完整的输出,请右键单击并复制输出。 (2认同)
  • 2019 年没有看到产出。 (2认同)

Mic*_*eld 118

注意:以下原始答案适用于通过VS2012的任何VS版本.VS2013似乎不再具有"测试结果"窗口.相反,如果您需要特定于测试的输出,可以使用@ Stretch的建议Trace.Write()将输出写入"输出"窗口.


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

当您通过VS2010运行单元测试时,测试工具会重定向标准输出并将其存储为测试输出的一部分.您可以通过右键单击"测试结果"窗口并将名为"输出(StdOut)"的列添加到显示中来查看.这将显示写入stdout的任何内容.

可以使用P/Invoke手动打开控制台窗口,如@ sinni800所述.从阅读AllocConsole文档,似乎该功能将重置stdinstdout处理指向新的控制台窗口.(我对此并不是100%肯定;如果我已经重定向stdout到Windows以从我那里窃取它,那对我来说似乎有点不对,但我还没试过.)

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

  • 在VS2013中,如果您在控制台上写入,TestExplorer/Test/Summary上会有一个[Output]链接标签.单击它,您将获得所需的输出.等待?你还想调用Console.ReadLine()?? (5认同)
  • 在V2017(社区)中,进入“测试资源管理器”,选择列表中的测试结果项,然后点击另一个窗口(测试结果窗口?)上的“输出”链接。由于它可能会被截断,请使用“全部复制”并从其他地方过去。 (3认同)
  • 对我来说,Michael的评论说我需要考虑的一切:"当你通过VS2010运行单元测试时,标准输出被测试工具重定向并存储为测试输出的一部分." (2认同)
  • Trace也不起作用,我正在使用VS 2013. (2认同)

Dmi*_*lov 34

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

System.Diagnostics.Debug.WriteLine("Matrix has you...");
Run Code Online (Sandbox Code Playgroud)

希望有所帮助

  • 它不写在我的VS上 (7认同)
  • @William如果您调试测试,则会显示它,但如果您不调试而直接运行它,则不会显示。 (2认同)

Won*_*ane 27

如上所述,单元测试旨在无需交互即可运行.

但是,您可以像任何其他代码一样调试单元测试.最简单的方法是使用"测试结果"选项卡中的"调试"按钮.

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

实际上,Tracepoints允许您写入"输出"窗口(或者更准确地说,写入标准输出).(可选)您可以继续运行,也可以像常规断点一样停止运行.这为您提供了所需的"功能",无需重新构建代码,也无需填写调试信息.

只需添加断点,然后右键单击该断点即可.选择"When Hit ..."选项: 当命中选项

这会打开对话框: 当Breakpoint被击中时

有几点需要注意:

  1. 请注意,断点现在显示为菱形,而不是球体,表示跟踪点
  2. 您可以像{this}一样将变量的值括起来输出变量的值.
  3. 取消选中"继续执行"复选框,使代码在此行中断,就像任何常规断点一样
  4. 您可以选择运行宏.请小心 - 您可能会产生有害的副作用.

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


yoy*_*oyo 21

有几种方法可以在C#中编写Visual Studio单元测试的输出:

  • Console.Write - 当您在"测试资源管理器"中选择测试并单击"输出"链接时,Visual Studio测试工具将捕获此信息并显示它.难道不是在Visual Studio输出窗口显示当运行或调试单元测试(可以说这是一个bug).
  • Debug.Write - Visual Studio测试工具将捕获它并在测试输出中显示它.调试单元测试时,是否出现在Visual Studio输出窗口中,除非将Visual Studio调试选项配置为将输出重定向到立即窗口.如果您只是在没有调试的情况下运行测试,则输出(或立即)窗口中不会出现任何内容.默认情况下,仅在Debug构建中可用(即,在定义DEBUG常量时).
  • Trace.Write - Visual Studio测试工具将捕获此信息并在测试输出中显示它.调试单元测试时出现在Visual Studio输出(或立即)窗口中(但不是在没有调试的情况下运行测试时).默认情况下,在Debug和Release版本中都可用(即,定义TRACE常量时).

在Visual Studio 2013 Professional中确认.


Stu*_*rla 6

您可以使用

Trace.WriteLine() 
Run Code Online (Sandbox Code Playgroud)

在调试unittest时写入Output窗口.


小智 6

在 Visual Studio 2017 中,“TestContext”不会显示到测试资源管理器的输出链接。

但是,Trace.Writeline() 显示了输出链接。