[英]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.