【问题标题】:How to write to Console.Out during execution of an MSTest test如何在执行 MSTest 测试期间写入 Console.Out
【发布时间】:2011-06-20 12:30:27
【问题描述】:

上下文:
我们有一些用户报告我们的 Web 应用程序中的文件上传功能存在问题。它只是偶尔发生,没有任何特殊模式。很长一段时间以来,我们一直在努力解决这个问题,在我们认为可能有帮助的任何地方添加调试信息,爬取日志等,但我们无法重现或解决它。

问题:
我现在正试图通过使用 MSTest 和 WatiN 来重复这个应该失败很多次(几百次)的操作。为了了解测试在循环中的进展情况,我想打印如下内容:

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

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

问题:
有没有办法在测试执行期间在输出窗口中获取控制台输出?

【问题讨论】:

标签: c# console mstest watin


【解决方案1】:

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

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

This topic from MSDN 显示了这样做的方法。


根据 Marty Neal 和 Dave Anderson 的 cmets:

using System;
using System.Diagnostics;

...

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

【讨论】:

  • 基本上,Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
  • 嗯,我发现@Martin Neal 的建议将Trace.WriteLine()Console.WriteLine() 输出发送到测试结果视图不是 i> 输出视图。 (请注意,在 Test Results View 中,可能需要通过右键单击并选择 Add/Remove Columns 来添加 Output (Stdout) 列。 ...)但是,也许我仍然没有在 Output View 中看到输出,这意味着我遗漏了一些东西......
  • Trace.Listeners.Add(new ConsoleTraceListener()); 就足够了,然后在输出窗口中显示来自调试的输出。
  • 我很难在 VS2017 中实际找到输出... TestExplorer 窗口 -> 单击单个测试 -> 如果测试有输出,则在经过时间下的详细信息窗口中有单词“输出”是指向新窗口的链接。
  • 如果您使用的是 Xunit,只需通过 ctor 获取 ITestOutputHelper 并在其上调用 WriteLine。在我发现如何在集成测试期间编写之前花了一段时间,希望这对某人有所帮助。
【解决方案2】:

使用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);
}

输出

【讨论】:

  • 需要using System.Diagnostics;
  • 不要使用 DateTime.Now。最好使用秒表 (msdn.microsoft.com/en-us/library/…)
  • 我无法让它工作。当我运行测试时,输出窗口立即切换到构建,并且没有任何内容发送到调试。你的想法?
  • @InteXX 确保您单击“调试测试”,而不是“运行测试”。它对我有用
  • @JohnHenckel:明白了。谢谢。会这样做。事实上,沙利亚索斯的回答完全正确;不知道我是怎么错过的。
【解决方案3】:

我找到了自己的解决方案。我知道 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();
    }
}

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,我正在“运行”测试。如果我改为“调试”测试,则调试输出与所有其他跟踪和控制台一样显示得很好。 如果您“运行”测试,我不知道如何查看输出。

    【讨论】:

    • 我可以在调试测试时使用System.Diagnostics.Debug.WriteLine 来展示一些东西,但是你如何让Console.WriteLine 工作呢?对我来说,这不会出现在正常(实时更新)的输出中。
    • 在运行测试时您有没有找到任何查看输出的方法?
    【解决方案5】:

    您最好设置一个测试并根据该测试创建一个性能测试。这样您就可以使用默认工具集监控进度。

    【讨论】:

    • "这样您就可以使用默认工具集监控进度。" - 如何?我看到的问题正是,一旦测试运行,它就是一个黑匣子,我只能在测试完成运行后看到输出(我在测试运行时逐渐编写),在 输出窗口。
    猜你喜欢
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2021-06-27
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多