【问题标题】:Why can't I see any console or trace output when running load tests in VS 2015?为什么在 VS 2015 中运行负载测试时看不到任何控制台或跟踪输出?
【发布时间】:2015-11-18 01:40:33
【问题描述】:

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

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

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

[更新] 我找到了部分答案:我可以看到失败的测试运行的跟踪输出。运行失败后,图表和统计信息页面打开,并且在各个地方都有指向错误的链接。单击它并打开负载测试错误窗口,右键单击错误并选择查看详细信息,您会看到一个页面,其中有一个“附加信息”部分,该部分包含使用 TestContext.WriteLine 编写的任何消息。还有一个 Debug Trace 部分,其中包含使用 Debug.WriteLine 编写的消息。

但我看不到成功运行的方法来查看此输出。 (如果能够将某些输出组合成一个流,那就太好了,但我想我明白为什么必须手动实现它。)

【问题讨论】:

    标签: visual-studio-2015 load-testing test-project


    【解决方案1】:

    经过大量搜索,我终于找到了这个问题的答案。请注意,正如您所指出的,在默认设置下,它仅在出现错误时记录(附加信息下的日志,在错误详细信息屏幕中)该设置在“运行设置”属性下,部分日志记录,属性“ Save Log on test Failure”,默认值为“true”。

    现在来解决问题。除了该属性之外,还有一个名为“保存已完成测试的日志频率”的属性。默认值为 0。此属性用于为 N 个测试中的一个保存测试日志。如果您希望 100% 的时间创建日志,则将其设置为 1。1 分之 1 是 100%。

    完成此操作后,要找到日志,在结果屏幕中(右键单击负载测试并选择“打开和管理结果..”),导航到“详细信息”选项卡,其中将显示一些图表。将鼠标指针悬停在“虚拟用户活动图表”中的各个测试上,您将在那里看到指向“测试日志”的链接。瞧!任务完成。

    【讨论】:

      【解决方案2】:

      也许是因为你想要的东西不可用。

      我使用的方法是打开一个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();
              }
          }
      }
      

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

      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 Online 运行测试时,该代码也可以正常工作,但我没有找到任何查看或收集此类测试运行的日志文件的方法。

      【讨论】:

      • 我认为您可能是对的,您只是无法从这里到达那里,并且必须推出自己的输出......但我一直看到听起来人们说这很容易的事情。也许他们的意思是在类似的情况下——比如你可以在测试运行中做到这一点,只要它们不是负载测试。
      • @PaulKienitz 你能提供链接到说这很容易的陈述吗?
      猜你喜欢
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      相关资源
      最近更新 更多