Unit testing 奇怪的单元测试运行时差异

Unit testing 奇怪的单元测试运行时差异,unit-testing,mstest,Unit Testing,Mstest,我有单元测试方法调用完全相同的东西: void Test() { for (int i = 0; i < 100000; i++); } void测试() { 对于(int i=0;i

我有单元测试方法调用完全相同的东西:

void Test()
{
    for (int i = 0; i < 100000; i++);
}
void测试()
{
对于(int i=0;i<100000;i++);
}
其中一个始终以不同的持续时间运行

如果删除第一个,
TestMethod3
总是不同的:

如果我添加其他测试方法,
TestMethod6
总是不同的:

总有一种方法与其他方法不同。 这种奇怪的差异背后的原因是什么


我目前正在研究算法,并试图用测试方法测量运行时间。这种差异使我想到测试方法运行时是否可靠。

您不能在简单的单元测试中测试性能。部分原因是测试框架有许多不同的实现和配置,对测试的性能有不同的影响

最值得注意的是测试是并行运行、多线程运行还是连续运行。显然,第一个选项完全使任何基准测试无效。然而,第二种选择仍然不能保证有效的基准测试

这是因为其他独立于实际单元测试框架的因素:包括

  • 类加载和内存分配导致的初始延迟
  • 及时将字节码编译成机器码。这是很难控制的,而且可能发生似乎不可预测的情况
  • 分支预测,这可能会极大地影响您的运行时行为,具体取决于处理的数据和控制流的性质
  • 垃圾收集
用Java进行远程有效的基准测试本身就是一种艺术形式。为了接近,你至少应该确保

  • 您正在单个线程中运行感兴趣的代码,没有其他活动线程
  • 不要使用垃圾收集(即,确保有足够的内存在没有GC的情况下执行测试,并适当设置JVM的GC选项)
  • 有一个预热阶段,在开始对代码进行基准测试之前,以足够的迭代次数运行代码

这篇关于IBM的文章有助于介绍Java基准测试的缺陷。

这与visual studio中的测试运行程序有关。这些测试通常是同时运行的,但是您看到的时间较长的测试通常是首先启动的测试。多年来,我一直在VisualStudio中注意到这一点。如果您自己运行其中一个,您会注意到它的运行时间将比作为“全部运行”的一部分运行的时间长


我一直认为这与计时器在测试仍在加载时提前启动有关。

这与测试运行程序有关。这些测试通常是同时运行的,但是您看到的时间较长的测试是首先启动的测试。我已经注意到这一点很多年了。如果您自己运行其中一个,您会注意到它的运行时间会更长。@Nkosi我认为这应该是一个(正确的)答案,而不是一个注释:)作为答案添加。我最初没有添加它,因为我从未见过任何官方文档。这个评论是基于我十多年来使用VS的经验。