如何写入控制台。在执行 MSTest 测试期间出局

背景:
我们有一些用户报告的问题与文件上传功能在我们的网络应用程序。它只是偶尔发生,没有任何特殊的模式。我们已经尝试了很长一段时间,添加调试信息的任何地方,我们可以认为它可能有帮助,爬行的日志等,但我们还没有能够重现或弄清楚它。

问题:
我现在试图通过使用 MSTest 和 WatiN 重复这个操作,这个操作应该会失败很多次(几百次)。为了了解测试在循环中走了多远,我想打印一些内容,比如:

Console.WriteLine(String.Format("Uploaded file, attempt {0} of {1}", i, maxUploads));

但是,这不会出现在“输出”窗口中。现在我知道您将在测试结果中获得控制台输出(以及您从 Debug.Writeline等输出的内容) ,但是在 之后测试完成之前这是不可用的。由于我的测试有数百次重复,可能需要相当长的时间,我想知道它已经走了多远。

问题:
有没有一种方法,我可以得到控制台输出在输出窗口 期间测试执行?

138219 次浏览

没有出现控制台输出是因为后端代码没有在测试的上下文中运行。

您最好使用 Trace.WriteLine(InSystem.Diagnostics) ,然后添加一个跟踪侦听器,该侦听器将写入文件。

来自 MSDN 的这个主题展示了这样做的一种方法。


根据马蒂 · 尼尔和戴夫 · 安德森的评论:

using System;
using System.Diagnostics;


...


Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
// or Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Hello World");

您最好设置一个单独的测试,并根据这个测试创建一个性能测试。通过这种方式,您可以使用默认工具集监视进度。

我找到了自己的解决办法。我知道 Andras 的答案可能是与 MSTEST 最一致的,但是我不想重构我的代码。

[TestMethod]
public void OneIsOne()
{
using (ConsoleRedirector cr = new ConsoleRedirector())
{
Assert.IsFalse(cr.ToString().Contains("New text"));
/* call some method that writes "New text" to stdout */
Assert.IsTrue(cr.ToString().Contains("New text"));
}
}

一次性 ConsoleRedirector的定义是:

internal class ConsoleRedirector : IDisposable
{
private StringWriter _consoleOutput = new StringWriter();
private TextWriter _originalConsoleOutput;
public ConsoleRedirector()
{
this._originalConsoleOutput = Console.Out;
Console.SetOut(_consoleOutput);
}
public void Dispose()
{
Console.SetOut(_originalConsoleOutput);
Console.Write(this.ToString());
this._consoleOutput.Dispose();
}
public override string ToString()
{
return this._consoleOutput.ToString();
}
}

使用 Debug.WriteLine。这将立即在 Output窗口中显示您的消息。唯一的限制是必须在 Debug模式下运行测试。

[TestMethod]
public void TestMethod1()
{
Debug.WriteLine("Time {0}", DateTime.Now);
System.Threading.Thread.Sleep(30000);
Debug.WriteLine("Time {0}", DateTime.Now);
}

输出

enter image description here

我也有同样的问题,我在“运行”测试。如果我改为“ Debug”测试,那么 Debug 输出就会像其他跟踪和控制台一样显示正常。 但是我不知道如果你“运行”测试,如何看到输出。

它不是控制台,但它在输出面板中。

public class Test
{
public TestContext TestContext { get; set; }


[TestMethod]
public void Foo()
{
TestContext.WriteLine("Hello World");
}
}