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