《Java微服務測試:基於Arquillian、Hoverfly、AssertJ、JUnit、Selenium與Mockito》是2019年7月電子工業出版社出版的圖書,作者是劉夢馨。
基本介紹
- 中文名:Java微服務測試:基於Arquillian,Hoverfly,AssertJ,JUnit,Selenium與Mockito
- 作者:劉夢馨
- ISBN:9787121367106
- 頁數:304頁
- 定價:89元
- 出版社:電子工業出版社
- 出版時間:2019年7月
- 開本:16開
內容簡介,目錄,
內容簡介
本書從實戰出發,介紹微服務架構所帶來的測試方面的挑戰,以及如何利用新的技術來應對這些挑戰。通過本書,讀者可以學會如何編寫微服務架構下的單元測試、組件測試、集成測試以及契約測試。在此過程中還會用到Arquillian、ShrinkWrap、Pact、Selenium、Docker、Hoverfly 等多個幫助測試的工具和框架。書中涵蓋大量的代碼和樣例,可以幫助讀者快速上手,並在自己的實際工作中套用這些技術。本書適合有一定Java 基礎的開發和測試人員,對使用其他程式語言的開發者也會有一定的幫助。
目錄
第1章 微服務概述1
1.1 什麼是微服務,為什麼要使用微服務2
1.1.1 為什麼要使用微服務 3
1.1.2 什麼是微服務 5
1.1.3 持續集成、持續部署和Docker 6
1.2 微服務網路及其功能 7
1.2.1 微服務網路 7
1.2.2 微服務特性 8
1.3 微服務架構 9
1.3.1 資源組件 10
1.3.2 業務領域組件 10
1.3.3 遠程資源組件 11
1.3.4 持久化組件 11
1.4 微服務單元測試 12
1.4.1 孤立型單元測試 12
1.4.2 聯合型單元測試 12
總結 13
第2章 測試下的套用14
2.1 準備開始 15
2.2 準備工作 16
2.2.1 Java Development Kit 16
2.2.2 構建工具 17
2.2.3 環境變數 17
2.2.4 集成開發環境(IDE) 18
2.3 架構 18
2.3.1 遊戲服務 19
2.3.2 評論服務 22
2.3.3 視頻服務 24
2.3.4 聚合服務 26
2.3.5 整體架構 27
2.4 套用設計模式 28
2.4.1 解構 28
2.4.2 ECB 模式 38
2.4.3 其他模式 40
2.5 設計決策 42
總結 42
第3章 微服務單元測試44
3.1 單元測試技術 44
3.1.1 聯合型單元測試 45
3.1.2 測試替身 46
3.1.3 孤立型單元測試 48
3.1.4 微服務的單元測試 49
3.2 工具 51
3.2.1 JUnit 51
3.2.2 AssertJ 52
3.2.3 Mockito 53
3.2.4 構建腳本的修改 54
3.3 編寫Gamer套用的單元測試 55
3.3.1 YouTubeVideoLinkCreator 測試 55
3.3.2 YouTubeLink 測試 56
3.3.3 Games 測試 58
3.3.4 GamesService 測試 60
3.3.5 GamesResource 測試 63
練習 68
總結 68
第4章 微服務組件測試69
4.1 Arquillian測試框架 70
4.2 @RunWith(Arquillian.class)註解72
4.3 ShrinkWrap 工具類 75
4.3.1 利用ShrinkWrap 構建歸檔檔案 76
4.3.2 給ShrinkWrap 歸檔檔案增加內容 77
4.3.3 添加資源 79
4.3.4 增加庫和依賴 80
4.3.5 利用Maven 解析器增加複雜依賴 80
4.3.6 增加服務實現 82
4.4 寫一次代碼,然後復用 83
4.5 構建腳本的修改 84
4.5.1 定義Maven 依賴 85
4.5.2 定義Gradle 依賴 86
4.6 覆蓋Arquillian的默認配置 87
4.6.1 容器定義 89
4.6.2 指定容器屬性 89
4.7 使用Arquillian REST擴展 90
4.7.1 Arquillian REST 客戶端擴展 90
4.7.2 Warp REST 擴展91
4.8 使用Arquillian測試Spring套用 93
4.8.1 Arquillian Spring 框架擴展 94
4.8.2 測試Spring Boot 套用 96
4.9 更複雜的Arquillian測試 98
4.9.1 測試遠程組件 98
4.9.2 測試資源組件 101
4.9.3 測試領域組件 103
4.9.4 測試持久化組件 103
練習 106
總結 106
第5章 微服務集成測試108
5.1 微服務架構下的集成測試 109
5.1.1 網關組件層 110
5.1.2 數據映射器和倉庫 111
5.2 使用Arquillian持久化擴展進行持久化測試 111
5.2.1 描述式方法 114
5.2.2 過程式方法 116
5.2.3 使用NoSQLUnit 進行持久化測試 121
5.2.4 使用Arquillian 多部署的持久化測試 125
5.2.5 使用Arquillian 序列的持久化測試 126
5.2.6 構建腳本的修改 127
5.3 Gamer套用的集成測試 128
5.3.1 測試Comments 類 128
5.3.2 測試CommentsGateway 類 131
練習 137
總結 137
第6章 契約測試138
6.1 理解契約 138
6.1.1 契約和單體套用 139
6.1.2 契約和微服務套用 140
6.1.3 使用集成測試進行驗證 145
6.1.4 什麼是契約測試 146
6.1.5 誰負責契約 146
6.2 工具 149
6.2.1 Pact 150
6.2.2 JVM 語言中的Pact 152
6.2.3 利用Algeron 將Pact JVM 與Arquillian 生態系統集成 161
6.3 構建腳本的修改 168
6.3.1 使用Pact JVM 進行契約測試 168
6.3.2 使用Arquillian Algeron 進行契約測試168
6.4 為Gamer套用編寫消費者驅動的契約測試 170
6.4.1 評論服務的消費者端 170
6.4.2 評論服務的生產者端 173
6.5 契約類型總結 175
練習 176
總結 176
第7章 端到端測試177
7.1 端到端測試在整個測試體系中的位置 178
7.2 端到端測試技術 178
7.2.1 垂直測試 179
7.2.2 水平測試 179
7.3 端到端測試工具介紹 180
7.3.1 Arquillian Cube 180
7.3.2 Arquillian Drone 180
7.3.3 Arquillian Graphene 2 181
7.3.4 JMeter 181
7.3.5 Cukes in Space 181
7.4 端到端測試樣例 181
7.4.1 構建微服務 182
7.4.2 增加構建依賴和配置 182
7.4.3 給測試增加@Deployment 註解和@TargetsContainer 註解 189
7.4.4 跨域資源共享 191
7.4.5 使用@ClassRule 處理混合環境 192
7.4.6 使用@OperateOnDeployment 註解操作部署 197
7.4.7 引入@Drone、頁面對象、@Location 和WebDriver 198
7.4.8 在測試中操作頁面對象 200
7.4.9 運行測試 202
練習 203
總結 203
第8章 Docker和測試 204
8.1 Docker生態系統下的工具 205
8.1.1 Docker 205
8.1.2 Docker Machine 207
8.1.3 Docker Compose 208
8.2 Arquillian Cube 210
8.2.1 設定Arquillian Cube 211
8.2.2 編寫容器測試 214
8.2.3 編寫集成測試 217
8.2.4 編寫端到端測試 221
8.3 REST API 224
8.4 Arquillian Drone和Graphene 225
8.4.1 Arquillian Cube 和Arquillian Drone 的集成 225
8.4.2 Arquillian Cube 和Arquillian Graphene 的集成 228
8.5 並行測試 230
8.6 Arquillian Cube和Algeron 231
8.7 使用容器對象模式 233
8.8 部署測試和Kubernetes 240
8.9 構建腳本的修改 245
8.9.1 Arquillian Cube Docker 245
8.9.2 Arquillian Cube Docker JUnit 規則246
8.9.3 Arquillian Cube Kubernetes 246
8.9.4 Arquillian Cube OpenShift 247
8.10 測試視頻服務的Dockerfile 247
練習 249
總結 249
第9章 服務虛擬化 250
9.1 什麼是服務虛擬化 250
9.1.1 為什麼要使用服務虛擬化 251
9.1.2 什麼時候使用服務虛擬化 252
9.2 使用Hoverfly模擬服務回響 253
9.2.1 Hoverfly 模式 253
9.2.2 JUnit Hoverfly 255
9.2.3 配置Hoverfly .257
9.3 構建腳本的修改 258
9.4 對Gamer套用使用服務虛擬化 258
總結 260
第10章 微服務下的持續交付 262
10.1 什麼是持續交付 263
10.2 微服務架構和持續交付 264
10.3 持續交付的編排 266
10.3.1 使用Jenkins 267
10.3.2 Jenkins 流水線 267
10.3.3 確定性部署 271
10.4 Jenkins 272
10.4.1 定義一個流水線 276
10.4.2 Jenkins 流水線示例 278
總結 280
附錄A 使用Arquillian Chameleon禁止不同類型的容器281,第1章 微服務概述1
1.1 什麼是微服務,為什麼要使用微服務2
1.1.1 為什麼要使用微服務 3
1.1.2 什麼是微服務 5
1.1.3 持續集成、持續部署和Docker 6
1.2 微服務網路及其功能 7
1.2.1 微服務網路 7
1.2.2 微服務特性 8
1.3 微服務架構 9
1.3.1 資源組件 10
1.3.2 業務領域組件 10
1.3.3 遠程資源組件 11
1.3.4 持久化組件 11
1.4 微服務單元測試 12
1.4.1 孤立型單元測試 12
1.4.2 聯合型單元測試 12
總結 13
第2章 測試下的套用14
2.1 準備開始 15
2.2 準備工作 16
2.2.1 Java Development Kit 16
2.2.2 構建工具 17
2.2.3 環境變數 17
2.2.4 集成開發環境(IDE) 18
2.3 架構 18
2.3.1 遊戲服務 19
2.3.2 評論服務 22
2.3.3 視頻服務 24
2.3.4 聚合服務 26
2.3.5 整體架構 27
2.4 套用設計模式 28
2.4.1 解構 28
2.4.2 ECB 模式 38
2.4.3 其他模式 40
2.5 設計決策 42
總結 42
第3章 微服務單元測試44
3.1 單元測試技術 44
3.1.1 聯合型單元測試 45
3.1.2 測試替身 46
3.1.3 孤立型單元測試 48
3.1.4 微服務的單元測試 49
3.2 工具 51
3.2.1 JUnit 51
3.2.2 AssertJ 52
3.2.3 Mockito 53
3.2.4 構建腳本的修改 54
3.3 編寫Gamer套用的單元測試 55
3.3.1 YouTubeVideoLinkCreator 測試 55
3.3.2 YouTubeLink 測試 56
3.3.3 Games 測試 58
3.3.4 GamesService 測試 60
3.3.5 GamesResource 測試 63
練習 68
總結 68
第4章 微服務組件測試69
4.1 Arquillian測試框架 70
4.2 @RunWith(Arquillian.class)註解72
4.3 ShrinkWrap 工具類 75
4.3.1 利用ShrinkWrap 構建歸檔檔案 76
4.3.2 給ShrinkWrap 歸檔檔案增加內容 77
4.3.3 添加資源 79
4.3.4 增加庫和依賴 80
4.3.5 利用Maven 解析器增加複雜依賴 80
4.3.6 增加服務實現 82
4.4 寫一次代碼,然後復用 83
4.5 構建腳本的修改 84
4.5.1 定義Maven 依賴 85
4.5.2 定義Gradle 依賴 86
4.6 覆蓋Arquillian的默認配置 87
4.6.1 容器定義 89
4.6.2 指定容器屬性 89
4.7 使用Arquillian REST擴展 90
4.7.1 Arquillian REST 客戶端擴展 90
4.7.2 Warp REST 擴展91
4.8 使用Arquillian測試Spring套用 93
4.8.1 Arquillian Spring 框架擴展 94
4.8.2 測試Spring Boot 套用 96
4.9 更複雜的Arquillian測試 98
4.9.1 測試遠程組件 98
4.9.2 測試資源組件 101
4.9.3 測試領域組件 103
4.9.4 測試持久化組件 103
練習 106
總結 106
第5章 微服務集成測試108
5.1 微服務架構下的集成測試 109
5.1.1 網關組件層 110
5.1.2 數據映射器和倉庫 111
5.2 使用Arquillian持久化擴展進行持久化測試 111
5.2.1 描述式方法 114
5.2.2 過程式方法 116
5.2.3 使用NoSQLUnit 進行持久化測試 121
5.2.4 使用Arquillian 多部署的持久化測試 125
5.2.5 使用Arquillian 序列的持久化測試 126
5.2.6 構建腳本的修改 127
5.3 Gamer套用的集成測試 128
5.3.1 測試Comments 類 128
5.3.2 測試CommentsGateway 類 131
練習 137
總結 137
第6章 契約測試138
6.1 理解契約 138
6.1.1 契約和單體套用 139
6.1.2 契約和微服務套用 140
6.1.3 使用集成測試進行驗證 145
6.1.4 什麼是契約測試 146
6.1.5 誰負責契約 146
6.2 工具 149
6.2.1 Pact 150
6.2.2 JVM 語言中的Pact 152
6.2.3 利用Algeron 將Pact JVM 與Arquillian 生態系統集成 161
6.3 構建腳本的修改 168
6.3.1 使用Pact JVM 進行契約測試 168
6.3.2 使用Arquillian Algeron 進行契約測試168
6.4 為Gamer套用編寫消費者驅動的契約測試 170
6.4.1 評論服務的消費者端 170
6.4.2 評論服務的生產者端 173
6.5 契約類型總結 175
練習 176
總結 176
第7章 端到端測試177
7.1 端到端測試在整個測試體系中的位置 178
7.2 端到端測試技術 178
7.2.1 垂直測試 179
7.2.2 水平測試 179
7.3 端到端測試工具介紹 180
7.3.1 Arquillian Cube 180
7.3.2 Arquillian Drone 180
7.3.3 Arquillian Graphene 2 181
7.3.4 JMeter 181
7.3.5 Cukes in Space 181
7.4 端到端測試樣例 181
7.4.1 構建微服務 182
7.4.2 增加構建依賴和配置 182
7.4.3 給測試增加@Deployment 註解和@TargetsContainer 註解 189
7.4.4 跨域資源共享 191
7.4.5 使用@ClassRule 處理混合環境 192
7.4.6 使用@OperateOnDeployment 註解操作部署 197
7.4.7 引入@Drone、頁面對象、@Location 和WebDriver 198
7.4.8 在測試中操作頁面對象 200
7.4.9 運行測試 202
練習 203
總結 203
第8章 Docker和測試 204
8.1 Docker生態系統下的工具 205
8.1.1 Docker 205
8.1.2 Docker Machine 207
8.1.3 Docker Compose 208
8.2 Arquillian Cube 210
8.2.1 設定Arquillian Cube 211
8.2.2 編寫容器測試 214
8.2.3 編寫集成測試 217
8.2.4 編寫端到端測試 221
8.3 REST API 224
8.4 Arquillian Drone和Graphene 225
8.4.1 Arquillian Cube 和Arquillian Drone 的集成 225
8.4.2 Arquillian Cube 和Arquillian Graphene 的集成 228
8.5 並行測試 230
8.6 Arquillian Cube和Algeron 231
8.7 使用容器對象模式 233
8.8 部署測試和Kubernetes 240
8.9 構建腳本的修改 245
8.9.1 Arquillian Cube Docker 245
8.9.2 Arquillian Cube Docker JUnit 規則246
8.9.3 Arquillian Cube Kubernetes 246
8.9.4 Arquillian Cube OpenShift 247
8.10 測試視頻服務的Dockerfile 247
練習 249
總結 249
第9章 服務虛擬化 250
9.1 什麼是服務虛擬化 250
9.1.1 為什麼要使用服務虛擬化 251
9.1.2 什麼時候使用服務虛擬化 252
9.2 使用Hoverfly模擬服務回響 253
9.2.1 Hoverfly 模式 253
9.2.2 JUnit Hoverfly 255
9.2.3 配置Hoverfly .257
9.3 構建腳本的修改 258
9.4 對Gamer套用使用服務虛擬化 258
總結 260
第10章 微服務下的持續交付 262
10.1 什麼是持續交付 263
10.2 微服務架構和持續交付 264
10.3 持續交付的編排 266
10.3.1 使用Jenkins 267
10.3.2 Jenkins 流水線 267
10.3.3 確定性部署 271
10.4 Jenkins 272
10.4.1 定義一個流水線 276
10.4.2 Jenkins 流水線示例 278
總結 280
附錄A 使用Arquillian Chameleon禁止不同類型的容器281