VS2012 Unit Test —— 我对接口进行单元测试使用的技巧
【题外话】
对单元测试不熟悉的童鞋可参照我之前写过的两篇博文:
《VS2012 单元测试之泛型类(Generics Unit Test)》。
以下Demo将使用我已写好的一些关于单元测试的类库(已放至 https://idletest.codeplex.com/
,其用了大量的匿名方法,同样不熟悉的可参照我上一篇博文《委托的N种写法,你喜欢哪种?》)。
【进入正题】
与其说对接口测试还不如说针对抽象测试,也是我个人比较喜欢的编码步骤:编写接口(面向抽象)=>单元测试=>实现。
OK here we go...
首先假设有如下接口(这也是从我的代码中提取出来的)
public interface ITextFormatter
{
/// <summary>
/// 根据指定格式字符串获取对象
/// </summary>
T GetObject<T>(string formatString); /// <summary>
/// 将对象转化为指定格式字符串
/// </summary>
string GetString(object obj);
}
那么接下来我要做的并不是马上去实现它,而是测试先行,我将编写如下测试代码
public abstract class BaseFormatterTest
{
protected abstract ITextFormatter formatter
{
get;
} /// <summary>
///GetObject 的测试
///</summary>
public void GetObjectTestHelper<T>()
{
AssertCommon.AssertIsNull<string, T>(TestCommon.GetEmptyStrings(), true, (string strTemp) => {
return formatter.GetObject<T>(strTemp);
}); EntityParameter ep = new EntityParameter();
string str = formatter.GetString(ep);
EntityParameter actual = formatter.GetObject<EntityParameter>(str);
Assert.IsNotNull(actual);
Assert.AreEqual<int>(, actual.Data);
} public virtual void GetObjectTest()
{
GetObjectTestHelper<GenericParameterHelper>();
} /// <summary>
///GetString 的测试
///</summary>
public virtual void GetStringTest()
{
AssertCommon.AssertEmpty<string>(formatter.GetString(null)); AssertCommon.AssertEmpty<string>(formatter.GetString(new object()), false); string actual = formatter.GetString(new EntityParameter());
AssertCommon.AssertEmpty<string>(actual, false);
EntityParameter entity = formatter.GetObject<EntityParameter>(actual);
Assert.AreEqual<int>(, entity.Data);
}
针对接口测试抽象基类
值得注意的是以上方法中包含了一个叫做AssertCommon类,这个是我自己定义的,源码在 https://idletest.codeplex.com/。
我现在通过Xml序列化实现字符串与对象的相互转化,所以我继承这个基类来编写具体的测试,当然此时的测试代码就很简单了。
/// <summary>
///这是 ITextFormatterTest 的测试类,旨在
///包含所有 ITextFormatterTest 单元测试
///</summary>
[TestClass()]
public class XmlFormatterTest : BaseFormatterTest
{
[TestMethod()]
public override void GetObjectTest()
{
base.GetObjectTest();
} /// <summary>
///GetString 的测试
///</summary>
[TestMethod]
public override void GetStringTest()
{
base.GetStringTest();
} protected override ITextFormatter formatter
{
get { return new XmlFormatter(); }
}
}
完成测试编码后开始实现具体代码,我这里将创建一个抽象基类和一个子类去实现需要的功能
public abstract class BaseFormatter
{
private Encoding encoding;
public Encoding Encoding
{
get { return this.encoding; }
} public BaseFormatter(Encoding encoding)
{
this.encoding = encoding;
}
}
public class XmlFormatter : BaseFormatter, ITextFormatter
{
public XmlFormatter() : base(Encoding.Default) { } public XmlFormatter(Encoding encoding) : base(encoding) { } /// <summary>
/// 将对象序列化为XML格式字符串
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string GetString(object obj)
{
string result = string.Empty;
if (obj ==null)
{
return result;
} XmlSerializer serializer =new XmlSerializer(obj.GetType());
using (MemoryStream stream =new MemoryStream())
{
serializer.Serialize(stream, obj);
byte[] buffer = stream.ToArray();
result = this.Encoding.GetString(buffer);
stream.Close();
} return result;
} ///<summary>
/// 将XML格式字符串转化为对象
///</summary>
public T GetObject<T>(string xmlString)
{
T obj = default(T);
if (string.IsNullOrEmpty(xmlString))
{
return obj;
} XmlSerializer serializer =new XmlSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream(this.Encoding.GetBytes(xmlString)))
{
obj = (T)serializer.Deserialize(stream);
stream.Close();
} return obj;
}
}
整个过程就这样子,当然中间肯定运行多次测试来即时修正编码过程中的错误。篇幅有限,我在这里并没有编写构造函数的测试方法。
【后话】
如此一来以后再添加对接口的更多实现时,保证了不再需要编写大量重复的测试代码,例如再增加类JsonFormatter时就轻而易举的完成它的单元测试,后期开发效率与质量均得到保证。
编写完毕,借此抛砖引玉,希望得到您更好的意见,鲜花鸡蛋均欢迎。
VS2012 Unit Test —— 我对接口进行单元测试使用的技巧的更多相关文章
- VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试
[提示] 1. 阅读文本前希望您具备如下知识:了解单元测试,了解Dynamic,熟悉泛型(协变与逆变)和Lambda,熟悉.NET Framework提供的 Action与Func委托.2.如果您对单 ...
- VS2012 Unit Test 个人学习汇总(含目录)
首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.TestTools.UnitTesting.a ...
- VS2012 Unit Test——Microsoft Fakes入门
如题,本文主要作为在VS2012使用Fakes的入门示例,开发工具必须是VS2012或更高版本. 关于Fakes的MSDN地址:http://msdn.microsoft.com/en-us/libr ...
- VS2012 Unit Test
VS2012 Unit Test 个人学习汇总(含目录) 首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualS ...
- VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式
[1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...
- 使用IdleTest进行TDD单元测试驱动开发演练(1)
[前言] 开发工具:Visual Studio 2012 测试库:Visual Studio 2012自带的MSTest DI框架:Unity 数据持久层:Entity Framework 前端UI: ...
- .NET重构—单元测试重构
.NET重构—单元测试重构 阅读目录: 1.开篇介绍 2.单元测试.测试用例代码重复问题(大量使用重复的Mock对象及测试数据) 2.1.单元测试的继承体系(利用超类来减少Mock对象的使用) 2.1 ...
- 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试
VS2012 Unit Test(Void, Action, Func) —— 对无返回值.使用Action或Func作为参数.多重载的方法进行单元测试 [提示] 1. 阅读文本前希望您具备如下知识: ...
- unit vs单元测试
vs单元测试(unit) 一.什么是单元测试及它的作用? 在小量代码编写时,往往可以通过新建控制台项目(Console Application),新建网站项目(Web Form)等,在其中敲入测试代码 ...
随机推荐
- 用jquery.pager.js实现分页
1.html <link href="/stylesheets/Pager.css" rel="stylesheet" type="text/c ...
- 前端学PHP之运算符
× 目录 [1]总括 [2]算术运算符 [3]赋值运算符[4]位运算符[5]比较运算符[6]错误控制[7]逻辑运算符[8]字符串连接[9]数组运算符 前面的话 运算符是可以通过给出的一或多个表达式来产 ...
- ScrollView中嵌套GridView,ListView只显示一行的解决办法
转载:http://blog.csdn.net/luohai859/article/details/39347583 关于为什么只显示一行,个人理解是:如果单独使用GridView和ListView, ...
- 访问外网 ML2 的配置 - 每天5分钟玩转 OpenStack(103)
通过 router 可以实现位于不同 vlan 中的 instance 之间的通信. 接下来要探讨的问题是 instance 如何与外部网络通信. 这里的外部网络是指的租户网络以外的网络. 租户网络是 ...
- Web APi之认证(Authentication)及授权(Authorization)【一】(十二)
前言 无论是ASP.NET MVC还是Web API框架,在从请求到响应这一过程中对于请求信息的认证以及认证成功过后对于访问页面的授权是极其重要的,用两节来重点来讲述这二者,这一节首先讲述一下关于这二 ...
- PHP中MySQL操作
本次使用的demo是MySQL的示例数据库employees,点击下载地址,注意在导入的时候,在employees.sql文件中,将source改成你当前的目录. PHP中的demo代码可以在ideo ...
- IntelliJ IDEA上创建maven Spring MVC项目
IntelliJ IDEA上创建Maven Spring MVC项目 各软件版本 利用maven骨架建立一个webapp 建立相应的目录 配置Maven和SpringMVC 配置Maven的pom.x ...
- 一次发现underscore源码bug的经历以及对学术界『拿来主义』的思考
事情是如何发生的 最近干了件事情,发现了 underscore 源码的一个 bug.这件事本身并没有什么可说的,但是过程值得我们深思,记录如下,各位看官仁者见仁智者见智. 平时有浏览园区首页文章的习惯 ...
- 【集合框架】JDK1.8源码分析之LinkedList(七)
一.前言 在分析了ArrayList了之后,紧接着必须要分析它的同胞兄弟:LinkedList,LinkedList与ArrayList在底层的实现上有所不同,其实,只要我们有数据结构的基础,在分析源 ...
- 【字符编码】Java编码格式探秘
一.前言 在分析Comparable和Comparator的时候,分析到了String类的compareTo方法,String底层是用char[]数组来存放元素,在比较的时候是比较的两个字符串的字符, ...