【1】我的IdleTest源码地址:http://idletest.codeplex.com/

【2】IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的断言方法分离成为接口,以便于扩展,例如现在可以支持切换测试框架(实现IAssertInstance接口,并修改AssertCommon_Editable.cs中的DEFAULT_INSTANCE为新的对象),然后就是增加对xml一些操作的支持。尽管如此,但并不是完全遵循OCP,可以说对扩展开放,对修改适当关闭。体现在AssertCommon_Editable.cs文件,该文件提供了AssertCommon的一个分部类,用以进行修改和增加功能,而AssertCommon.cs则尽可能不去修改,所以这是一个局限性,但是又由于需要保留AssertCommon(因为该类是IdleTest最根本的功能)这个包含大量静态成员的类,导致了难以实现对修改关闭的原则了。

  项目结构如下图所示

项目多了就要画些图示说明,不然过段时间自己都不知道这个代码为什么是这样子的结构了。

以上都是比较简单的图示,下方这个则以接口和类为单位进行的类图建模

【3】测试对Xml的操作之我的方式,如果您有更好的方式请不吝分享。

  1. 假设在IdleTest.DemoBeTest项目下有类XmlExtensionMethods需要测试

    public static class XmlExtensionMethods
{
/// <summary>
/// 获取XML节点的属性值
/// </summary>
/// <param name="node">节点</param>
/// <param name="attr">属性名</param>
public static string GetAttribute(this XmlNode node, string attr)
{
if (string.IsNullOrEmpty(attr) || node.Attributes[attr] == null)
{
return string.Empty;
} return node.Attributes[attr].Value;
} /// <summary>
/// 获取XML节点的属性值
/// </summary>
/// <param name="node">节点</param>
/// <param name="attr">属性名</param>
public static T GetAttribute<T>(this XmlNode node, string attr)
{
if (string.IsNullOrEmpty(attr) || node.Attributes[attr] == null
|| string.IsNullOrEmpty(node.Attributes[attr].Value))
{
return default(T);
} return (T)Convert.ChangeType(node.Attributes[attr].Value, typeof(T));
} /// <summary>
/// 查找满足条件的节点
/// </summary>
public static XmlNode Find(this XmlNodeList source, Func<XmlNode, bool> func)
{
foreach (object o in source)
{
XmlNode item = o as XmlNode;
if (item != null && func(item))
return item;
} return null;
} /// <summary>
/// 查找满足条件的节点集合
/// </summary>
public static ICollection<XmlNode> FindAll(this XmlNodeList source, Func<XmlNode, bool> func)
{
List<XmlNode> list = new List<XmlNode>();
foreach (XmlNode item in source)
{
if (func(item))
list.Add(item);
} return list;
}
}

XmlExtensionMethods

  2. 在项目IdleTest.DemoToUse添加引用

  3. 由于对类似XmlNode测试时需要用到Stub,故须对System.Xml添加Fakes程序集(参见上一篇《VS2012 Unit Test——Microsoft Fakes入门》)

  4. 在IdleTest.DemoBeTest项目下添加类,由于是对扩展方法进行测试,故要记得“using IdleTest.DemoBeTest;“

    [TestClass]
public class XmlExtensionMethodsTest : BaseXmlTest
{
#region XML /// <summary>
///Find 的测试
///</summary>
[TestMethod()]
public void FindTest()
{
AssertCommon.AssertEmpty<XmlNodeList, XmlNode>(new XmlNodeList[]{
GetStubXmlNodeList(), GetStubXmlNodeList(null), GetStubXmlNodeList(null, null),
xmlBuilder.GetNodeList()
}, true, p => p.Find(falseFunc)); XmlNodeList nodeList = xmlBuilder.GetNodeList(DEFAULT_XPATH);
XmlNode expectedNode = GetExpectedTureNode();
XmlNode actualNode = nodeList.Find(trueFunc);
AssertCommon.AssertEqual(expectedNode, actualNode);
} /// <summary>
///FindAll 的测试
///</summary>
[TestMethod()]
public void FindAllTest()
{
AssertCommon.AssertEmpty<XmlNodeList, ICollection<XmlNode>>(new XmlNodeList[]{
GetStubXmlNodeList(), GetStubXmlNodeList(null), GetStubXmlNodeList(null, null),
xmlBuilder.GetNodeList()
}, true, p => p.FindAll(falseFunc)); XmlNodeList nodeList = xmlBuilder.GetNodeList(DEFAULT_XPATH);
XmlNodeList expectedNodes = GetExpectedTureNodes();
ICollection<XmlNode> actualNodes = nodeList.FindAll(trueFunc);
AssertCommon.AssertEqual<IEnumerable>(expectedNodes, actualNodes);
} /// <summary>
///GetAttribute 的测试
///</summary>
[TestMethod()]
public void GetAttributeTest()
{
XmlNode node = GetExpectedTureNode();
GetAttributeTestHelper<string>(node, ATTR_VALUE, ATTR_NAME, p => node.GetAttribute(p)); XmlNode attrValueNull = GetAttrValueNullNode();
AssertCommon.AssertEmpty<string>(attrValueNull.GetAttribute(ATTR_INT_NAME));
} [TestMethod()]
public void GetAttributeTest1()
{
XmlNode node = GetExpectedTureNode();
GetAttributeTestHelper<string>(node, ATTR_VALUE, ATTR_NAME, p => node.GetAttribute<string>(p)); node = xmlBuilder.GetNode(string.Format("{0}[@{1}='{2}']", DEFAULT_XPATH, ATTR_INT_NAME, ATTR_INT_VALUE));
GetAttributeTestHelper<int>(node, ATTR_INT_VALUE, ATTR_INT_NAME, p => node.GetAttribute<int>(p)); AssertCommon.AssertEqual<string, int>(, TestCommon.GetEmptyStrings(), true, p => node.GetAttribute<int>(p)); XmlNode attrValueNull = GetAttrValueNullNode();
int actual = attrValueNull.GetAttribute<int>(ATTR_INT_NAME);
AssertCommon.AssertEmpty<int>(actual, false);
AssertCommon.AssertEqual(, actual);
} /// <summary>
///GetAttribute 的测试
///</summary>
public void GetAttributeTestHelper<T>(XmlNode node, T expected, string attr, Func<string, T> testFunc)
{
AssertCommon.AssertEmpty<string, string>(
TestCommon.GetEmptyStrings(), true, p => node.GetAttribute(p)); AssertCommon.AssertEqual(expected, testFunc(attr));
}
#endregion
}

XmlExtensionMethodsTest

  5.运行测试,OK!

  6. 运行覆盖率分析,刚好100%。

【4】最后一个内容,其实就是将XML字符串保存的一个方法的测试,这里就涉及到了存储介质,我是先调用方法保存,然后再从保存的路径中获取Xml文档再将他们的文本对比。目前没有找到更好的测试方式,同样的如您有其他办法,愿闻其详。

    [TestClass()]
public class XmlHelperTest : BaseXmlTest
{
/// <summary>
///CopyFile 的测试
///</summary>
[TestMethod()]
public void XmlToFileTest()
{
string expected = base.xmlBuilder.InnerXml;
string toPath = TestCommon.TestFilePath + "testxmlhelper.xml";
XmlHelper.XmlToFile(expected, toPath); XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(toPath); AssertCommon.AssertEqual(expected, xmlDoc.InnerXml); //为空时的测试
}
}

VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式的更多相关文章

  1. VS2012 Unit Test 个人学习汇总(含目录)

    首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.TestTools.UnitTesting.a ...

  2. VS2012 Unit Test

    VS2012 Unit Test 个人学习汇总(含目录) 首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualS ...

  3. VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试

    [提示] 1. 阅读文本前希望您具备如下知识:了解单元测试,了解Dynamic,熟悉泛型(协变与逆变)和Lambda,熟悉.NET Framework提供的 Action与Func委托.2.如果您对单 ...

  4. VS2012 Unit Test——Microsoft Fakes入门

    如题,本文主要作为在VS2012使用Fakes的入门示例,开发工具必须是VS2012或更高版本. 关于Fakes的MSDN地址:http://msdn.microsoft.com/en-us/libr ...

  5. MySQL之库相关操作

    一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...

  6. 第二篇:MySQL库相关操作

    一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...

  7. MySQL库相关操作

    ========MySQL库相关操作====== 一.系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信 ...

  8. 二:Mysql库相关操作

    1:系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等.performance_schema: My ...

  9. MySQL 库、表、记录、相关操作(3)

    MySQL 库.表.记录.相关操作(3) 单表查询 """ 增: insert [into] [数据库名.]表名[(字段1[, ..., 字段n])] values (数 ...

随机推荐

  1. Dancing Links and Exact Cover

    1. Exact Cover Problem DLX是用来解决精确覆盖问题行之有效的算法. 在讲解DLX之前,我们先了解一下什么是精确覆盖问题(Exact Cover Problem)? 1.1 Po ...

  2. 喜马拉雅音频下载器 V1.2 支持专辑批量下载 喜马拉雅mp3下载导出 喜马拉雅下载器

    出差一个星期回来看邮箱,发现好多网友评论说网站又更新了,老程序不能用了,有热心网友放出修改版的,我就不重复造车了..大家可以去这里下载 http://blog.csdn.net/suqingheang ...

  3. ABP(现代ASP.NET样板开发框架)系列之5、ABP启动配置

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之5.ABP启动配置 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  4. ABP(现代ASP.NET样板开发框架)系列之19、ABP应用层——审计日志

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之19.ABP应用层——审计日志 ABP是“ASP.NET Boilerplate Project (ASP.NET ...

  5. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  6. 【Win 10 应用开发】多媒体转码

    上次本来说好,今天咱们来讨论 socket 相关的话题,但,对于 socket ,老周还有一些问题没弄清楚,等弄清楚了,再和大伙伴们一起探讨.故,今天咱们扯一扯多媒体转码的事. 听起来挺复杂的,不过, ...

  7. MVC5 网站开发之二 创建项目

    昨天对项目的思路大致理了一下,今天先把解决方案建立起来.整个解决包含Ninesky.Web.Ninesky.Core,Ninesky.DataLibrary等3个项目.Ninesky.Web是web应 ...

  8. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...

  9. PHP用单例模式实现一个数据库类

    使用单例模式的出发点: 1.php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源. 2.如果系统中需要有一个类来全局控制某些 ...

  10. 使用swagger作为restful api的doc文档生成

    初衷 记得以前写接口,写完后会整理一份API接口文档,而文档的格式如果没有具体要求的话,最终展示的文档则完全决定于开发者的心情.也许多点,也许少点.甚至,接口总是需要适应新需求的,修改了,增加了,这份 ...