[作者提醒:從Visual Studio 2015 RC 版本開始冀惭,“Smart Unit Tests”已經(jīng)更名為“IntelliTest”]
??在這篇文章中尊浓,我們講到IntelliTest如何自動(dòng)生成測試用例伪窖,以及當(dāng)被測代碼改變時(shí),如何更新這些用例。針對一段被測代碼,IntelliTest會生成一個(gè)PUT方法滞谢,和一個(gè)或多個(gè)測試用例方法。在下面的示例圖中除抛,展示了以Pex開頭的特性的使用狮杨,它用于定義用例和被測代碼的約束關(guān)系,這些特性都定義在Microsoft.Pex.Framework命名空間下到忽。
在編譯時(shí)橄教,這些特性將作為它們所作用的類或方法的元數(shù)據(jù),嵌入到程序集中喘漏。在后續(xù)的調(diào)用中颤陶,IntelliTest通過反射,拿到元數(shù)據(jù)陷遮,并拿到定義在PUT上的契約。
??也許你已經(jīng)發(fā)現(xiàn)了垦江,自動(dòng)生成的測試用例都是傳統(tǒng)單元測試帽馋,它們也會顯示在Visual Studio 的測試用例瀏覽窗口中,就像你手寫的那些測試用例一樣比吭。不過绽族,自動(dòng)生成的測試用例并不希望被編輯。每一個(gè)自動(dòng)生成的測試用例都會調(diào)用PUT方法衩藤,PUT方法又會調(diào)用被測代碼吧慢。
??將自動(dòng)生成的單元測試和PUT測試方法分開,使得PUT測試方法可以作為一個(gè)統(tǒng)一的可以驗(yàn)證被測代碼正確性的地方赏表,通過PUT測試方法的調(diào)用检诗,所有測試用例都將被驗(yàn)證。在以后的博客中瓢剿,我們會討論正確性驗(yàn)證的方法逢慌,但這不是本篇博客討論的重點(diǎn)。將自動(dòng)生成的測試用例和PUT測試方法放在同一個(gè)程序集中也是非常重要间狂。
??關(guān)于自動(dòng)生成的測試用例的管理攻泼,可遵循如下規(guī)則:
- 防止重復(fù)的用例。使用IntelliTest的過程中,測試引擎會經(jīng)常性的探測被測代碼忙菠,并生成測試用例何鸡,因此很可能會生成一些重復(fù)的用例,這些重復(fù)的用例都需要被移除掉牛欢。
- 刪除那些無關(guān)緊要的測試用例骡男。隨著被測代碼的修改,之前的測試用例很可能變得無效氢惋,因此這部分測試用例需要被移除掉洞翩。
??那么如何實(shí)踐以上規(guī)則呢?
??將自動(dòng)生成的測試用例和PUT測試方法放在一個(gè)程序集中焰望,測試引擎通過掃描程序集中的Pex特性骚亿,優(yōu)先處理已經(jīng)存在的測試用例(這些測試用例都被PexGeneratedBy修飾),它獲取到這些用例的源碼熊赖,然后移除其中的空白占位符来屠,然后使用最終的字符串計(jì)算hash值。做完這些之后震鹉,測試引擎就有了一個(gè)測試用例集合對應(yīng)的hash字典俱笛,有了這個(gè)字典,在新的一次探測過程中传趾,就可以決定哪些測試用例已存在迎膜,而哪些是新添加的。對于那些沒有在新的探索中生成的用例浆兰,引擎會主動(dòng)刪除之磕仅。
??讓測試用例和隨時(shí)有變更可能的代碼保持同步是一件很困難的事情,主動(dòng)去修改大量測試用例以適配新的被測代碼簸呈,開銷無疑是巨大的榕订。我們希望這套自動(dòng)管理的測試用例的機(jī)制可以在面對這種變更時(shí),可以更加輕松的應(yīng)對蜕便。
2017-10-20 10:43:52