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

时间:2022-09-24 07:41:53

【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最根本的功能)这个包含大量静态成员的类,导致了难以实现对修改关闭的原则了。

  项目结构如下图所示

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

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

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

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

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

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

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

VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式
    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添加引用

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

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

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

VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式
    [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%。

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

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

VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式VS2012 Unit Test —— 我对IdleTest库动的大手术以及对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&comma; Action&comma; 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. 二&colon;Mysql库相关操作

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

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

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

随机推荐

  1. php调接口

    浏览器直接访问接口时会弹出账号密码框 当用程序调用时需要加入    curl_setopt($ch, CURLOPT_USERPWD, "$username:$password") ...

  2. 未能加载文件或程序集&OpenCurlyDoubleQuote;Newtonsoft&period;Json&comma; Version&equals;4&period;5&period;0&period;0&comma; Culture&equals;neutral&comma; PublicKeyToken&equals;30ad4fe6b2a6aeed”或它的某一个依赖项 解决方法

    在webconfig中加入这段话就可以了 <runtime>    <assemblyBinding xmlns="urn:schemas-microsoft-com:as ...

  3. shell编程之环境变量

    在shell编程里我们首先接触到的是环境变量,常用命令说明 1. 使用echo命令查看单个环境变量.例如: echo $PATH 2. 使用env查看所有环境变量.例如: env 3. 使用set查看 ...

  4. VS2010类模板修改——添加版权、说明

    VS2010类模板修改——添加版权.说明 最近在学习使用Memcache,就想着用C#代码写一个实现Cache与Memcache以及将来若是能融入Redis切换使用的程序集...不过刚开始写代码,强迫 ...

  5. FFmpeg命令行工具学习&lpar;三&rpar;:媒体文件转换工具ffmpeg

    一.简述 ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑.有了它,我们就可以对媒体文件做很多我们想做的 ...

  6. 【二十九】php之简易微信二维码支付

    参考二维码支付接口文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5 index.php <!DOCTYPE htm ...

  7. JavaScrip t对象和 JSON 数据格式转换

    <script> //定义一个js对象 var person = { firstName: "John", lastName: "Doe", age ...

  8. Java 接口和多态

    接口 1.1 接口的概述 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样 ...

  9. try&period;&period;&period;cath&period;&period;&period;finally中的return什么时候执行

    一finally可以没有,也可以只有一个.无论有没有发生异常,它总会在这个异常处理结构的最后运行.即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常 ...

  10. koa源码阅读&lbrack;3&rsqb;-koa-send与它的衍生&lpar;static&rpar;

    koa源码阅读的第四篇,涉及到向接口请求方提供文件数据. 第一篇:koa源码阅读-0第二篇:koa源码阅读-1-koa与koa-compose第三篇:koa源码阅读-2-koa-router 处理静态 ...