程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Visual Studio 2012 單元測試之泛型類(Generics Unit Test)

Visual Studio 2012 單元測試之泛型類(Generics Unit Test)

編輯:關於.NET

關於單元測試,如果不會用可以參照我的上篇博文————在Visual Studio 2012使用單元測試

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

泛型有兩種,一般泛型與類型約束泛型,在對包含泛型的方法進行單元測試中也可以這麼分,詳情可 參閱http://msdn.microsoft.com/en-us/library/vstudio/ms243401.aspx  。從該頁面可以知道,關於 泛型的單元測試,微軟類庫(Microsoft.VisualStudio.TestTools.UnitTesting)提供了類 “GenericParameterHelper”幫助我們編寫Unit Test代碼。

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

public static bool IsCollectionEmpty<T>(ICollection<T> 

collection)
{
    return collection == null || collection.Count < 1;
}

測試代碼

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

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

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

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

public class StackNum<T> where T : struct
    {
        List<T> array = null;
    
        public StackNum()
        {
            this.array = new List<T>();
        }
    
        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<T>()
            where T : struct
        {
            var stack = GetStackInstance<T>();
            Assert.AreEqual(stack.Length, 0);
        }
    
        public static void PushTest<T>()
            where T : struct
        {
            var stack = GetStackInstance<T>();
            stack.Push(default(T));
            Assert.AreEqual(stack.Length, 1);
        }
    
        public static void PopTest<T>(params T[] values)
            where T : struct
        {
            var stack = GetStackInstance<T>();
            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<T>(stack.Pop(), values[i]);
                Assert.AreEqual(stack.Length, i);
            }
        }
    
        public static StackNum<T> GetStackInstance<T>()
            where T : struct
        {
            return new StackNum<T>();
        }
    }
    
StackTestHelper

測試類

[TestClass]
    public class StackTest
    {
        [TestMethod]
        public void PushTest()
        {
            StackTestHelper.PushTest<decimal>();
            StackTestHelper.PushTest<double>();
        }
    
        [TestMethod]
        public void PopTest()
        {
            StackTestHelper.PopTest<int>(22, 33, 55);
            StackTestHelper.PopTest<bool>(true, false);
        }
    
        [TestMethod]
        public void LengthTest()
        {
            StackTestHelper.LengthTest<char>();
        }
    }

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

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved