Java 微服務測試:基於 Arquillian、Hoverfly、AssertJ、JUnit、Selenium 與 Mockito (Testing Java Microservices: Using Arquillian, Hoverfly, AssertJ, JUnit, Selenium, and Mockito)

劉夢馨

買這商品的人也買了...

商品描述

本書從實戰出發,介紹微服務架構所帶來的測試方面的挑戰,以及如何利用新的技術來應對這些挑戰。通過本書,讀者可以學會如何編寫微服務架構下的單元測試、組件測試、集成測試以及契約測試。在此過程中還會用到Arquillian、ShrinkWrap、Pact、Selenium、Docker、Hoverfly 等多個幫助測試的工具和框架。書中涵蓋大量的代碼和樣例,可以幫助讀者快速上手,並在自己的實際工作中應用這些技術。本書適合有一定Java 基礎的開發和測試人員,對使用其他編程語言的開發者也會有一定的幫助。

作者簡介

Alex Soto Buen 是一位 Java 大師,也是一位在Red Hat 工作的軟體工程師,其主要研發提升測試體驗的工具。他十分喜愛Java、軟體自動化,並且深信開源軟體。Alex 是NoSQLUnit 項目的創建者以及 JSR374(JSON 處理的Java API)專家組的一員,並且是一位國際講師。Andy Gumbrecht是Tomitribe的高級軟體工程師。從12歲起他就對任何和電腦相關的事情感興趣,並在那時幸運地擁有了一台高達1KB內存的電腦Sinclair ZX81。那時候許多早期的程序示例都是表單上的二進位碼,需要人工手動輸入電腦中。這十分容易出錯,因此Andy很快就找到了他的兄弟John,讓他作為自己的測試者來保證輸入的正確性。這也是他第一次意識到測試代碼的重要性。接觸機器碼和BASIC 使得Andy 在代碼優化方面的能力持續提升。在成為英國軍隊的皇家工程師之後不久,他回到德國的大學繼續深造。之後他進入 PROVOXSytemplanung GmbH 實習並在那裡工作了很多年,主要開發政府軟體。Andy 從 2007 年開始進行開源軟體的研發並在2009年加入了Apache OpenEJB和Apache TomEE Application Server 項目,現在他已經成為項目管理委員會的一員。Jason Porter在多個領域工作過,使用過Java、PHP、Ruby、C# 以及JavaScript。他認為自己主要是一名後端開發者,但是其實他擁有應對任何編程領域問題的能力。在Red Hat,Jason 參與過多個不同的框架、網站和集成工作。他在美國和世界其他地方做過的演講可以幫助人們更好地理解編程的概念或新的技術。

譯者:北京大學碩士研究生,曾在阿里技術保障部擔任系統工程師,后加入靈雀雲從事容器雲平台調度系統和容器網路相關方向的開發,專註于分散式系統和機器學習的研究和動向;譯有《Mesos:大數據資源調度與大規模容器運行最佳實踐》、《GAN:實戰生成對抗網路》等書。

目錄大綱

第1章微服務概述1 

1.1什麼是微服務,為什麼要使用微服務2 

1.1.1為什麼要使用微服務3 

1.1.2什麼是微服務5 

1.1.3持續集成、持續部署和Docker6 

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 Kit16 

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 JUnit51 

3.2.2 AssertJ52 

3.2.3 Mockito53 

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 @RunWithArquillian.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 Pact150 

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 Cube180 

7.3.2 Arquillian Drone180 

7.3.3 Arquillian Graphene 2181 

7.3.4 JMeter181 

7.3.5 Cukes in Space181 

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和WebDriver198 

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 Compose208 

8.2 Arquillian Cube 210 

8.2.1設置Arquillian Cube211 

8.2.2編寫容器測試214 

8.2.3編寫集成測試217 

8.2.4編寫端到端測試221 

8.3 REST API224 

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