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

  项目结构如下图所示

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); //为空时的测试
}
}
上一篇:leetcode 39. Combination Sum 、40. Combination Sum II 、216. Combination Sum III


下一篇:[Hibernate] - Interceptors and events