我可以在unit testing中写入控制台吗? 如果是,为什么控制台窗口不能打开?

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

我在我的一个unit testing中join这一行:

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

当我运行testing,testing通过,但控制台窗口根本不打开。

有没有办法使控制台窗口可以通过unit testing进行交互?

注意:下面的原始答案适用于任何版本的VS到VS2012。 VS2013不再有testing结果窗口。 相反,如果您需要特定于testing的输出,则可以使用@ Stretch对Trace.Write()的build议来写入输出以写入输出窗口。


Console.Write方法不会写入“控制台” – 写入任何连接到正在运行的进程的标准输出句柄的内容。 同样, Console.Read读取来自任何连接到标准input的input。

当您通过VS2010运行unit testing时,标准输出将被testing用具redirect,并作为testing输出的一部分进行存储。 您可以通过右键单击“testing结果”窗口并将名为“输出(StdOut)”的列添加到显示中来查看。 这将显示写入标准输出的任何东西。

可以手动打开一个控制台窗口,使用P / Invoke作为@ sinni800说。 从阅读AllocConsole文档看来,该函数将重置stdinstdout句柄以指向新的控制台窗口。 (我对此并不是100%肯定的;如果我已经将Windowsredirect到stdout来从我那里窃取它,似乎有点不对劲,但是我没有尝试过。

但总的来说,我认为这是一个坏主意。 如果所有你想要使用控制台是倾倒更多关于你的unit testing的信息,那么输出就是为你准备的。 继续使用Console.WriteLine ,完成后在“testing结果”窗口中检查输出结果。

有人在VS2013中评论了这个显然是新的function。 我不确定他一开始是什么意思,但现在我知道了,我认为这是它自己的答案。

我们可以正常使用Console.WriteLine,输出显示在输出窗口中,但是在testing细节中单击“输出”后,会显示在新窗口中。

在这里输入图像说明

如前所述,unit testing的devise运行时没有交互。

但是,您可以debuggingunit testing,就像其他任何代码一样。 最简单的方法是使用“testing结果”选项卡中的“debugging”button。

能够debugging意味着能够使用断点。 因此,能够使用断点意味着能够使用Tracepoints ,这在我每天的debugging中都非常有用。

本质上,跟踪点允许您写入输出窗口(或更准确地说,标准输出)。 或者,您可以继续运行,也可以像常规断点那样停止。 这给你所要求的“function”,而不需要重新编译你的代码,也不用填写debugging信息。

只需添加一个断点,然后右键单击该断点即可。 select“当击中…”选项: 当点击选项

这引起了对话: 当断点被击中时

有几件事要注意:

  1. 请注意,断点现在显示为菱形,而不是球形,表示一个跟踪点
  2. 你可以像{this}那样输出一个variables的值。
  3. 取消勾选“继续执行”checkbox,让代码在这一行中断开,就像任何常规的断点一样
  4. 您可以select运行macros。 请小心 – 您可能会造成有害的副作用。

请参阅文档了解更多详情。

你可以使用这一行来写入Visual Studio的输出窗口 :

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

希望有所帮助

有几种方法可以在C#中使用Visual Studiounit testing编写输出:

  • Console.Write – 在testing资源pipe理器中selecttesting并单击输出链接时,Visual Studiotesting工具将捕获并显示它。 运行或debuggingunit testing时, 不会在Visual Studio输出窗口中显示(可以说这是一个错误)。
  • Debug.Write – Visual Studiotesting工具将捕获并显示在testing输出中。 除非Visual Studio Debugging选项configuration为将输出redirect到立即窗口,否则在debuggingunit testing时出现在Visual Studio输出窗口中。 如果您只是在不debugging的情况下运行testing,则输出(或立即)窗口中不会显示任何内容。 默认情况下,仅在Debug版本中可用(即,定义了DEBUG常量时)。
  • Trace.Write – Visual Studiotesting工具将捕获并显示在testing输出中。 在debuggingunit testing时,不会出现在Visual Studio输出(或立即)窗口中(但不是在没有debugging的情况下简单地运行testing时)。 在Debug和Release版本中默认都是可用的(也就是说,当定义TRACE常量时)。

在Visual Studio 2013专业版中确认。

您可以使用

 Trace.WriteLine() 

在debuggingunittest时写入输出窗口。

首先,unit testing在devise上应该是完全没有交互的。

除此之外,我不认为有可能被想到。

即使当前的应用程序是GUI应用程序,您也可以使用AllocConsole P / Invoke来尝试黑客入侵,这将打开一个控制台。 Console类将发布到现在打开的控制台。

这完全不是一个解决scheme,而是一本书的方法

由Roy Osherove进行unit testing的艺术

我们需要存根来打破这些依赖关系,比如写入FileSystem或写入事件日志或写入控制台 –

存根可以传入主类,如果存根不为空,则写入存根。 但是它可以改变api(像现在的构造函数有一个存根作为参数)。 另一种方法是inheritance和创build一个模拟对象。 这在下面描述。

 namespace ClassLibrary1 { // TO BE TESTED public class MyBusinessClass { public MyBusinessClass() { // Constructor } public virtual void MyBusinessMethod(string s) { // this needs to be unit tested Console.WriteLine(s); } } public class ConsoleStub { private string textToBeWrittenInConsole; public string GetLastTextWrittenInConsole { get { return this.textToBeWrittenInConsole; } } public void WriteLine(string text) { this.textToBeWrittenInConsole = text; } } public class MyBusinessClassMock :MyBusinessClass { private ConsoleStub consoleStub; public MyBusinessClassMock() { // Constructor } public MyBusinessClassMock(ConsoleStub stub) { this.consoleStub = stub; } public override void MyBusinessMethod(string s) { // if MOCK is not an option then pass this stub // as property or parameter in constructor // if you do not want to change the api still want // to pass in main class then , make it protected and // then inherit it and make just a property for consoleStub base.MyBusinessMethod(s); this.consoleStub.WriteLine(s); } } [TestClass] public class ConsoleTest { private ConsoleStub consoleStub; private MyBusinessClassMock mybusinessObj [TestInitialize] public void Initialize() { consoleStub = new ConsoleStub(); mybusinessObj = new MyBusinessClassMock(consoleStub); } [TestMethod] public void TestMyBusinessMethod() { mybusinessObj.MyBusinessMethod("hello world"); Assert.AreEqual(this.consoleStub.GetLastTextWrittenInConsole,"hello world" ); } } } 

在Visual Studio 2017中,“TestContext”不显示输出链接到testing资源pipe理器。 但是,Trace.Writeline()显示输出链接。

Debug.WriteLine()也可以使用。