单元测试 – 如何对具有复杂输入输出的方法进行单元测试
当你有一个简单的方法,例如sum(int x,int y)时,很容易编写单元测试.您可以检查该方法是否正确总和两个样本整数,例如2 3应该返回5,然后您将检查相同的一些“非常”数字,例如负值和零.每个都应该是单独的单元测试,因为单个单元测试应该包含单个断言.
当你有一个复杂的输入输出时你会怎么做?以一个Xml解析器为例.您可以使用单个方法解析(String xml)来接收String并返回Dom对象.您可以编写单独的测试,检查某些文本节点是否正确解析,属性是否已解析,该子节点属于父节点等.对于所有这些,我可以编写一个简单的输入,例如 <root><child/></root> 这将用于检查节点之间的父子关系等等,以满足其他期望. 现在,看看下面的Xml: <root> <child1 attribute11="attribute 11 value" attribute12="attribute 12 value">Text 1</child1> <child2 attribute21="attribute 21 value" attribute22="attribute 22 value">Text 2</child2> </root> 为了检查该方法是否正常工作,我需要检查许多复杂的条件,例如属性11和属性12属于element1,文本1属于child1等.我不想在我的单元测试中放置多个断言.我怎么能做到这一点? 解决方法
您所需要的只是在单独的测试中检查SUT(被测系统)的一个方面.
[TestFixture] public class XmlParserTest { [Test,ExpectedException(typeof(XmlException))] public void FailIfXmlIsNotWellFormed() { Parse("<doc>"); } [Test] public void ParseShortTag() { var doc = Parse("<doc/>"); Assert.That(doc.DocumentElement.Name,Is.EqualTo("doc")); } [Test] public void ParseFullTag() { var doc = Parse("<doc></doc>"); Assert.That(doc.DocumentElement.Name,Is.EqualTo("doc")); } [Test] public void ParseInnerText() { var doc = Parse("<doc>Text 1</doc>"); Assert.That(doc.DocumentElement.InnerText,Is.EqualTo("Text 1")); } [Test] public void AttributesAreEmptyifThereAreNoAttributes() { var doc = Parse("<doc></doc>"); Assert.That(doc.DocumentElement.Attributes,Has.Count(0)); } [Test] public void ParseAttribute() { var doc = Parse("<doc attribute11='attribute 11 value'></doc>"); Assert.That(doc.DocumentElement.Attributes[0].Name,Is.EqualTo("attribute11")); Assert.That(doc.DocumentElement.Attributes[0].Value,Is.EqualTo("attribute 11 value")); } [Test] public void ChildNodesInnerTextAtFirstLevel() { var doc = Parse(@"<root> <child1>Text 1</child1> <child2>Text 2</child2> </root>"); Assert.That(doc.DocumentElement.ChildNodes,Has.Count(2)); Assert.That(doc.DocumentElement.ChildNodes[0].InnerText,Is.EqualTo("Text 1")); Assert.That(doc.DocumentElement.ChildNodes[1].InnerText,Is.EqualTo("Text 2")); } // More tests ..... private XmlDocument Parse(string xml) { var doc = new XmlDocument(); doc.LoadXml(xml); return doc; } } 这种方法有很多优点: >容易缺陷的位置 – 如果 UPD:看看Gerard Meszaros(xUnit测试模式的作者书)关于主题的说法:xunitpatterns
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |