如何编写综合的单元测试方案(5)

发表于:2012-06-27来源:伯乐在线作者:李琼点击数: 标签:单元测试
ChangeAssert简单地通过映射获取对象的状态,因此,稍后你可以断言到除了你指出的几个具体属性其他的没变。 恭喜,你完成了你的第一个 测试用例 。完成

  ChangeAssert简单地通过映射获取对象的状态,因此,稍后你可以断言到除了你指出的几个具体属性其他的没变。

  恭喜,你完成了你的第一个测试用例。完成一个,还有很多很多等着。

  为什么说是“一个”测试用例?

  那8个测试只是完成了覆盖FirstName属性从“Adam”修改成“Bob”这一个场景,在其他的值没有在错误状态、LastName不为null或空的情况下。让我们看看测试用例的完整清单:

  ●将FirstName值设置为“Adam”

  ●将FirstName值设置为null

  ●将FirstName 设为空串

  ●在LastName值为null的情况下,执行case1-3

  ●在LastName 为空串的情况下,执行case1-3

  ●在FirstName值以null开头的情况下,执行case1-5

  ●在FirstName值以空串开头的情况下,执行case1-5

  目前我们看到了27个不同的场景。如果每个场景需要8个不同测试,仅仅为这一个属性,我们需要执行至多216个测试。根据这种思路,这是相当琐碎的一段代码。因此我们该怎么做呢?

  测试也有代码味道

  回看第一个测试用例的8个测试,它们都有同样的设置和运算。唯一的不同是我们写的断言。在业界这个被称为一个代码味道。事实上,根据维基百科所列的这里应该有两个代码味道:

  ●Duplicated code

  ●重复的代码

  ●Excessively long identifiers

  ●过长的标识符

  我们可以通过将断言合并到一个测试来轻松地消除这两个代码味道:

  [TestMethod]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void Person_FirstName_Set()
 {
 var person = new Person("Adam", "Smith");
 var eventAssert = new PropertyChangedEventAssert(person);
 var errorsChangedAssert = new ErrorsChangedEventAssert(person);
 var changeAssert = new ChangeAssert(person);
 person.FirstName = "Bob";
 Assert.AreEqual("Bob", person.FirstName, "FirstName setter failed");
 Assert.AreEqual("Bob Smith", person.FullName, "FullName not updated with FirstName changed");
 Assert.IsTrue(person.IsChanged, "IsChanged flag was not set when FirstName changed");
 eventAssert.Expect("IsChanged");
 eventAssert.Expect("FirstName");
 eventAssert.Expect("FullName");
 errorsChangedAssert.ExpectNothing("Expected no ErrorsChanged events");
 changeAssert.AssertOnlyChangesAre("FirstName", "FullName", "IsChanged");
 }

原文转自:http://www.ltesting.net