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

...