求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
VS2012 单元测试之泛型类
 

发布于2013-8-9

 

首先分享一篇博文,[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的你也是。

相关文章

微服务测试之单元测试
一篇图文带你了解白盒测试用例设计方法
全面的质量保障体系之回归测试策略
人工智能自动化测试探索
相关文档

自动化接口测试实践之路
jenkins持续集成测试
性能测试诊断分析与优化
性能测试实例
相关课程

持续集成测试最佳实践
自动化测试体系建设与最佳实践
测试架构的构建与应用实践
DevOps时代的测试技术与最佳实践
 
分享到
 
 
     


LoadRunner性能测试基础
软件测试结果分析和质量报告
面向对象软件测试技术研究
设计测试用例的四条原则
功能测试中故障模型的建立
性能测试综述
更多...   


性能测试方法与技术
测试过程与团队管理
LoadRunner进行性能测试
WEB应用的软件测试
手机软件测试
白盒测试方法与技术


某博彩行业 数据库自动化测试
IT服务商 Web安全测试
IT服务商 自动化测试框架
海航股份 单元测试、重构
测试需求分析与测试用例分析
互联网web测试方法与实践
基于Selenium的Web自动化测试
更多...