我正在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);
}
答案 0 :(得分:1)
当单独运行测试时,抛出VS 2012测试资源管理器,它们会显示或多或少相等的持续时间 - 每个都有几毫秒。然而,执行所有这些结果会显示问题中显示的类似结果,但在我的情况下TestModifyVertex
是运行时间更长的结果。
如果没有进行更深入的研究,我会怀疑这里的一些类加载问题 - 可能是你的代码或(这可能是这里的情况,因为你的例子非常紧凑)一些MSTest
(或者你正在使用的任何testrunner) )代码。后续测试可能会从已加载的类中获得一些好处。
因此,要获得可比较的结果,您可以尝试单独运行每个测试,但我不认为这是一个好主意。我们尝试以类似的方式检测性能下降但由于过多的误报而放弃。 MSTest似乎不适合这个。
要获取有关正在发生的事情的更多信息,请根据您编写的Visual Studio版本尝试分析测试。