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