【1】个人IdleTest源码地址:http://idletest.codeplex.com/html
【2】IdleTest改动说明:2013年10月份在保持原有功能的状况下对其动了较大的手术,首先将基本的断言方法分离成为接口,以便于扩展,例如如今能够支持切换测试框架(实现IAssertInstance接口,并修改AssertCommon_Editable.cs中的DEFAULT_INSTANCE为新的对象),而后就是增长对xml一些操做的支持。尽管如此,但并非彻底遵循OCP,能够说对扩展开放,对修改适当关闭。体如今AssertCommon_Editable.cs文件,该文件提供了AssertCommon的一个分部类,用以进行修改和增长功能,而AssertCommon.cs则尽量不去修改,因此这是一个局限性,可是又因为须要保留AssertCommon(由于该类是IdleTest最根本的功能)这个包含大量静态成员的类,致使了难以实现对修改关闭的原则了。node
项目结构以下图所示框架
项目多了就要画些图示说明,否则过段时间本身都不知道这个代码为何是这样子的结构了。ide
以上都是比较简单的图示,下方这个则以接口和类为单位进行的类图建模post
【3】测试对Xml的操做之个人方式,若是您有更好的方式请不吝分享。测试
1. 假设在IdleTest.DemoBeTest项目下有类XmlExtensionMethods须要测试ui
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; } }
2. 在项目IdleTest.DemoToUse添加引用this
3. 因为对相似XmlNode测试时须要用到Stub,故须对System.Xml添加Fakes程序集(参见上一篇《VS2012 Unit Test——Microsoft Fakes入门》)url
4. 在IdleTest.DemoBeTest项目下添加类,因为是对扩展方法进行测试,故要记得“using IdleTest.DemoBeTest;“spa
[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>(0, 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(0, 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 }
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); //为空时的测试 } }