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


    【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>(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
        }
    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);
    
                //为空时的测试
            }
        }
    View Code

  • 相关阅读:
    mysql小白系列_04 datablock
    mysql小白系列_04 binlog(未完)
    mysql小白系列_03 体系结构-线程池
    mysql小白系列_02 mysql源码安装标准化
    国庆小长假来点不一样的,如何用Python爬取了全国近5000家旅游景点,一起来看
    python爬取p站排行榜并自动发送邮件-这个项目赚了500
    利用Azure backup备份和恢复Azure虚拟机(1)
    定制化Azure站点Java运行环境(5)
    定制化Azure站点Java运行环境(4)
    定制化Azure站点Java运行环境(3)
  • 原文地址:https://www.cnblogs.com/FreeDong/p/3379444.html
Copyright © 2020-2023  润新知