[作者提醒:從Visual Studio 2015 RC 版本開始,“Smart Unit Tests”已經更名為“IntelliTest”]
??在這篇文章中,我們講到IntelliTest如何自動生成測試用例,以及當被測代碼改變時,如何更新這些用例。針對一段被測代碼,IntelliTest會生成一個PUT方法,和一個或多個測試用例方法。在下面的示例圖中,展示了以Pex開頭的特性的使用,它用于定義用例和被測代碼的約束關系,這些特性都定義在Microsoft.Pex.Framework命名空間下。
在編譯時,這些特性將作為它們所作用的類或方法的元數據,嵌入到程序集中。在后續的調用中,IntelliTest通過反射,拿到元數據,并拿到定義在PUT上的契約。
??也許你已經發現了,自動生成的測試用例都是傳統單元測試,它們也會顯示在Visual Studio 的測試用例瀏覽窗口中,就像你手寫的那些測試用例一樣。不過,自動生成的測試用例并不希望被編輯。每一個自動生成的測試用例都會調用PUT方法,PUT方法又會調用被測代碼。
??將自動生成的單元測試和PUT測試方法分開,使得PUT測試方法可以作為一個統一的可以驗證被測代碼正確性的地方,通過PUT測試方法的調用,所有測試用例都將被驗證。在以后的博客中,我們會討論正確性驗證的方法,但這不是本篇博客討論的重點。將自動生成的測試用例和PUT測試方法放在同一個程序集中也是非常重要。
??關于自動生成的測試用例的管理,可遵循如下規則:
- 防止重復的用例。使用IntelliTest的過程中,測試引擎會經常性的探測被測代碼,并生成測試用例,因此很可能會生成一些重復的用例,這些重復的用例都需要被移除掉。
- 刪除那些無關緊要的測試用例。隨著被測代碼的修改,之前的測試用例很可能變得無效,因此這部分測試用例需要被移除掉。
??那么如何實踐以上規則呢?
??將自動生成的測試用例和PUT測試方法放在一個程序集中,測試引擎通過掃描程序集中的Pex特性,優先處理已經存在的測試用例(這些測試用例都被PexGeneratedBy修飾),它獲取到這些用例的源碼,然后移除其中的空白占位符,然后使用最終的字符串計算hash值。做完這些之后,測試引擎就有了一個測試用例集合對應的hash字典,有了這個字典,在新的一次探測過程中,就可以決定哪些測試用例已存在,而哪些是新添加的。對于那些沒有在新的探索中生成的用例,引擎會主動刪除之。
??讓測試用例和隨時有變更可能的代碼保持同步是一件很困難的事情,主動去修改大量測試用例以適配新的被測代碼,開銷無疑是巨大的。我們希望這套自動管理的測試用例的機制可以在面對這種變更時,可以更加輕松的應對。
2017-10-20 10:43:52