c#单元测试akward运行时

时间:2014-08-01 08:39:22

标签: c# performance visual-studio unit-testing

我正在Win8上的Visual Studio 2013中开发一个C#工具。

我刚刚开始为单元测试支付报酬(对我感到羞耻;))在一个非常简单的部分:

有一个几何向量类。想检查init是否有效。代码如下。

发现测试方法的运行时很奇怪: 当跑步时,测试的时间是

TestCreateNonZeroVertex  <1ms
TestCreateZeroVertex      4ms
TestModifyVertex         <1ms

按顺序多次执行测试(以消除系统中的某些缓冲内容),并对此值进行稳定。

首先想到的是:Garabage Collector - &gt;在TearDown中强制GC(等待完成)。 结果:时间跨度增加(按预期)但按比例增加

TestCreateNonZeroVertex  2ms
TestCreateZeroVertex     8ms (with peaks to 13ms)
TestModifyVertex         2ms

对于少量代码以及TestModifyVertex是事实上的TestCreateZeroVertex + X这一事实,我不明白这种差异。是因为TestCreateZeroVertex是TestSuite中的第一个方法吗?如果是这样,对我来说,这听起来像是测试环境中的一个错误。 (无论如何,为什么撕裂是令人放心的一部分?)

如果有人可以解释,为什么时间漂移如此强烈,以及如何消除这种转变(为了可比性),我会非常感激。

这是课程的开头:

public class Vertex
{
    public double X { get; set; }
    public double Y { get; set; }
    public double Z { get; set; }

    public Vertex()
    {
        X = 0;
        Y = 0;
        Z = 0;
    }

    public Vertex(double x, double y, double z)
    {
        X = x;
        Y = y;
        Z = z;
    }
...

非常简单。

我做了一些测试方法:

    [TestMethod]
    public void TestCreateZeroVertex()
    {
        Vertex v = new Vertex();
        Assert.AreEqual<double>(0.0, v.X, "Expected X value to be zero, is: " + v.X);
        Assert.AreEqual<double>(0.0, v.Y, "Expected Y value to be zero, is: " + v.Y);
        Assert.AreEqual<double>(0.0, v.Z, "Expected Z value to be zero, is: " + v.Z);
    }

    [TestMethod]
    public void TestCreateNonZeroVertex()
    {
        double x = 1.1, y = 2.2, z = 3.3;
        Vertex v = new Vertex(x, y, z);
        Assert.AreEqual<double>(x, v.X, "Expected X value to be " + x + ", is: " + v.X);
        Assert.AreEqual<double>(y, v.Y, "Expected Y value to be " + y + ", is: " + v.Y);
        Assert.AreEqual<double>(z, v.Z, "Expected Z value to be " + z + ", is: " + v.Z);
    }

    [TestMethod]
    public void TestModifyVertex()
    {
        double x = 1.1, y = 2.2, z = 3.3;
        Vertex v = new Vertex();
        Assert.AreEqual<double>(0.0, v.X, "Expected X value to be zero, is: " + v.X);
        Assert.AreEqual<double>(0.0, v.Y, "Expected Y value to be zero, is: " + v.Y);
        Assert.AreEqual<double>(0.0, v.Z, "Expected Z value to be zero, is: " + v.Z);

        v.X = x;
        v.Y = y;
        v.Z = z;
        Assert.AreEqual<double>(x, v.X, "Expected X value to be " + x + ", is: " + v.X);
        Assert.AreEqual<double>(y, v.Y, "Expected Y value to be " + y + ", is: " + v.Y);
        Assert.AreEqual<double>(z, v.Z, "Expected Z value to be " + z + ", is: " + v.Z);
    }

1 个答案:

答案 0 :(得分:1)

当单独运行测试时,抛出VS 2012测试资源管理器,它们会显示或多或少相等的持续时间 - 每个都有几毫秒。然而,执行所有这些结果会显示问题中显示的类似结果,但在我的情况下TestModifyVertex是运行时间更长的结果。

如果没有进行更深入的研究,我会怀疑这里的一些类加载问题 - 可能是你的代码或(这可能是这里的情况,因为你的例子非常紧凑)一些MSTest(或者你正在使用的任何testrunner) )代码。后续测试可能会从已加载的类中获得一些好处。

因此,要获得可比较的结果,您可以尝试单独运行每个测试,但我不认为这是一个好主意。我们尝试以类似的方式检测性能下降但由于过多的误报而放弃。 MSTest似乎不适合这个。

要获取有关正在发生的事情的更多信息,请根据您编写的Visual Studio版本尝试分析测试。