【发布时间】:2011-10-19 01:13:28
【问题描述】:
我有一套使用 Visual Studio 测试运行程序运行的项目的单元测试。我想知道测试运行时需要多长时间。测试运行详细信息屏幕显示了运行的开始和结束时间,但只显示最接近的秒数。目前我的测试套件只需不到一秒的时间就可以完成,所以我无法判断我的 50 个测试套件是在
有什么方法可以实现这种精度吗?
【问题讨论】:
标签: visual-studio-2010 unit-testing mstest
我有一套使用 Visual Studio 测试运行程序运行的项目的单元测试。我想知道测试运行时需要多长时间。测试运行详细信息屏幕显示了运行的开始和结束时间,但只显示最接近的秒数。目前我的测试套件只需不到一秒的时间就可以完成,所以我无法判断我的 50 个测试套件是在
有什么方法可以实现这种精度吗?
【问题讨论】:
标签: visual-studio-2010 unit-testing mstest
在您的解决方案根目录中,在测试运行之后有一个名为 Test Results 的文件夹。如果您在那里查看,每次运行都会吐出一个 .TRX 文件,其中包含测试运行的时间戳作为其名称的一部分。打开这个文件,您会看到它是一个 XML 文件,其中包含一堆关于测试运行的难以阅读的信息。如果您查找 XML 节点“UnitTestResult”,每个节点都有一个名为“duration”的属性。这将告诉您每个单独的测试运行多长时间(假设测试已运行)。
我在这方面有丰富的经验,因为我编写了一个开源实用程序,该实用程序获取这些 TRX 文件、解析它们并生成结果的 HTML 报告。它向您显示的其中一件事是测试持续时间,对于单个测试、总体测试类以及整个测试运行。
以免这成为我工具的插件,除非有人好奇,否则我不会发布链接。但是,我只想说,您可以从 TRX 文件中获取测试的执行时间,而无需调试跟踪或控制台或编辑您的测试代码。
编辑:而且精度高得离谱。单个单元测试的示例条目是 00:00:00.0015890。
【讨论】:
让所有测试类都继承自进行测量的基础测试类。
在一般情况下,您需要将输出消息传送到更有用的东西(如记录器)。
[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
}
}
【讨论】:
您总是可以多次运行单元测试,然后将总时间除以运行它们的次数。不过这基本上是一个平均值,所以如果您正在寻找低点或高点,那么这不是最好的选择。
【讨论】: