首先分享一篇博文,[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; } |
測試代碼
/// |
關于泛型的測試其實也挺簡單的,沒什么可以啰嗦的,但是如果有了類型約束,那么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