VS2012 单元测试之泛型类(Generics Unit Test)
关于单元测试,如果不会用可以参照我的上篇博文————在Visual Studio 2012使用单元测试
首先分享一篇博文,[Visual Studio] 开启Visual Studio 2012通过右键菜单创建单元测试(Unit Test)。
泛型有两种,一般泛型与类型约束泛型,在对包含泛型的方法进行单元测试中也可以这么分,详情可参阅http://msdn.microsoft.com/en-us/library/vstudio/ms243401.aspx 。从该页面可以知道,关于泛型的单元测试,微软类库(Microsoft.VisualStudio.TestTools.UnitTesting)提供了类“GenericParameterHelper”帮助我们编写Unit Test代码。
首先看下非类型约束的一个demo,我就直接上代码了
public static bool IsCollectionEmpty<T>(ICollection<T> collection)
{
return collection == null || collection.Count < ;
}
测试代码
/// <summary>
///IsCollectionEmpty 的测试
///</summary>
public void IsCollectionEmptyTestHelper<T>()
{
//三个用例:以非空集合,空集合,null分别作为参数
ICollection<T> collection = new T[]{default(T)}; // TODO: 初始化为适当的值
bool expected = false; // TODO: 初始化为适当的值
bool actual;
actual = UtilityCheckData.IsCollectionEmpty<T>(collection);
Assert.AreEqual(expected, actual); collection = new T[] { };
Assert.AreEqual(true, UtilityCheckData.IsCollectionEmpty<T>(collection)); Assert.AreEqual(true, UtilityCheckData.IsCollectionEmpty<T>(null));
} [TestMethod()]
public void IsCollectionEmptyTest()
{
IsCollectionEmptyTestHelper<GenericParameterHelper>();
}
关于泛型的测试其实也挺简单的,没什么可以啰嗦的,但是如果有了类型约束,那么GenericParameterHelper类将很可能不再能用了。
然后再来看我做的一个类型约束泛型的单元测试代码。
写一个类似栈的需测试的类:
public class StackNum<T> where T : struct
{
List<T> array = null; public StackNum()
{
this.array = new List<T>();
} public void Push(T value)
{
array.Add(value);
} public T Pop()
{
T val = array[this.Length - ];
this.array.Remove(val);
return val;
} public int Length
{
get { return this.array.Count; }
}
}
StackNum
在测试项目编写一个测试帮助类
class StackTestHelper
{
public static void LengthTest<T>()
where T : struct
{
var stack = GetStackInstance<T>();
Assert.AreEqual(stack.Length, );
} public static void PushTest<T>()
where T : struct
{
var stack = GetStackInstance<T>();
stack.Push(default(T));
Assert.AreEqual(stack.Length, );
} public static void PopTest<T>(params T[] values)
where T : struct
{
var stack = GetStackInstance<T>();
if (values == null)
{
return;
} int pushLength = ;
foreach (T val in values)
{
stack.Push(val);
Assert.AreEqual(stack.Length, ++pushLength);
} for (int i = stack.Length - ; i >= ; i--)
{
Assert.AreEqual<T>(stack.Pop(), values[i]);
Assert.AreEqual(stack.Length, i);
}
} public static StackNum<T> GetStackInstance<T>()
where T : struct
{
return new StackNum<T>();
}
}
StackTestHelper
测试类
[TestClass]
public class StackTest
{
[TestMethod]
public void PushTest()
{
StackTestHelper.PushTest<decimal>();
StackTestHelper.PushTest<double>();
} [TestMethod]
public void PopTest()
{
StackTestHelper.PopTest<int>(, , );
StackTestHelper.PopTest<bool>(true, false);
} [TestMethod]
public void LengthTest()
{
StackTestHelper.LengthTest<char>();
}
}
这么写单元测试可以简单的切换我们所需要进行测试的各种类型。
总结:对泛型做单元测试时相对会比一般的测试多写一些代码,不过多进行些抽象封装还是完全可以接受的,目前还不知道有什么更好的办法,如您有更好的办法,请赐教,草民将不尽感激!!
题外话:感觉我编写单元测试的代码比我编写满足功能需求的代码还多,但是我对着玩意儿却丝毫没任何抵触情绪,希望刚开始步入Unit Test的你也是。
VS2012 单元测试之泛型类(Generics Unit Test)的更多相关文章
- 玩转单元测试之Testing Spring MVC Controllers
玩转单元测试之 Testing Spring MVC Controllers 转载注明出处:http://www.cnblogs.com/wade-xu/p/4311657.html The Spri ...
- [转载]单元测试之道(使用NUnit)
首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而又忐忑的心情点击界面上的 ...
- 单元测试之道(使用NUnit)
首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上 ...
- Visual Studio 单元测试之二---顺序单元测试
原文:Visual Studio 单元测试之二---顺序单元测试 此文是上一篇博文:Visual Studio 单元测试之一---普通单元测试的后续篇章.如果读者对Visual Studio的单元测试 ...
- iOS 单元测试之XCTest详解(一)
iOS 单元测试之XCTest详解(一) http://blog.csdn.net/hello_hwc/article/details/46671053 原创blog,转载请注明出处 blog.csd ...
- 玩转单元测试之WireMock -- Web服务模拟器
玩转单元测试之WireMock -- Web服务模拟器 WireMock 是一个灵活的库用于 Web 服务测试,和其他测试工具不同的是,WireMock 创建一个实际的 HTTP服务器来运行你的 We ...
- 单元测试之NSNull 检测
本文主要讲 单元测试之NSNull 检测,在现实开发中,我们最烦的往往就是服务端返回的数据中隐藏着NSNull的数据,一般我们的做法是通过[data isKindOfClass:[NSNull cla ...
- 使用VisualStudio进行单元测试之二
借着工作忙的借口,偷了两天懒,今天继续单元测试之旅.前面说了如何进行一个最简单的单元测试,这次呢就跟大家一起来熟悉一下,在visual studio中如何进行数据驱动的单元测试. 开始之前先来明确一下 ...
- 单元测试之Qunit
单元测试之Qunit 前言 因为公司开发了一套javascript SDK需要测试,在网上找了很久,找到了JQuery团队开发的QUnit,和基于JUnit的JsUnit,还有一些还没有看,先讲讲QU ...
随机推荐
- 准备 LVM Volume Provider - 每天5分钟玩转 OpenStack(49)
Cinder 真正负责 Volume 管理的组件是 volume provider. Cinder 支持多种 volume provider,LVM 是默认的 volume provider.Devs ...
- Oracle_多表查询
SQL多表查询 等值和不等值连接查询 从多个表中获取数据:如果在查询的时候,直接从多个表中获取数据.没有添加条件判断,会出现"笛卡尔积"错误 笛卡尔积错误 笛卡尔集会在下面条件下产 ...
- Objective-C中的深拷贝和浅拷贝
在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把 ...
- linux有关信号的FAQ
1.为什么会出现系统调用被中断的情况? 进程在执行一个低速系统调用而阻塞期间捕捉到一个信号时,该系统调用就被中断不再继续执行.该系统调用返回出错,其errno被设置为EINTR.这样处理的理由是:因为 ...
- Last-Modified、If-Modified-Since 实现缓存和 OutputCache 的区别
先梳理三个概念: OutputCache:页面输出缓存,一般 ASP.NET 应用程序会用到. Last-Modified:Http 响应头(Http Reponse Header),由服务器发给客户 ...
- swift 中指针的使用UnsafeMutablePointer
在swift中已经弱化了指针的使用,可以这么使用 let s: NSRange = NSMakeRange(, ) let at = UnsafeMutablePointer<NSRange&g ...
- 设置SharePoint Server 2013 的匿名访问
默认情况下,SharePoint Server 2013 是关闭匿名访问的,但是某些环境下我们又需要将这个匿名访问对全员开放,怎么操作更加安全与便捷,对于一个崭新的环境我们可以这样操作. 首先在当前需 ...
- PowerPoint基础
一.基础 默认后缀ppt,pptx office2003和以后的版本只支持ppt, 可以将pptx另存为ppt97-2003 二.修改PPT尺寸 三.新建幻灯片 四.字体与段落设置 五.主题与字体 六 ...
- 使用RMAN创建复制数据库
我的实验环境: - 源数据库A机: RHEL6.4 + Oracle 11.2.0.4 IP地址:192.168.99.159 db_name=oradb 数据库已正常运行 - 复制数据库B机: RH ...
- css常用的特效代码
一.网页变灰的代码:a) 网页变灰色<head>加到这里</head><style type="text/css">html {FILTER: ...