• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • VS2012 單元測試之泛型類

    發表于:2015-10-30來源:uml.org.cn作者:不詳點擊數: 標簽:單元測試
    泛型有兩種,一般泛型與類型約束泛型,在對包含泛型的方法進行單元測試中也可以這么分。從該頁面可以知道,關于泛型的單元測試,微軟類庫(Microsoft.VisualStudio.TestTools.UnitTesting)提供

      首先分享一篇博文,[Visual Studio] 開啟Visual Studio 2012通過右鍵菜單創建單元測試(Unit Test)。

      泛型有兩種,一般泛型與類型約束泛型,在對包含泛型的方法進行單元測試中也可以這么分。從該頁面可以知道,關于泛型的單元測試,微軟類庫(Microsoft.VisualStudio.TestTools.UnitTesting)提供了類 “GenericParameterHelper”幫助我們編寫Unit Test代碼。

      首先看下非類型約束的一個demo,我就直接上代碼了

    public static bool IsCollectionEmpty(ICollection collection)
    {
    return collection == null || collection.Count < 1;
    }
    

      測試代碼

    /// 
    ///IsCollectionEmpty 的測試
    ///
    public void IsCollectionEmptyTestHelper()
    {
    //三個用例:以非空集合,空集合,null分別作為參數
    ICollection collection = new T[]{default(T)}; // TODO: 初始化為適當的值
    bool expected = false; // TODO: 初始化為適當的值
    bool actual;
    actual = UtilityCheckData.IsCollectionEmpty(collection);
    Assert.AreEqual(expected, actual);
    collection = new T[] { };
    Assert.AreEqual(true, UtilityCheckData.IsCollectionEmpty(collection));
    Assert.AreEqual(true, UtilityCheckData.IsCollectionEmpty(null));
    }
    [TestMethod()]
    public void IsCollectionEmptyTest()
    {
    IsCollectionEmptyTestHelper();
    }
    

      關于泛型的測試其實也挺簡單的,沒什么可以啰嗦的,但是如果有了類型約束,那么GenericParameterHelper類將很可能不再能用了。

      然后再來看我做的一個類型約束泛型的單元測試代碼。

      寫一個類似棧的需測試的類:

    public class StackNum where T : struct
    {
    List array = null;
    public StackNum()
    {
    this.array = new List();
    }
    public void Push(T value)
    {
    array.Add(value);
    }
    public T Pop()
    {
    T val = array[this.Length - 1];
    this.array.Remove(val);
    return val;
    }
    public int Length
    {
    get { return this.array.Count; }
    }
    }
    

      StackNum

      在測試項目編寫一個測試幫助類

    class StackTestHelper
    {
    public static void LengthTest()
    where T : struct
    {
    var stack = GetStackInstance();
    Assert.AreEqual(stack.Length, 0);
    }
    public static void PushTest()
    where T : struct
    {
    var stack = GetStackInstance();
    stack.Push(default(T));
    Assert.AreEqual(stack.Length, 1);
    }
    public static void PopTest(params T[] values)
    where T : struct
    {
    var stack = GetStackInstance();
    if (values == null)
    {
    return;
    }
    int pushLength = 0;
    foreach (T val in values)
    {
    stack.Push(val);
    Assert.AreEqual(stack.Length, ++pushLength);
    }
    for (int i = stack.Length - 1; i >= 0; i--)
    {
    Assert.AreEqual(stack.Pop(), values[i]);
    Assert.AreEqual(stack.Length, i);
    }
    }
    public static StackNum GetStackInstance()
    where T : struct
    {
    return new StackNum();
    }
    }
    

      StackTestHelper

      測試類

    [TestClass]
    public class StackTest
    {
    [TestMethod]
    public void PushTest()
    {
    StackTestHelper.PushTest();
    StackTestHelper.PushTest();
    }
    [TestMethod]
    public void PopTest()
    {
    StackTestHelper.PopTest(22, 33, 55);
    StackTestHelper.PopTest(true, false);
    }
    [TestMethod]
    public void LengthTest()
    {
    StackTestHelper.LengthTest();
    }
    }
    

      這么寫單元測試可以簡單的切換我們所需要進行測試的各種類型。

      總結:對泛型做單元測試時相對會比一般的測試多寫一些代碼,不過多進行些抽象封裝還是完全可以接受的,目前還不知道有什么更好的辦法,如您有更好的辦法,請賜教,草民將不盡感激!!

      題外話:感覺我編寫單元測試的代碼比我編寫滿足功能需求的代碼還多,但是我對著玩意兒卻絲毫沒任何抵觸情緒,希望剛開始步入Unit Test的你也是。

    原文轉自:http://www.uml.org.cn/Test/201308091.asp

    ...
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>