如何在执行MSTest测试期间写入Console.Out


113

上下文:
我们有一些用户报告我们的Web应用程序中的文件上传功能存在问题。它仅偶尔发生,并且没有任何特殊模式。很长时间以来,我们一直在努力寻找解决方案,在我们认为可能会有所帮助的任何地方添加调试信息,对日志进行爬网等,但是我们无法复制或解决它。

问题:
我现在正尝试通过使用MSTest和WatiN来重复该操作,该操作应多次失败(数百次),以重现此错误。只是为了了解测试已经循环了多远,我想打印出以下内容:

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

但是,它不会出现在“输出”窗口中。现在,我知道您将在测试结果中获得控制台输出(以及从其他输出中获得的输出Debug.Writeline),但这要等到测试完成才能使用。而且由于我的测试需要数百次重复,因此可能需要花费一些时间,所以我想知道测试已经进行了多长时间。

问题:测试执行过程
中,有什么方法可以在“输出”窗口获得控制台输出?


如果您正在寻找一种打印到测试结果输出的方式: stackoverflow.com/a/4787047/621690
Risadinha

Answers:


110

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

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

来自MSDN的主题显示了一种实现方法。


根据Marty Neal和Dave Anderson的评论:

using System;
using System.Diagnostics;

...

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

72
所以基本上, Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Marty Neal

7
嗯,我发现@Martin Neal的建议将两者Trace.WriteLine()Console.WriteLine()输出都发送到了“ 测试结果视图”而不是输出视图”。(并且请注意,在“ 测试结果视图”中,可能有必要通过右键单击并选择“ 添加/删除列...”来添加“ 输出(Stdout)”列。)但是,也许我仍然没有在“ 输出”中看到输出视图意味着我丢失了某些东西……
DavidRR 2014年

2
Trace.Listeners.Add(new ConsoleTraceListener());足够,然后在输出窗口中显示“调试”的输出。
戴夫·安德森

3
我正在努力在VS2017中实际找到输出... TestExplorer窗口->单击单个测试->如果该测试已输出,则在经过时间下的详细信息窗口中会出现“ ouput”​​一词,该链接指向一个新窗口。
Mike Walsh

1
如果您使用的是Xunit,只需通过ctor输入ITestOutputHelper并在其上调用WriteLine。在我发现如何在集成测试中写代码之前花了一段时间,希望这对某人有帮助。
亚历山大·霍斯特

69

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

输出量

在此处输入图片说明


8
需要using System.Diagnostics;
kmote

4
不要使用DateTime.Now。这是更好地使用秒表(msdn.microsoft.com/en-us/library/...
Suizo酒店

1
我无法使它正常工作。当我运行测试时,“输出”窗口立即切换到“构建”,并且没有任何内容发送到“调试”。你的想法?
InteXX

5
@InteXX确保您单击“调试测试”,而不是“运行测试”。它为我工作
约翰·亨克尔·

@JohnHenckel:知道了。谢谢。会做到的。实际上,沙利亚索斯的回答完全正确。不知道我怎么想念它。
InteXX

13

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

3

我遇到了同样的问题,并且正在“运行”测试。如果我改为“调试”测试,则Debug输出会像其他所有Trace和Console一样正常显示。如果您“运行”测试,我不知道如何查看输出。


System.Diagnostics.Debug.WriteLine在调试测试时,我可以显示一些东西,但是您如何Console.WriteLine开始工作呢?对于我来说,这并不会以正常(实时更新)的输出结束。
或Mapper

您找到运行测试时看到输出的任何方法了吗?
hima

0

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


“这样,您可以使用默认工具集监视进度。” - 怎么样?我看到的问题恰恰是测试运行后,它是一个黑框,只有在测试完成运行后,才可以在“ 输出”窗口中看到输出(在测试运行时逐渐写入)。
或Mapper

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.