【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); //爲空時的測試 } }