簡體   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