首先分享一篇博文,[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