This extensively classroom-tested text uses an innovative approach to explaining software testing, and covers the latest techniques to test software such as OO, web applications, and embedded software. This new edition features vastly expanded coverage of the basics and the JUnit framework, as well as many new examples and exercises.
自本書的第1版發(fā)行以來,軟件測試領(lǐng)域已經(jīng)發(fā)生了太多變化。高水平的測試現(xiàn)在在工業(yè)界已經(jīng)變得非常普遍。測試自動化已經(jīng)無處不在,工業(yè)界絕大多數(shù)領(lǐng)域都默認必須使用測試自動化。敏捷過程和測試驅(qū)動開發(fā)變得廣為人知而且許多人都在使用。更多的學校在本科和研究生階段開設了軟件測試的課程。ACM關(guān)于軟件工程的課程大綱在很多地方都包括了軟件測試,并且把它設置為強烈推薦的課程[Ardis et al.,2015]。
第2版包括了新的特點和內(nèi)容,同時保留了第1版中深受數(shù)百位教師喜歡的結(jié)構(gòu)、理念和在線資源。
第2版的新內(nèi)容
當拿到一本書的新版本時,任何教師要做的第一件事就是研究所講的課程中需要做哪些改動。因為我們已經(jīng)經(jīng)歷過很多次這樣的情況了,所以我們想讓讀者很容易地明白第2版的改動。
第1版第2版主題
第一部分 軟件測試基礎
第1章第1章為什么測試軟件(動機)
第2章模型驅(qū)動測試設計(抽象)
第3章測試自動化(JUnit)
第4章測試優(yōu)先(TDD)
第5章基于準則的測試設計(準則)
第二部分 覆蓋準則
第2章第7章圖覆蓋
第3章第8章邏輯覆蓋
第4章第9章基于語法的測試
第5章第6章輸入空間劃分
第三部分 實踐中的測試
第6章第10章管理測試過程
第11章編寫測試計劃
第12章測試實現(xiàn)
第13章軟件演化中的回歸測試
第14章編寫有效的測試預言
第7章N/A技術(shù)
第8章N/A工具
第9章N/A挑戰(zhàn)
第2版最明顯、最大的改動是將第1版中導言性質(zhì)的第1章擴展成了5個不同的章節(jié)。這個重大的擴展使本書變得更加完善。新版的第一部分是由我們的課程講義發(fā)展而來的。第1版發(fā)行之后,我們開始不斷地向測試課程中添加更多的基礎內(nèi)容。這些新的想法最終組織成了這5個新的章節(jié)。新版第1章用到了很多第1版第1章的內(nèi)容,包括動機和基本概念。第1章結(jié)束的時候包括了一段來自2002年的RTI報告,這篇報告討論的是在開發(fā)晚期才進行測試所造成的巨大成本。每個軟件測試研究的項目提案都會引用這個重要的調(diào)查研究結(jié)果。在完成第1版后,我們意識到這本書的關(guān)鍵創(chuàng)新點在于將測試設計成抽象的活動,獨立于用來生成測試用例的軟件工件(artifact)。這個觀點暗示軟件設計已經(jīng)變成一個和以往不同的過程。這樣的想法引出了第2章,這一章講述如何將測試準則和實踐相結(jié)合。在我們做咨詢的過程中,我們已經(jīng)幫助軟件公司包含這一模型以修正其測試過程。
第1版中有個遺憾是沒有提及JUnit或其他的測試自動化架構(gòu)。2016年,JUnit已經(jīng)在工業(yè)界廣泛使用,而且通常用在CS1和CS2的課堂上給作業(yè)自動打分。第3章改正了這個疏忽。在這一章里,我們敘述了測試自動化的概況,說明了實施測試自動化的難點,也明確地教授了JUnit。雖然本書所講的內(nèi)容在很大程度上并不依附于某個具體技術(shù),但在全書的例子和練習中使用統(tǒng)一的測試架構(gòu)是方便讀者理解的。在課堂上,我們通常要求測試必須自動化,也經(jīng)常要求學生在作業(yè)中嘗試別的 “*-Unit”單元測試架構(gòu),比如HttpUnit。我們認為在擁有自動化的測試用例之前,測試機構(gòu)還不具備成功應用測試準則的能力。
很自然地,我們在第4章講到了測試驅(qū)動開發(fā)(TDD)。雖然TDD和本書的其余部分不太一樣,但這對測試教育者和研究人員來說卻是一個令人激動的主題。原因是TDD把測試提前且放到了軟件開發(fā)的中心位置,測試變成了需求。在第一部分的最后,第5章用抽象的方式介紹了測試準則的概念。軟心豆粒糖(jelly bean)的例子(尤其是在課堂上講述這個例子的時候,我們的學生都很喜歡)和其他概念(如包含關(guān)系)依然在第2版中保留了下來。
第二部分是本書的核心,但在第2版中改動最少。2014年的一天,Jeff問了Paul一個簡單的問題:“第二部分四個章節(jié)的順序為什么是現(xiàn)在這樣?”答案是驚愕地沉默,因為我們意識到我們從未想過它們應該出現(xiàn)的順序。事實上,無可爭議地處于軟件測試中心地位的RIPR模型已經(jīng)給出了一個邏輯順序。具體來說,輸入空間劃分不需要可達性、影響或傳播(這些概念在第2章介紹)。圖覆蓋準則只需要測試執(zhí)行“經(jīng)過”待測軟件的一些部分,這就是可達性而沒有影響和傳播。邏輯覆蓋準則需要到達而執(zhí)行謂詞,還要以一種特別的方式使用它進而改變它的結(jié)果。這就是說,這個謂詞被影響了。最后,語法覆蓋不僅要求到達程序的某個地方,同時“變異”的程序狀態(tài)必須和原程序不同,而且這個不同之處必須在程序執(zhí)行之后觀察到。這就是說,程序狀態(tài)的變化要傳播出來。第2版依據(jù)RIPR模型按順序列出來這四個概念,而它們所對應章節(jié)的要求在遞進地增強。從實用的角度來說,我們只是將前一版的第5章(現(xiàn)為第6章)移到了圖覆蓋章節(jié)(現(xiàn)為第7章)之前。
結(jié)構(gòu)上的另一個主要改動是第2版沒有再包含第1版中的第7章到第9章。第1版中的這三章已經(jīng)過時,相比本書的其他部分,這三章用到的頻率較少,所以我們決定在重寫這部分之前先發(fā)表現(xiàn)有的章節(jié)。我們計劃在第3版中更好地描述這三章。
我們還做出了數(shù)百處更加細微的改動。最近的研究發(fā)現(xiàn),測試能夠成功不僅需要一個錯誤值傳播到輸出結(jié)果,而且要求自動化測試預言檢查合適的輸出結(jié)果。這就是說,測試預言必須揭示軟件失敗。因此,新的RIPR模型取代了舊的RIP模型。本書在一
保羅·阿曼(Paul Ammann)是喬治梅森大學軟件工程副教授。他于2007年獲得Volgenau工程學院的杰出教學獎。他領(lǐng)導開發(fā)了應用計算機科學學位,現(xiàn)任軟件工程碩士項目主任。Ammann在軟件工程領(lǐng)域已經(jīng)發(fā)表了超過80篇文章,尤其著重于軟件測試、軟件安全、軟件依賴性和軟件工程教育方向。
杰夫·奧法特(Jeff Offutt)是喬治梅森大學軟件工程教授。他于2013年獲得喬治梅森大學杰出教學獎。他在基于模型測試、基于準則測試、測試自動化、經(jīng)驗軟件工程和軟件維護等方面已經(jīng)發(fā)表了超過165篇文章。他是《軟件測試、驗證和可靠性》期刊的主編。他還幫助創(chuàng)建了IEEE國際軟件測試大會,同時也是uJava項目的創(chuàng)始人。
出版者的話
譯者序
前言
第一部分 軟件測試基礎
第1章 為什么測試軟件 2
1.1 軟件何時會出現(xiàn)問題 3
1.2 軟件測試的目的 6
1.3 參考文獻注解 13
第2章 模型驅(qū)動測試設計 15
2.1 軟件測試基礎 15
2.2 軟件測試活動 17
2.3 基于軟件活動的測試級別 17
2.4 覆蓋準則 19
2.5 模型驅(qū)動測試設計 21
2.5.1 測試設計 22
2.5.2 測試自動化 22
2.5.3 測試執(zhí)行 23
2.5.4 測試評估 23
2.5.5 測試者和抽象 23
2.6 MDTD為什么重要 25
2.7 參考文獻注解 25
第3章 測試自動化 27
3.1 軟件可測性 27
3.2 測試用例的構(gòu)成 28
3.3 測試自動化框架 30
3.3.1 JUnit測試框架 31
3.3.2 數(shù)據(jù)驅(qū)動測試 35
3.3.3 在單元測試中添加參數(shù) 36
3.3.4 從命令行運行JUnit 38
3.4 超越自動化 38
3.5 參考文獻注解 41
第4章 測試優(yōu)先 42
4.1 馴服改動成本曲線 42
4.1.1 改動成本曲線真的被馴服了嗎 43
4.2 測試裝具——守護者 44
4.2.1 持續(xù)集成 45
4.2.2 敏捷方法中的系統(tǒng)測試 45
4.2.3 將測試加入遺留系統(tǒng) 46
4.2.4 敏捷方法中測試的弱點 47
4.3 參考文獻注解 48
第5章 基于準則的測試設計 49
5.1 定義覆蓋準則 49
5.2 不可行性和包含 52
5.3 使用覆蓋準則的好處 53
5.4 下一個部分 54
5.5 參考文獻注解 54
第二部分 覆蓋準則
第6章 輸入空間劃分 58
6.1 輸入域建模 60
6.1.1 基于接口的輸入域建模 61
6.1.2 基于功能的輸入域建模 61
6.1.3 設計特征 62
6.1.4 選擇區(qū)塊和測試值 63
6.1.5 檢查輸入域模型 65
6.2 組合策略準則 66
6.3 檢查特征之間的約束 71
6.4 擴展實例:從JavaDoc中推導IDM 72
6.4.1 設計基于IDM的測試用例中的任務 72
6.4.2 為迭代器設計基于IDM的測試用例 73
6.5 參考文獻注解 78
第7章 圖覆蓋 82
7.1 概述 82
7.2 圖覆蓋準則 86
7.2.1 結(jié)構(gòu)化的覆蓋準則 87
7.2.2 游歷、順路和繞路 90
7.2.3 數(shù)據(jù)流準則 97
7.2.4 圖覆蓋準則間的包含關(guān)系 103
7.3 基于源代碼的圖覆蓋 104
7.3.1 基于源代碼的結(jié)構(gòu)化圖覆蓋 104
7.3.2 基于源代碼的數(shù)據(jù)流圖覆蓋 108
7.4 設計元素的圖覆蓋 116
7.4.1 設計元素的結(jié)構(gòu)化圖覆蓋 116
7.4.2 設計元素的數(shù)據(jù)流圖覆蓋 118
7.5 設計規(guī)范的圖覆蓋 124
7.5.1 測試順序約束 125
7.5.2 測試軟件的行為狀態(tài) 127
7.6 用例的圖覆蓋 134
7.6.1 用例場景 137
7.7 參考文獻注解 137
第8章 邏輯覆蓋 141
8.1 有效的語義邏輯覆蓋準則 141
8.1.1 簡單的邏輯覆蓋準則 142
8.1.2 有效子句覆蓋 144
8.1.3 無效子句覆蓋 148
8.1.4 不可行性和包含 148
8.1.5 讓子句決定謂詞 150
8.1.6 找到滿足準則的取值 153
8.2 語法邏輯覆蓋準則 157
8.2.1 蘊涵項覆蓋 158
8.2.2 極小DNF 159
8.2.3 MUMCUT覆蓋準則 160
8.2.4 卡諾圖 163
8.3 程序的結(jié)構(gòu)化邏輯覆蓋 166
8.3.1 滿足謂詞覆蓋 169
8.3.2 滿足子句覆蓋 170
8.3.3 滿足有效子句覆蓋 171
8.3.4 謂詞轉(zhuǎn)換問題 174
8.3.5 謂詞中的副作用 176
8.4 基于規(guī)范的邏輯覆蓋 178
8.5 有限狀態(tài)機的邏輯覆蓋 180
8.6 參考文獻注解 184
第9章 基于語法的測試 187
9.1 基于語法的覆蓋準則 187
9.1.1 基于通用語法的覆蓋準則 187
9.1.2 變異測試 189
9.2 基于程序的語法 192
9.2.1 編譯器的BNF語法 192
9.2.2 基于程序的變異 193
9.3 集成測試和面向?qū)ο鬁y試 206
9.3.1 BNF集成測試 206
9.3.2 集成變異 206
9.4 基于規(guī)約的語法 212
9.4.1 BNF語法 212
9.4.2 基于規(guī)約的變異 212
9.5 輸入空間的語法 215
9.5.1 BNF語法 215
9.5.2 變異輸入語法 218
9.6 參考文獻注解 222
第三部分 實踐中的測試
第10章 管理測試過程 226
10.1 概述 226
10.2 需求分析和規(guī)約 227
10.3 系統(tǒng)和軟件設計 227
10.4 中間設計 228
10.5 詳細設計 228
10.6 實現(xiàn) 229
10.7 集成 229
10.8 系統(tǒng)部署 229
10.9 運行和維護 229
10.10 實現(xiàn)測試過程 230
10.11 參考文獻注解 230
第11章 編寫測試計劃 231
11.1 分層測試計劃模板 231
11.2 參考文獻注解 233
第12章 測試實現(xiàn) 234
12.1 集成順序 234
12.2 測試替身 235
12.2.1 樁和模擬:測試替身的變種 236
12.2.2 使用測試替身來代替組件 237
12.3 參考文獻注解 240
第13章 軟件演化中的回歸測試 241
13.1 參考文獻注解 243
第14章 編寫有效的測試預言 244
14.1 應該檢查的內(nèi)容 244
14.2 決定正確的測試值 245
14.2.1 對輸出進行基于規(guī)約的直接驗證 246
14.2.2 冗余計算 246
14.2.3 一致性檢查 247
14.2.4 蛻變測試 247
14.3 參考文獻注解 248
測試準則表 250
參考文獻 252
索引 269