【题外话】
对单元测试不熟悉的童鞋可参照我之前写过的两篇博文:
《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)等,在其中敲入测试代码 ...
随机推荐
-
- >;code vs 1475 m进制转十进制
1475 m进制转十进制 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 将m进制数n转化成一个 ...
-
性能:CPU、Memory、耗电量
1.自动 APP 性能测试需求讨论:https://testerhome.com/topics/3172 2.Android Studio中怎么使用DDMS工具?:http://www.cnblogs ...
-
JavaScript 三种绑定事件方式之间的区别
JavaScript三种绑定事件的方式: 1. <div id="btn" onclick="clickone()"></div> // ...
-
多线程lock(instance)中instance的选择.
如我的提问:http://bbs.csdn.net/topics/390496351?page=1#post-394837834 拥有类原子功能的类: class ShareState { //原子功 ...
-
angularjs简单实现$http.post(CORS)跨域及$http.post传参方式模拟jQuery.post
1.开启angularjs的CORS支持 .config(function($httpProvider) { // CORS post跨域配置 $httpProvider.defaults.useXD ...
-
【转】CentOS6.5 增加一个SFTP上传的用户
原文链接地址:http://www.msits.com/archives/4477.html #创建sftp组groupadd sftp#创建一个用户zjhpuseradd -g sftp -s /b ...
-
【WPF】监听WPF的WebBrowser控件弹出新窗口的事件
原文:[WPF]监听WPF的WebBrowser控件弹出新窗口的事件 WPF中自带一个WebBrowser控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗 ...
-
Hadoop学习笔记Hadoop伪分布式环境建设
建立一个伪分布式Hadoop周围环境 1.主办(Windows)顾客(安装在虚拟机Linux)网络连接. a) Host-only 主机和独立客户端联网: 好处:网络隔离: 坏处:虚拟机和其他serv ...
-
JS 拖动DIV 需要JQUERY 支持
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
-
云计算之阿里仓库停止openstack mitaka源报错“No package centos-release-openstack-mitaka available.”
之前学习了一个月的openstack的mitaka版本,写完脚本放置一段时间,最近准备正式部署突然发现 No package centos-release-openstack-mitaka avail ...