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

...
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97