本書從開發(fā)者測試的角度,介紹了軟件測試的產(chǎn)生與發(fā)展以及開發(fā)者與測試的關系;講述了程序靜態(tài)分析、邏輯覆蓋測試、程序插樁與變異測試等開發(fā)者需要掌握的測試方法和技術;結(jié)合示例講解了單元測試、集成測試中開發(fā)者應當要能發(fā)現(xiàn)和避免的各種問題;由淺入深,介紹了測試工具JUnit的使用;*后介紹了由慕測科技提供的開發(fā)者測試平臺和全國大學生軟件測試大賽。
當前,信息需求的持續(xù)增長和信息技術的快速發(fā)展加快了軟件產(chǎn)品的研發(fā)速度,同時也大大增加了軟件產(chǎn)品的測試壓力。以互聯(lián)網(wǎng)、移動應用等產(chǎn)品為例,眾多軟件公司普遍采用微小改進、快速迭代、反饋收集、及時響應等手段來提高軟件的迭代速度,縮短軟件產(chǎn)品的發(fā)布流程。顯然,僅僅依賴測試人員已經(jīng)難以滿足市場和客戶對產(chǎn)品質(zhì)量的需求,這就要求開發(fā)人員也深入?yún)⑴c到軟件測試過程中,與測試人員共同完成軟件產(chǎn)品的質(zhì)量保證工作。在本書中,我們定義由開發(fā)者承擔的與代碼相關的軟件測試工作為開發(fā)者測試。
本書從開發(fā)者測試出現(xiàn)的背景與意義、開發(fā)者所應掌握的基本和高級程序分析方法以及軟件測試技術、開發(fā)者所應掌握的軟件測試分析輔助工具、用于開發(fā)者測試教學和競賽的慕測平臺等多個方面對開發(fā)者測試進行系統(tǒng)性介紹。相信通過本書的學習,讀者可以對開發(fā)者參與測試的必要性、開發(fā)者測試所涵蓋的內(nèi)容有初步的認識和了解,同時能夠結(jié)合本書的示例及平臺鍛煉自己的測試能力。
本書適用于兩類不同的讀者:1)在高等院校學習和工作的教師和學生,本書有助于他們理解和認識測試工作承擔者的責任,并為他們學習和鍛煉自身的測試能力提供方向和平臺;2)軟件產(chǎn)業(yè)的開發(fā)人員、測試人員和管理人員,本書有助于他們認識開發(fā)者在測試工作中的重要性和所應承擔的工作內(nèi)容,以及開發(fā)者所應具備的測試技能。
本書講述的方法是通用的,可以用于測試任何類型的計算機軟件。但是,為了使讀者更好地理解和學習本書的開發(fā)者測試方法,本書提供了大量Java示例代碼以及面向Java的程序分析、測試工具。這些示例和工具可以在任何支持Java的操作系統(tǒng)(如Windows、Linux、Mac)、開發(fā)環(huán)境(如Eclipse、IntelliJ、Sublime Text)中開發(fā)、測試和運行。
本書共包含8章及一個附錄,除第7章與第8章外,其他章節(jié)的內(nèi)容互不相關,因而讀者可選擇其中部分章節(jié)進行閱讀。
第1章:開發(fā)者測試概述。本章在研究和分析開發(fā)者與軟件測試關系的基礎上,介紹了開發(fā)者測試的定義、背景與意義。同時,本章還從靜態(tài)測試與動態(tài)測試、白盒測試與黑盒測試、不同測試工具間的對比中分析得到開發(fā)者測試所涉及的方法、技術與工具。此外,本章還討論了開發(fā)者測試技術未來的趨勢,并介紹了支持開發(fā)者測試教學與競賽的慕測平臺。
第2章:程序靜態(tài)分析。本章對軟件靜態(tài)測試的基礎程序靜態(tài)分析方法進行了介紹。通過代碼評審、結(jié)構分析等方法可以有效地檢測出程序中的邏輯錯誤,而程序流程分析(如控制流分析、數(shù)據(jù)流分析)則可以更細粒度地反映程序中語句間、變量間的關聯(lián)。此外,本章還介紹了輔助程序正確性證明的靜態(tài)/動態(tài)符號執(zhí)行方法,便于讀者了解更高級的程序分析方法。
第3章:白盒測試。白盒測試要求軟件內(nèi)部的邏輯結(jié)構透明可見,因此更適合由軟件項目的開發(fā)者來承擔。本章介紹了兩類主要的白盒測試方法,包括以程序內(nèi)部邏輯結(jié)構為基礎的邏輯覆蓋測試方法和以程序路徑為基礎的路徑覆蓋測試方法。與此同時,本章還比較了不同白盒測試方法的測試強度,并介紹了用于度量程序復雜度的環(huán)復雜度方法。
第4章:程序插樁與變異測試。本章介紹了用于獲取程序運行時信息的程序插樁方法,以及用于度量測試用例集缺陷檢測能力的變異測試方法。對于程序插樁方法,本章詳細介紹了插樁位置、類型、數(shù)量的選擇方法;對于變異測試方法,本章詳細介紹了變異算子的設計與選擇方法。同時,本章還介紹了工具JaCoCo和PITest,以便讀者體驗Java程序的運行時信息收集和變異測試過程。
第5章:單元測試。單元測試是對軟件基本組成單元(如方法、函數(shù)、過程)的測試。在測試過程中要完成初始狀態(tài)的創(chuàng)建、測試結(jié)果的驗證、測試資源的釋放等工作,這些工作適合開發(fā)者使用代碼控制開展。本章在介紹單元測試框架的基礎上,進一步闡述了單元測試的各項內(nèi)容,使讀者能針對不同的測試對象分析、建立相應的測試模型。
第6章:集成測試。通過單元測試的軟件模塊并不能保證在整合后依然運行正確,因此需要做集成測試以進一步驗證。本章介紹了集成測試過程、集成測試所面向的缺陷類型以及分析方法,并詳細介紹了多種集成測試策略。同時,本章還討論了不同集成測試策略的優(yōu)缺點,并對它們各自的適用場景進行了分析,測試人員可據(jù)此選擇合適的集成測試策略。
第7章:JUnit基礎。工欲善其事,必先利其器。JUnit是開發(fā)者開展單元測試的一把利器。本章對Java單元測試框架的基本功能(如注解、測試類與測試方法、錯誤與異常處理、批量測試)進行了詳細的介紹,使讀者對JUnit的功能和適用范圍有了詳細的了解。本章還穿插了數(shù)個JUnit示例程序,幫助讀者更快、更方便地學習Java單元測試。
第8章:JUnit深入應用。在前一章介紹JUnit基本功能的基礎上,本章對JUnit的高級功能進行了介紹,包括用于提高測試代碼開發(fā)效率的匹配器功能,面向Controller和Private函數(shù)的測試功能、Stup測試功能和Mock測試功能。同時,本章還介紹了JUnit與常用Java開發(fā)框架(如Ant、Maven)的集成方法,讀者可據(jù)此配置來構建更方便的Java單元測試環(huán)境。
附錄:慕測科技開發(fā)者測試平臺。實踐練習是提高開發(fā)者測試能
前 言
第1章 開發(fā)者測試概述 1
1.1 開發(fā)者與軟件測試 1
1.1.1 測試和調(diào)試 1
1.1.2 開發(fā)者測試 3
1.1.3 PIE模型 4
1.2 開發(fā)者測試方法與技術 6
1.2.1 靜態(tài)測試與動態(tài)測試 6
1.2.2 黑盒測試與白盒測試 8
1.2.3 失效重現(xiàn) 9
1.3 開發(fā)者測試工具 9
1.3.1 靜態(tài)測試掃描工具 9
1.3.2 測試覆蓋分析工具 12
1.4 開發(fā)者測試趨勢 14
1.4.1 軟件開發(fā)和運營困境 14
1.4.2 DevOps介紹 16
1.4.3 DevOps中的開發(fā)者測試 17
1.5 慕測開發(fā)者測試 19
1.6 小結(jié) 27
習題1 28
第2章 程序靜態(tài)分析 29
2.1 程序靜態(tài)分析概述 29
2.1.1 代碼評審 30
2.1.2 結(jié)構分析 31
2.2 程序流程分析 32
2.2.1 控制流分析 32
2.2.2 數(shù)據(jù)流分析 33
2.3 符號執(zhí)行 35
2.3.1 靜態(tài)符號執(zhí)行 36
2.3.2 動態(tài)符號執(zhí)行 38
2.4 編程規(guī)范和規(guī)則 39
2.5 程序靜態(tài)分析工具 42
2.5.1 工具簡介 42
2.5.2 工具安裝與評估 42
2.6 小結(jié) 48
習題2 48
第3章 白盒測試 50
3.1 邏輯覆蓋測試 50
3.1.1 語句覆蓋 52
3.1.2 分支覆蓋 54
3.1.3 條件覆蓋 56
3.1.4 條件/判定覆蓋 58
3.1.5 修正條件/判定覆蓋 61
3.1.6 條件組合覆蓋 63
3.2 路徑覆蓋測試 65
3.2.1 環(huán)復雜度 65
3.2.2 基本路徑覆蓋 66
3.2.3 主路徑覆蓋 69
3.2.4 循環(huán)結(jié)構測試 72
3.3 小結(jié) 74
習題3 74
第4章 程序插樁與變異測試 77
4.1 程序插樁 77
4.1.1 程序插樁概述 77
4.1.2 程序插樁示例 78
4.1.3 程序插樁工具JaCoCo 79
4.2 變異測試 84
4.2.1 變異測試概述 84
4.2.2 變異測試方法 85
4.2.3 變異測試工具PITest 89
4.3 小結(jié) 91
習題4 91
第5章 單元測試 94
5.1 單元測試概述 94
5.2 單元測試框架 95
5.3 單元測試內(nèi)容 96
5.3.1 算法邏輯 96
5.3.2 模塊接口 97
5.3.3 數(shù)據(jù)結(jié)構 97
5.3.4 邊界條件 98
5.3.5 獨立路徑 98
5.3.6 錯誤處理 99
5.3.7 輸入數(shù)據(jù) 99
5.3.8 表達式與SQL語句 100
5.4 慕測單元測試實例 100
5.5 小結(jié) 102
習題5 103
第6章 集成測試 105
6.1 集成測試概述 105
6.1.1 集成測試過程 106
6.1.2 集成測試缺陷類型 107
6.2 集成測試分析 110
6.3 集成測試策略 112
6.3.1 一次性集成與增量式集成 112
6.3.2 自頂向下與自底向上集成 114
6.3.3 基于調(diào)用圖的集成 117
6.3.4 其他集成測試策略 118
6.4 小結(jié) 124
習題6 124
第7章 JUnit基礎 127
7.1 一個JUnit實例 127
7.2 注解 132
7.3 測試類與測試方法 135
7.3.1 Assert 135
7.3.2 TestCase 139
7.3.3 TestResult 141
7.3.4 TestSuite 142
7.4 錯誤與異常處理 143
7.4.1 錯誤和異常 143
7.4.2 異常處理 144
7.5 批量測試 146
7.5.1 參數(shù)化測試 146
7.5.2 打包測試 149
7.6 小結(jié) 150
練習7 150
第8章 JUnit深入應用 152
8.1 匹配器 152
8.2 JUnit測試進階 154
8.2.1 Controller測試 154
8.2.2 Stup測試 155
8.2.3 Mock測試 159
8.2.4 Private測試 162
8.3 JUnit集成 165
8.3.1 JUnit-Ant集成 165
8.3.2 JUnit-Maven集成 169
8.4 小結(jié) 171
練習8 171
附錄 慕測科技開發(fā)者測試平臺 172
參考文獻 192