为什么我在 VS 2015 中进行 运行 负载测试时看不到任何控制台或跟踪输出?

Why can't I see any console or trace output when running load tests in VS 2015?

我已经定义了 DEBUG 和 TRACE。我试过 Trace.WriteLine、Debug.WriteLine、Console.WriteLine 和 TestContext.WriteLine。在测试结果 window 中,我添加了输出 (StdOut)、错误 (StdError)、调试跟踪和堆栈跟踪列。我已经在输出 window 中尝试了所有可用于不同流的 "Show output from" 选项。我用图表和其他东西查看了输出摘要 window。我在任何地方都找不到跟踪输出的单个字节。

我在 VS 2008 中遇到了同样的问题,其中负载测试是一个新的粗略功能...我认为升级会使事情变得更容易,但事实并非如此。

在整个网络上,人们都在谈论在这些测试中将跟踪消息记录到控制台,就好像这是世界上最简单、最明显的事情一样。在正常调试期间,我对这种跟踪输出没有任何问题,只有在 运行 宁负载测试时。为什么我找不到办法呢?

[更新] 我找到了部分答案:我可以看到测试 运行 失败时的跟踪输出。在 运行 失败后,图表和统计页面打开,在不同的地方,有一个 link 错误。单击它并打开负载测试错误 window,右键单击一个错误并 select 查看详细信息,您会看到一个页面,其中有一个 "Additional Information" 部分,该部分包含任何消息写成TestContext.WriteLine。还有一个调试跟踪部分,其中包含使用 Debug.WriteLine.

编写的消息

但我没有找到一种方法来查看此输出是否成功 运行。 (能够将某些输出组合成一个流会很好,但我想我明白为什么必须手动实现它了。)

可能是因为没有你想要的。

我使用的方法是打开一个StreamWriter写入一个文本文件。在某些情况下,我使用以下样式的代码:

private void WriteLineToTestLog(string line)
{
    StreamWriter sw = File.AppendText("C:\Windows\Temp\MyWebtestsLog.txt");
    sw.WriteLine(System.DateTime.Now + "  " + line);
    sw.Close();
}

对于许多虚拟用户的测试,我担心上面代码的性能。所以我制作了一个版本,其中有一个受锁保护的共享流:

public class SingletonWriter
{
    private static object myLock = new object();
    private static SingletonWriter mySingleton = null;
    private StreamWriter outStream;
    public static string AgentId { get; set; } // Set when running with multiple agent computers.

    private SingletonWriter()
    {
        if ( AgentId == null ) { AgentId = "00"; }
        string streamName = @"TestStatus." + System.DateTime.Now.ToString("yyyy-MM-dd.HHmm.") + AgentId + ".log";
        System.Console.WriteLine("Writing to " + streamName);
        outStream = new StreamWriter(streamName, true); // true means append to an existing file.
        outStream.WriteLine("Start of output");
        outStream.Flush();
    }

    public static void WriteLine(string line)
    {
        lock (myLock)
        {
            if (mySingleton == null)
            {
                mySingleton = new SingletonWriter();
            }

            mySingleton.outStream.WriteLine(line);
            mySingleton.outStream.Flush();
        }
    }
}

这是从其他网络测试中的插件调用的,代码如下:

StringBuilder message sb = new StringBuilder();
sb.Append(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff "));
sb.Append(e.WebTest.Name);
sb.Append(...); // More useful data
string message = sb.ToString();
e.WebTest.AddCommentToResult(message);
SingletonWriter.WriteLine(message);

日志文件被写入到执行测试的计算机上。由于这可能是代理计算机,因此需要将文件从代理复制到要对其进行分析的计算机上。当测试 运行 和 Visual Studio 在线时,代码也可以正常工作,但我还没有找到任何查看或收集此类测试日志文件的方法 运行s.

经过大量搜索,我终于找到了这个问题的答案。请注意,正如您所指出的,根据默认设置,它仅在出现错误时记录(附加信息下的日志,在错误详细信息屏幕中)该设置位于 "run settings" properties,section logging,属性 "Save Log on test Failure" 具有默认值 "true".

现在开始解决。除了属性,还有一个叫做"Save Log Frequency for Completed Tests"。默认值为 0。此 属性 用于保存 N 个测试中的一个测试日志。如果您希望 100% 的时间创建日志,则将其设置为 1。1 取 1 是 100%。

完成此操作后,要找到日志,在结果屏幕中(右键单击负载测试并选择 "open and manage results.."),导航到 "details" 选项卡,它将显示一些图表。将鼠标指针悬停在 "virtual user activity chart" 中的各个测试上,您将在 "test log" 中看到 link。瞧!任务完成。