我可以在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
文档看来,该函数将重置stdin
和stdout
句柄以指向新的控制台窗口。 (我对此并不是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“当击中…”选项:
这引起了对话:
有几件事要注意:
- 请注意,断点现在显示为菱形,而不是球形,表示一个跟踪点
- 你可以像{this}那样输出一个variables的值。
- 取消勾选“继续执行”checkbox,让代码在这一行中断开,就像任何常规的断点一样
- 您可以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()也可以使用。