繁体   English   中英

c#单元测试akward运行时

[英]c# unit test akward runtime

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

我刚开始为单元测试付费(对我来说很遗憾;))在一个非常简单的部分:

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

发现测试方法的运行时非常奇怪:当运行时测试时间如下

TestCreateNonZeroVertex  <1ms
TestCreateZeroVertex      4ms
TestModifyVertex         <1ms

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

首先想到的是:Garabage Collector - >在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);
    }

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM