猜你喜欢
Java微服务测试:基于Arquillian、Hoverfly、AssertJ、JUnit、Selenium与Mockito

Java微服务测试:基于Arquillian、Hoverfly、AssertJ、JUnit、Selenium与Mockito

书籍作者:Alex Soto Bueno ISBN:9787121367106
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:4299
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

本书从实战出发,介绍微服务架构所带来的测试方面的挑战,以及如何利用新的技术来应对这些挑战。通过本书,读者可以学会如何编写微服务架构下的单元测试、组件测试、集成测试以及契约测试。在此过程中还会用到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:实战生成对抗网络》等书。

编辑推荐
适读人群 :从事程序工作、数据工作、需要对Java Microservices进行学习的人员

√ 微服务面临不可预知负载,分布式设计带来安全|性能隐患,异步通信|容器让挑战加剧。

√ 内容涵盖自动化测试|微服务系统集成测试|以容器为中心的系统测试|服务虚拟化

√ 基于JVM微服务实现单元|集成测试,实践高级混沌测试|集成测试|契约测试

√ Arquillian|TomEE主创人员执笔,重磅企业场景测试实战力作首度问世

√ 一切从用Java EE|WildFly Swarm|Docker来搭建微服务环境起步


前言
译者序
  微服务架构的理念日渐深入人心,然而隐藏在其架构优势下的还有对传统软件开发模式的强烈冲击。如何在测试环境中部署种类繁多的微服务?如何对复杂的交互、多样的场景进行完整覆盖?单元测试、组件测试、集成测试以及端到端测试又有怎样的不同?有没有专门针对微服务架构的测试框架和工具?本书就将告诉你上述问题的答案。
  本书介绍了大量Java 微服务测试领域最为前沿的技术。本书从微服务架构讲起,介绍了测试在这种新型架构下所面临的问题和挑战,之后逐一介绍了单元测试、组件测试、集成测试、契约测试和端到端测试领域针对这些问题和挑战的应对方法。本书还提供了一个完整的微服务应用作为样例,从代码层面介绍如何编写不同领域的测试,给作者提供了上手实践的方法。本书的几位作者都是在测试领域内耕耘多年的老兵,相信他们宝贵的经验能给你带来收获。
  本书主要介绍Java 微服务测试,但是其中的方法和理念对于使用任何一门编程语言的开发和测试人员都会有很大的帮助。希望本书能够帮助你更好地改善工作中开发和测试的流程,提升整体的代码质量。
  愿你的程序永远不出bug。
  序言
  在编程的早期是没有任何框架的,测试散落在代码的各个角落,以确保重要的软件功能的确是经过测试验证的。在那个时候,存储空间是十分宝贵且有限的。
  后来,单元测试从一个流行概念演化成了软件测试事实上的标准。存储空间的问题也得到了很大的缓解,再也不能成为不编写测试代码的借口。如今,几乎所有的开发者都已经早早开始学习并使用单元测试的方法,并且单元测试已经成为软件开发成功的基础。
  今天的企业级应用已经不可能仅依赖简单的单元测试来保证功能的完备。如今的客户也变得更加苛刻,要求也越来越高。如果企业想要充分满足客户的要求,就需要在开发的过程中使用多种测试策略。
  本书一方面介绍如何解决当下企业测试的问题,另一方面介绍如何应对未来将微服务引入应用架构所带来的测试挑战,这将会给读者带来更大的价值。
  我们花了很长时间来编写本书:最初它只是一个关于某个框架的小册子,现如今它已经成为一个介绍大量测试策略供读者选择的具有10 章且内容丰富的图书。随着技术的不断演进,我们在这个过程中收获颇多。为了能给读者提供尽可能多的选择,我们尽可能地聚焦于策略、方法论和解决方案,而不是简洁的代码和看起来令人兴奋然而最终却不可用的应用。如果通过本书你可以对如何测试自己的应用有新的想法,那么我们的目的就达到了。
  我们十分感谢你愿意花时间来读这样一本书,希望你能够喜欢我们的写作风格。
  致谢
  本书由3 位独立开发者完成,在这里让我们感谢彼此的理解和支持,感谢每个人的辛苦工作和反馈。
  十分感谢Arquillian 项目的每一位参与者,尤其是Aslak Knutsen、Dan Allen、Bartosz Majsak 和Matous Jobanek。在你读完这本书的时候,就会了解他们在这个伟大的项目上投入了多少精力,以及这个项目会如何显著地帮助你改善软件测试的质量。
  开源软件(OSS)社区提供了很多极其有用的工具来帮助每个人更有效地进行测试。这些项目中的大部分都是由那些不知疲倦且无人知晓的开发者在他们的空闲时间完成的,在这里我们要表达对他们这份难能可贵工作的敬意。我们同时希望作为读者的你,也能够在每个合适的机会对这些“不可思议”的开发者表达谢意。
  感谢Daniel Bryant 和Marcin Grzejszczak 花费时间对契约测试部分进行讨论。
  在我们徘徊不前之际,Cynthia Kane 和Tiffany Taylor 两位编辑给我们提供了前进的动力,帮助我们完成了这个工作。利用空闲时间写书是一项很有挑战性的任务,十分感谢Cynthia 和Tiffany 帮助我们完成了这项任务。同时也要感谢帮助这本书从可能变为现实的Manning 出版社的每一位工作人员:出版者Marjan Bace 以及相关编辑和产品团队。
  Joshua White 提供了大量技术上的论证,感谢他解决了本书质量上的问题。他对我们的测试进行了测试!
  感谢每一位花费时间阅读并提供反馈的读者,他们帮助我们完成了最终的图书产品。这些读者包括我们的技术同行评审员:Aleksandar Dragosavljevic′、Alex Jacinto、Anshuman Purohit、Boris Vasile、Conor Redmond、Eddú Meléndez Gonzales、Ethan A. Rivett、Fabrizio Cucci、Gualtiero Testa、Henrik L?vborg、Jan Paul Buchwald、Jonathan Thoms、José Díaz、Kiran Anantha、Leo van den Berg、Mari Machado、Nilesh Thali、Piotr Gliz′niewicz、Robert Walsh、Yagiz Erkan 和Zorodzayi Mukuya。
  最后,要感谢家人帮助我们度过了写书过程中一个个漫长的周末以及交稿前的忙乱和写作过程中无数起起伏伏的时光。没有你们的支持,我们将无法完成这项任务!
  关于本书
  如今,测试已经成为每个开发者在软件开发过程中必不可少的一部分。然而原来并非如此,测试框架是在软件开发出现很长时间之后才出现的。由于现在已经有了足够多关于为什么需要进行软件测试的理论,因此本书并不会关注这一部分。对我们来说,如何进行软件测试以及如何将这个理念带给其他人是更为重要的话题。本书主要关注如何测试这一部分,并提供了应用代码的示例以帮助你快速上手。
  本书中的很多内容都可以在互联网上找到,然而在人们真正需要去寻找这些资料的时候,却常常并不一定能联网查阅,即使联网也不一定能及时搜集或找到所需的内容(或者特意选择不联网)。如果使所有这些人们需要的信息汇聚到一起供人直接查阅使用,那将是非常方便的事情。我们希望本书就可以作为这样一种资源。
  测试是一个相当通用的术语,但同时测试也是一系列技术的组合,如果想发挥它的最大威力,你需要对相应的技术进行很好的组合。我们收集了大量的热门主题和组件,并且将其以一种最为合适的方式进行组织并展示给读者。
  谁应该阅读本书
  我们很想说“所有人”都应该阅读本书,然而实际并非如此。我们的目标用户是企业级的Java(Jave EE 和 Spring)应用开发者。如果你就是这样的开发者,那么本书将会帮助你更深入地进行单元测试。
  如果你并不是一个专门的Java 开发者,本书依然可能包含你感兴趣的内容。本书提供的大部分信息都是和编程语言无关的,并可以应用于多个不同的领域。
  正如书名所示,我们的关注点是正在不断兴起的以微服务为基础的架构。但是我们也提供了大量和更通用的企业级测试相关的信息,因此不必担心本书遗漏了这些内容—书中只是更深入地介绍了微服务相关的内容。
  路线图
  本书分为10 章,下面是所包含内容的速览:
  第 1 章介绍与微服务相关的术语以及为什么要使用微服务。
  第 2 章介绍阅读本书预先需要掌握的知识以及如何构建代码,帮助你在阅读本书之后的过程中节省时间。
  第 3 章会带你快速浏览通用的单元测试技术、方法论以及最佳实践。
  第 4 章深入介绍 Arquillian 测试框架。
  第 5 章展示如何创建一个相互依赖的微服务应用的集成测试。
  第 6 章讨论消费者驱动的契约测试。
  第 7 章探索端到端测试技术和工具。
  第 8 章介绍利用Docker 创建可复用的测试环境。
  第 9 章探索服务虚拟化的概念和实现。
  第 10章讨论持续交付和使用 Jenkins构建流水线。
  我们以一种循序渐进地介绍各个基本主题的方式来安排章节的顺序。每一章都会承接上一章的内容,当然你也可以按照自己的兴趣来安排阅读的顺序。本书选择 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