【為什么要寫這本書】
隨著敏捷開(kāi)發(fā)、微服務(wù)架構(gòu)、DevOps逐漸深入人心,頻繁迭代、持續(xù)交付已然成為軟件開(kāi)發(fā)的基本要求。企業(yè)對(duì)自動(dòng)化測(cè)試、持續(xù)測(cè)試的需求也越來(lái)越多,這導(dǎo)致市場(chǎng)上需要大量具備測(cè)試開(kāi)發(fā)技能的專業(yè)人才。遺憾的是,這樣的人才十分稀有。一方面,技術(shù)更新快,企業(yè)對(duì)軟件測(cè)試工程師的技術(shù)要求越來(lái)越高;另一方面,大量測(cè)試工程師不了解測(cè)試框架的原理,不具備獨(dú)立開(kāi)發(fā)測(cè)試框架的能力,找工作越來(lái)越困難。
當(dāng)前軟件行業(yè)存在這樣一種現(xiàn)象:軟件開(kāi)發(fā)職能越分越細(xì),軟件質(zhì)量要求越來(lái)越高,軟件發(fā)布越來(lái)越頻繁,而測(cè)試開(kāi)發(fā)比卻越來(lái)越低。在這個(gè)背景下,作為軟件測(cè)試工程師,不但需要對(duì)被測(cè)軟件有充分的認(rèn)知,還要能夠全局思考,能多維度、系統(tǒng)性地將軟件測(cè)試體系納入公司已有的技術(shù)架構(gòu)下。一個(gè)測(cè)試工程師就是一個(gè)測(cè)試團(tuán)隊(duì)成為眾多互聯(lián)網(wǎng)公司的需求。作為技術(shù)能力的直接體現(xiàn),自研自動(dòng)化測(cè)試框架就變成了軟件測(cè)試工程師的剛需技能。
然而,現(xiàn)實(shí)情況是,除了少數(shù)公司外,大部分公司的軟件測(cè)試工程師執(zhí)行手工測(cè)試和自動(dòng)化測(cè)試的時(shí)間比例仍為6:4、7:3甚至9:1。他們既無(wú)法勝任有更高技術(shù)要求的測(cè)試工作,又無(wú)法在工作中提升自己。用自研框架將測(cè)試流水線融入公司的技術(shù)體系,就變成了一句空談。
基于此,筆者在拉勾教育開(kāi)設(shè)了《測(cè)試開(kāi)發(fā)入門與實(shí)戰(zhàn)》專欄,指導(dǎo)測(cè)試工程師從功能測(cè)試向測(cè)試開(kāi)發(fā)轉(zhuǎn)型。在專欄開(kāi)設(shè)后的短短幾個(gè)月內(nèi),訂閱學(xué)習(xí)的軟件測(cè)試工程師就超過(guò)了1.22萬(wàn)人。通過(guò)打牢基礎(chǔ)、項(xiàng)目實(shí)戰(zhàn)、能力修煉、深入原理幾個(gè)模塊的練習(xí),很多測(cè)試工程師走上了測(cè)試開(kāi)發(fā)的崗位。與此同時(shí),在讀者粉絲群、微信公眾號(hào)iTesting里,筆者也收到了大量咨詢和討論,其中典型的幾個(gè)問(wèn)題如下。
自研測(cè)試框架的模塊和實(shí)例,您是怎么總結(jié)出來(lái)的?
為什么我想不到這么設(shè)計(jì),能否分享一下您的設(shè)計(jì)思路?
能否從0到1地帶我們搭建一個(gè)完全自研的測(cè)試框架?
在讀者的熱情留言的鼓舞下,筆者充分調(diào)研了市面上的自動(dòng)化測(cè)試、測(cè)試開(kāi)發(fā)類圖書,決定以自研自動(dòng)化測(cè)試框架本身為側(cè)重點(diǎn),寫一本詳細(xì)講解自動(dòng)化測(cè)試框架搭建、原理、設(shè)計(jì)原則和具體實(shí)現(xiàn)的書。
【讀者對(duì)象】
本書適合以下讀者:
希望搭建企業(yè)級(jí)測(cè)試框架的軟件測(cè)試人員。
希望深入了解測(cè)試框架設(shè)計(jì)思路、工作原理、實(shí)現(xiàn)邏輯的中級(jí)測(cè)試工程師。
希望轉(zhuǎn)型測(cè)試開(kāi)發(fā)的初級(jí)自動(dòng)化測(cè)試工程師、手工測(cè)試人員。
希望提升團(tuán)隊(duì)自動(dòng)化測(cè)試技術(shù)水平的測(cè)試管理者。
對(duì)自動(dòng)化測(cè)試、測(cè)試開(kāi)發(fā)技術(shù)有實(shí)際需求的軟件測(cè)試人員。
高等院校軟件專業(yè)的學(xué)生。
【本書特色】
本書由淺入深地介紹了自動(dòng)化測(cè)試框架的實(shí)現(xiàn)原理、架構(gòu)設(shè)計(jì)、工程實(shí)踐,通過(guò)先簡(jiǎn)述框架模型,再介紹開(kāi)發(fā)測(cè)試框架涉及的知識(shí)點(diǎn),后帶領(lǐng)讀者編碼實(shí)現(xiàn)自動(dòng)化測(cè)試框架功能模塊的方式,將開(kāi)發(fā)測(cè)試框架涉及的重要功能點(diǎn)一一自研實(shí)現(xiàn),這些功能點(diǎn)包括測(cè)試環(huán)境切換、數(shù)據(jù)驅(qū)動(dòng)、自動(dòng)化測(cè)試用例組織、在運(yùn)行中挑選測(cè)試用例、并發(fā)執(zhí)行測(cè)試用例、錯(cuò)誤處理、日志系統(tǒng)搭建、測(cè)試報(bào)告、API測(cè)試和UI測(cè)試融合以及集成測(cè)試框架到CI/CD系統(tǒng)等。通過(guò)閱讀本書并跟隨練習(xí),讀者可以體驗(yàn)從寫下行代碼開(kāi)始,到創(chuàng)建一個(gè)完整的、結(jié)合持續(xù)集成和持續(xù)測(cè)試的自動(dòng)化測(cè)試框架的全部過(guò)程,并通過(guò)這個(gè)過(guò)程掌握自動(dòng)化測(cè)試框架開(kāi)發(fā)方法。
【如何閱讀本書】
第1、2章全面介紹自動(dòng)化測(cè)試框架的概念、原理、類型及通用模塊,論述自動(dòng)化測(cè)試框架的設(shè)計(jì)原則,并根據(jù)分層自動(dòng)化測(cè)試的特點(diǎn),結(jié)合當(dāng)下流行的微服務(wù)架構(gòu)下的測(cè)試,詳細(xì)講解如何將分層自動(dòng)化的測(cè)試?yán)砟顟?yīng)用到自動(dòng)化測(cè)試框架的設(shè)計(jì)中,以及微服務(wù)測(cè)試下自動(dòng)化測(cè)試框架應(yīng)該如何規(guī)劃和組織。
第3~5章著重介紹Python語(yǔ)言體系下的兩個(gè)經(jīng)典開(kāi)源框架unittest和pytest的特點(diǎn)、使用方法、實(shí)踐等,并講解部分源碼的實(shí)現(xiàn)原理。學(xué)完本部分內(nèi)容,讀者可以直接使用unittest和pytest搭建一套開(kāi)源的測(cè)試框架。
第6~14章是本書的重點(diǎn),介紹測(cè)試框架的重點(diǎn)功能,從測(cè)試框架的入口交互式命令出發(fā),到完善自動(dòng)化測(cè)試框架,手把手帶領(lǐng)讀者開(kāi)發(fā)測(cè)試框架。學(xué)完本部分內(nèi)容,讀者即可自主開(kāi)發(fā)自動(dòng)化測(cè)試框架。
第15章介紹持續(xù)集成的核心原理、用到的工具,并從項(xiàng)目實(shí)際需求的角度出發(fā),結(jié)合GitHub、Jenkins Blue Ocean、Docker將自動(dòng)化測(cè)試框架集成到自動(dòng)化測(cè)試流水線中,從而實(shí)現(xiàn)持續(xù)測(cè)試。
第16章介紹如何將自動(dòng)化測(cè)試框架發(fā)布至Python官方倉(cāng)庫(kù)供他人下載使用。
通過(guò)閱讀本書,讀者既能了解設(shè)計(jì)原理,又能學(xué)會(huì)設(shè)計(jì)要點(diǎn),還可以跟隨具體介紹詳細(xì)了解源碼構(gòu)建,真正實(shí)現(xiàn)從行代碼開(kāi)始,從0到1完整搭建自研自動(dòng)化測(cè)試框架,并將其嵌入公司的技術(shù)架構(gòu)。相信這個(gè)過(guò)程和體驗(yàn)是那些只告訴你怎么用,不告訴你為什么這么用的開(kāi)源測(cè)試框架不能比擬的。
希望讀者通過(guò)閱讀本書完全掌握自動(dòng)化測(cè)試框架開(kāi)發(fā)方法,也希望讀者不吝分享,將本書推薦給同事和朋友,更希望讀者能以本書所介紹的框架為基礎(chǔ),早日開(kāi)發(fā)出符合自身需求、功能強(qiáng)大的自研測(cè)試框架。
第1章 自動(dòng)化測(cè)試框架基礎(chǔ) 1
1.1 自動(dòng)化測(cè)試框架概述 1
1.1.1 自動(dòng)化測(cè)試框架的定義 1
1.1.2 為什么需要自動(dòng)化測(cè)試框架 2
1.1.3 自動(dòng)化測(cè)試框架的演化 2
1.2 自動(dòng)化測(cè)試框架的通用原理 4
1.3 自動(dòng)化測(cè)試框架的通用模塊 5
1.3.1 基礎(chǔ)模塊 5
1.3.2 管理模塊 6
1.3.3 運(yùn)行模塊 6
1.3.4 統(tǒng)計(jì)模塊 6
1.4 自動(dòng)化測(cè)試框架的類型 7
1.4.1 簡(jiǎn)單測(cè)試框架 7
1.4.2 X-Driven測(cè)試框架 7
1.4.3 混合型測(cè)試框架 8
1.4.4 不同類型測(cè)試框架的對(duì)比 8
1.5 自動(dòng)化測(cè)試框架的設(shè)計(jì)原則 9
1.6 本章小結(jié) 10
第2章 分層自動(dòng)化測(cè)試與測(cè)試框架 11
2.1 分層自動(dòng)化測(cè)試概述 11
2.1.1 什么是分層自動(dòng)化測(cè)試 11
2.1.2 分層自動(dòng)化測(cè)試的模型 13
2.2 分層自動(dòng)化測(cè)試的誤區(qū) 16
2.2.1 測(cè)試一定是按順序進(jìn)行的 16
2.2.2 分層自動(dòng)化測(cè)試跨層執(zhí)行是反模式 17
2.2.3 分層后單元測(cè)試越多越好 17
2.3 分層自動(dòng)化測(cè)試的實(shí)踐 17
2.3.1 測(cè)試盡量下沉 17
2.3.2 不要重復(fù)測(cè)試 18
2.3.3 合理選擇分層模型 19
2.3.4 考慮用戶場(chǎng)景 19
2.4 微服務(wù)下的自動(dòng)化測(cè)試分層 20
2.4.1 微服務(wù)精要 20
2.4.2 微服務(wù)實(shí)施帶來(lái)的挑戰(zhàn)及解決之道 22
2.5 測(cè)試框架與分層自動(dòng)化 24
2.6 本章小結(jié) 27
第3章 自動(dòng)化測(cè)試框架初體驗(yàn) 28
3.1 他山之石unittest測(cè)試框架核心原理 28
3.1.1 unittest框架概述 28
3.1.2 unittest框架運(yùn)行原理 29
3.2 融會(huì)貫通深入使用unittest測(cè)試框架 32
3.2.1 測(cè)試夾具的使用 32
3.2.2 運(yùn)行指定文件夾下的測(cè)試用例 33
3.2.3 動(dòng)態(tài)查找測(cè)試用例并執(zhí)行 37
3.2.4 按需組裝測(cè)試用例并執(zhí)行 38
3.2.5 自定義測(cè)試用例查找原則 39
3.2.6 執(zhí)行時(shí)忽略某些測(cè)試用例 40
3.3 unittest自動(dòng)化測(cè)試框架搭建實(shí)踐 41
3.3.1 搭建UI自動(dòng)化測(cè)試框架 41
3.3.2 擴(kuò)展unittest的測(cè)試報(bào)告 44
3.3.3 使用unittest三步生成自動(dòng)化測(cè)試框架 48
3.4 擴(kuò)展功能unittest測(cè)試框架集成接口測(cè)試 49
3.4.1 Requests核心講解 49
3.4.2 unittest測(cè)試框架集成接口測(cè)試示例 53
3.5 本章小結(jié) 56
第4章 玩轉(zhuǎn)自動(dòng)化測(cè)試框架 57
4.1 向經(jīng)典致敬測(cè)試框架pytest核心講解 57
4.1.1 pytest基礎(chǔ)用法 58
4.1.2 零代價(jià)遷移unittest測(cè)試框架 60
4.1.3 pytest核心概念 62
4.2 深入探索pytest集成API測(cè)試 63
4.3 游刃有余pytest核心用法 65
4.3.1 自定義測(cè)試用例查找原則 65
4.3.2 前置操作和后置操作的用法 66
4.3.3 靜態(tài)挑選測(cè)試用例 68
4.3.4 動(dòng)態(tài)挑選測(cè)試用例 70
4.3.5 忽略測(cè)試用例 71
4.3.6 失敗測(cè)試用例自動(dòng)重試 73
4.3.7 并發(fā)運(yùn)行測(cè)試用例 74
4.4 深入實(shí)現(xiàn)pytest數(shù)據(jù)驅(qū)動(dòng)核心用法 75
4.4.1 pytest實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng) 75
4.4.2 pytest數(shù)據(jù)驅(qū)動(dòng)示例 77
4.5 如虎添翼測(cè)試報(bào)告集成實(shí)踐 85
4.5.1 pytest-html測(cè)試報(bào)告集成詳解 85
4.5.2 Allure測(cè)試報(bào)告集成詳解 86
4.6 本章小結(jié) 98
第5章 自動(dòng)化測(cè)試框架實(shí)踐 99
5.1 元素定位策略實(shí)踐 99
5.1.1 多種元素定位模型 99
5.1.2 元素定位實(shí)踐 101
5.2 PageObject模型實(shí)踐 106
5.2.1 PageObject模型的核心 106
5.2.2 PageObject模型應(yīng)用 107
5.3 UI自動(dòng)化測(cè)試和接口自動(dòng)化測(cè)試的融合 109
5.3.1 融合原理 110
5.3.2 融合實(shí)踐 111
5.4 測(cè)試數(shù)據(jù)應(yīng)用實(shí)踐 114
5.4.1 測(cè)試數(shù)據(jù)核心講解 114
5.4.2 數(shù)據(jù)驅(qū)動(dòng)模型 117
5.4.3 數(shù)據(jù)驅(qū)動(dòng)實(shí)踐 118
5.5 Web Service接口實(shí)踐 124
5.5.1 Web Service接口調(diào)用原理 124
5.5.2 Web Service接口測(cè)試實(shí)踐 125
5.6 本章小結(jié) 130
第6章 自動(dòng)化測(cè)試框架與交互式命令 131
6.1 交互式命令精要 131
6.1.1 什么是交互式命令 131
6.1.2 交互式命令在測(cè)試框架中的作用 132
6.2 交互式命令在pytest中的使用 133
6.3 自主實(shí)現(xiàn)交互式命令 135
6.3.1 Python標(biāo)準(zhǔn)庫(kù)argparse詳解 135
6.3.2 交互式命令代碼實(shí)踐 138
6.4 測(cè)試框架集成交互式命令 139
6.5 本章小結(jié) 141
第7章 自動(dòng)化測(cè)試框架與數(shù)據(jù)驅(qū)動(dòng) 142
7.1 數(shù)據(jù)驅(qū)動(dòng)原理概述 142
7.2 深入數(shù)據(jù)驅(qū)動(dòng)原理 143
7.2.1 數(shù)據(jù)驅(qū)動(dòng)DDT概述 144
7.2.2 數(shù)據(jù)驅(qū)動(dòng)DDT源碼解析 149
7.3 自主實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng) 153
7.4 本章小結(jié) 157
第8章 自動(dòng)化測(cè)試框架與測(cè)試環(huán)境 158
8.1 測(cè)試環(huán)境給自動(dòng)化測(cè)試框架帶來(lái)的挑戰(zhàn) 158
8.1.1 測(cè)試環(huán)境的普遍問(wèn)題 158
8.1.2 自動(dòng)化測(cè)試框架如何應(yīng)對(duì)測(cè)試環(huán)境變化 159
8.2 測(cè)試環(huán)境切換原理 160
8.2.1 測(cè)試環(huán)境切換原理概述 160
8.2.2 測(cè)試環(huán)境切換核心代碼實(shí)踐 161
8.3 測(cè)試框架集成測(cè)試環(huán)境動(dòng)態(tài)切換 165
8.4 本章小結(jié) 170
第9章 自動(dòng)化測(cè)試框架與測(cè)試用例 171
9.1 自動(dòng)化測(cè)試用例詳解 171
9.2 測(cè)試用例在測(cè)試框架中的組織形式 172
9.2.1 從功能出發(fā)進(jìn)行模塊化組織 172
9.2.2 從用戶角色出發(fā)進(jìn)行模塊化組織 173
9.3 自主實(shí)現(xiàn)按需執(zhí)行測(cè)試用例 174
9.3.1 測(cè)試用例挑選的場(chǎng)景 175
9.3.2 挑選測(cè)試用例的原理 175
9.4 測(cè)試用例挑選與測(cè)試框架的集成 180
9.4.1 測(cè)試框架文件結(jié)構(gòu) 181
9.4.2 測(cè)試框架源碼解析 182
9.4.3 執(zhí)行測(cè)試 192
9.5 本章小結(jié) 194
第10章 自動(dòng)化測(cè)試框架與并發(fā)運(yùn)行 195
10.1 并發(fā)與全局解釋器鎖 195
10.2 自主實(shí)現(xiàn)并發(fā) 197
10.2.1 多線程并發(fā) 197
10.2.2 多進(jìn)程并發(fā) 201
10.2.3 多進(jìn)程下線程池并發(fā) 204
10.3 自主實(shí)現(xiàn)分布式并發(fā) 206
10.3.1 利用Selenium Grid實(shí)現(xiàn)分布式并發(fā) 206
10.3.2 分布式并發(fā)代碼實(shí)踐 207
10.4 測(cè)試框架集成實(shí)踐 208
10.4.1 集成PageObject模型 209
10.4.2 集成并發(fā)運(yùn)行 213
10.5 本章小結(jié) 217
第11章 自動(dòng)化測(cè)試框架與錯(cuò)誤處理 218
11.1 錯(cuò)誤處理核心原理 218
11.1.1 常見(jiàn)的錯(cuò)誤處理類型 218
11.1.2 錯(cuò)誤處理機(jī)制核心講解 220
11.2 自主實(shí)現(xiàn)錯(cuò)誤處理模塊 222
11.2.1 自定義錯(cuò)誤處理 222
11.2.2 錯(cuò)誤處理模塊代碼實(shí)踐 223
11.3 測(cè)試框架集成錯(cuò)誤處理 225
11.4 本章小結(jié) 230
第12章 自動(dòng)化測(cè)試框架與日志系統(tǒng) 231
12.1 Logging精要講解 231
12.1.1 Logging工作流 232
12.1.2 Logging核心組成 234
12.2 自主實(shí)現(xiàn)日志系統(tǒng) 235
12.2.1 簡(jiǎn)單的日志系統(tǒng) 235
12.2.2 多線程Logging精要 238
12.2.3 多進(jìn)程Logging精要 239
12.3 測(cè)試框架集成日志系統(tǒng) 242
12.4 本章小結(jié) 249
第13章 自動(dòng)化測(cè)試框架與測(cè)試報(bào)告 250
13.1 測(cè)試報(bào)告詳解 250
13.1.1 測(cè)試報(bào)告核心模塊 250
13.1.2 測(cè)試報(bào)告設(shè)計(jì) 251
13.2 自主實(shí)現(xiàn)測(cè)試報(bào)告 253
13.2.1 測(cè)試報(bào)告模板開(kāi)發(fā) 253
13.2.2 測(cè)試報(bào)告數(shù)據(jù)收集代碼實(shí)踐 258
13.3 測(cè)試框架集成測(cè)試報(bào)告 262
13.4 本章小結(jié) 268
第14章 完善自動(dòng)化測(cè)試框架 269
14.1 自主實(shí)現(xiàn)前置準(zhǔn)備和后置清理 269
14.1.1 前置準(zhǔn)備和后置清理的工作流程 269
14.1.2 自主代碼實(shí)踐 271
14.2 融合API和UI進(jìn)行自動(dòng)化測(cè)試 273
14.2.1 使用API或者UI進(jìn)行測(cè)試 274
14.2.2 同時(shí)運(yùn)行API和UI自動(dòng)化測(cè)試 275
14.3 一些遺留問(wèn)題 277
14.4 本章小結(jié) 278
第15章 自動(dòng)化測(cè)試框架與持續(xù)集成/持續(xù)部署 279
15.1 持續(xù)集成/持續(xù)部署核心原理講解 279
15.1.1 什么是持續(xù)集成/持續(xù)部署 279
15.1.2 持續(xù)集成/持續(xù)部署核心工作流 280
15.2 持續(xù)集成/持續(xù)部署工具詳解 281
15.2.1 Jenkins流水線 282
15.2.2 Docker核心知識(shí) 283
15.2.3 GitHub WebHook要點(diǎn) 286
15.3 持續(xù)集成項(xiàng)目實(shí)戰(zhàn) 286
15.3.1 創(chuàng)建GitHub項(xiàng)目 286
15.3.2 編寫Jenkinsfile文件 287
15.3.3 Jenkins Blue Ocean流水線搭建 288
15.4 本章小結(jié) 300
第16章 測(cè)試框架發(fā)布 301
16.1 測(cè)試框架打包、發(fā)布精要 301
16.1.1 詳解pip和PyPI 302
16.1.2 打包測(cè)試框架 303
16.1.3 發(fā)布到PyPI 304
16.2 測(cè)試框架發(fā)布實(shí)戰(zhàn) 304
16.3 本章小結(jié) 313