【问题标题】:How can I precisely time a test run in visual studio 2010如何在 Visual Studio 2010 中精确计时测试运行
【发布时间】:2011-10-19 01:13:28
【问题描述】:

我有一套使用 Visual Studio 测试运行程序运行的项目的单元测试。我想知道测试运行时需要多长时间。测试运行详细信息屏幕显示了运行的开始和结束时间,但只显示最接近的秒数。目前我的测试套件只需不到一秒的时间就可以完成,所以我无法判断我的 50 个测试套件是在

有什么方法可以实现这种精度吗?

【问题讨论】:

    标签: visual-studio-2010 unit-testing mstest


    【解决方案1】:

    在您的解决方案根目录中,在测试运行之后有一个名为 Test Results 的文件夹。如果您在那里查看,每次运行都会吐出一个 .TRX 文件,其中包含测试运行的时间戳作为其名称的一部分。打开这个文件,您会看到它是一个 XML 文件,其中包含一堆关于测试运行的难以阅读的信息。如果您查找 XML 节点“UnitTestResult”,每个节点都有一个名为“duration”的属性。这将告诉您每个单独的测试运行多长时间(假设测试已运行)。

    我在这方面有丰富的经验,因为我编写了一个开源实用程序,该实用程序获取这些 TRX 文件、解析它们并生成结果的 HTML 报告。它向您显示的其中一件事是测试持续时间,对于单个测试、总体测试类以及整个测试运行。

    以免这成为我工具的插件,除非有人好奇,否则我不会发布链接。但是,我只想说,您可以从 TRX 文件中获取测试的执行时间,而无需调试跟踪或控制台或编辑您的测试代码。

    编辑:而且精度高得离谱。单个单元测试的示例条目是 00:00:00.0015890。

    【讨论】:

    • 刚刚发现,在 Visual Studio 2010 测试结果窗口中,您可以添加显示此值的“持续时间”列。我可能更喜欢你的方式。 :) 你知道这个值是否隐藏在 TestContext 的某个地方吗?
    • 我可以想象它在 TestContext 中的唯一位置将在实例属性“Proprties”中被索引,但我承认我对在代码中使用 TestContext 知之甚少。我通常不使用它,因为我不使用 MS Test 进行集成测试。 (并不是说这是人们可能使用它的唯一原因——我只是从来不需要它)。
    • 顺便说一句,很好地抓住了结果窗口中的可选列。我很久以前就定制了它,从那以后就再也没有看过它,所以我从来没有使用过那个专栏。
    • 我只是设置了一个断点并钻入了一个TestContext。它包含一个私有的 m_currentResult。我没有看到一种公开的方式来获取代码中的持续时间。似乎从结果文件中解析它是获取值的唯一方法(无需破解)。
    • @ChiefTwoPencils 哇,好多年没有想到这个了。大约 6 年前,我把它放在 Sourceforge 上:sourceforge.net/projects/mstestreportgen
    【解决方案2】:

    让所有测试类都继承自进行测量的基础测试类。

    在一般情况下,您需要将输出消息传送到更有用的东西(如记录器)。

    [TestClass]
    public abstract class TestClassBase2
    {
        protected TestContext testContextInstance;
    
        public TestContext TestContext
        {
            get { return testContextInstance; }
            set { testContextInstance = value; }
        }
    
        protected System.Diagnostics.Stopwatch _stopWatch;
    
        [TestInitialize]
        public void TestInitializeBase()
        {
            _stopWatch = System.Diagnostics.Stopwatch.StartNew();
        }
    
    
        [TestCleanup]
        public void TestCleanupBase()
        {
            System.Diagnostics.Debug.WriteLine("Done - Total Test time: {0} ms - {1}",
                                                _stopWatch.ElapsedMilliseconds, TestContext.TestName);
        }
    }
    
    [TestClass]
    public class TempTests : TestClassBase2
    {
        [TestMethod]
        public void TempTest()
        {
            // outputs: 
            // Done - Total Test time: 3 ms - TempTest
        }
    }
    

    【讨论】:

      【解决方案3】:

      您总是可以多次运行单元测试,然后将总时间除以运行它们的次数。不过这基本上是一个平均值,所以如果您正在寻找低点或高点,那么这不是最好的选择。

      【讨论】:

      • 在一次测试运行期间测试必须运行多次 - 如果不在每个测试方法中添加循环,我看不到这样做的方法,这并不理想。有没有办法在测试运行中多次添加测试?
      猜你喜欢
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 2011-10-12
      相关资源
      最近更新 更多