如何編寫綜合的單元測試方案(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.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97