如今,测试已不再是企业发展中的"可选”部分,其必将成为企业发展壮大的核心武器。本书旨在指导读者使用测试平台进行持续开发。本书首先阐述了测试在企业发展中的重要性,然后大篇幅地分析了一些用户在发展中会遇到的共性问题(例如,如何引导新项目及验证用户界面)的解决方案,最后,指导用户了解如何构建一个终端到终端的测试方式。
使用测试平台进行Java EE持续开发。
讲述从零开始将一个空白存储库建设成完整部署在公有云之上的公开应用程序。
用具体的代码深入地阐述了项目和归档创建的自动化、Maven build 在流程里的编程式集成,以及所有级别的测试。
介绍了不少有用实践,展示如何测试难以测试的场景,包括SMTP 服务器和消息驱动Bean 的样例。
序
即使是古老的J2EE 也绝不仅仅是关于开发的。
从企业Java 的出现开始,就有了严格定义的整体角色概念。组件提供者、组装者、系统
管理员和服务器提供者,都有清晰且独特的职责,但是这些角色在真实世界里很少有
真正的支撑。因为政策和组织结构的原因,开发人员通常需要承担所有这些角色的职
责,可能的例外也只是系统管理和运维。开发人员的首要目标是开发,因此上述意图良
好的角色划分很快就没有意义了。
在“真实世界”里,特定的运维部门负责维护开发周期的成果,尝试安装、运行、保持
应用在线。因此这里真正起作用的是人为划分的模型,但是它和最佳方式相去甚远。有
时情况会尤其糟糕,签署文档甚至会比产品质量更加重要。
如果你只对快速hack 感兴趣,那么肯定会厌恶Java EE 和应用服务器,也很可能会因此
讨厌这本书。如果你只关注于开发,那么打包、部署、监控和管理听上去就是多此一举。
但是,“DevOps”将运维和开发看作一个单独单元。谁会需要漂亮,却无法在预定义环
境里正常部署的代码呢?DevOps 并不是什么开创性的事物,相反,它是“回到初心”的
倡导。
本书不仅契合DevOps 的理念,还编程式地展现了如何从零开始构建一个Java EE 应用
程序,并且填补了Java EE 规范的空白之处。本书还用具体的代码深入地阐述了项目和
归档创建的自动化、Maven build 在流程里的编程式集成,以及所有级别的测试。本书
不仅关注最佳实践,而且向读者展示了如何测试难以测试的场景,包括SMTP 服务器
和消息驱动Bean 的样例。
虽然本书介绍的工具、库函数和框架都是由Red Hat 公司的员工发起的,但是即使你
完全没有用过JBoss 或者WildFly,这本书也会很有价值。实际上,我同时在GlassFish
和TomEE 上使用Arquillian、ShrinkWrap 和Forge 来测试应用程序,并且,我在研讨会(http://airhacks.com)里使用了Arquillian 测试插件、扩展和复杂的依赖注入,而无须将
mock 部署到生产归档里。
在飞往旧金山的JavaOne 2013 大会的途中,我阅读了这本书,它非常有意思,让我学到
了很多。希望所有人都能从这本书中有所收获——享受轻量级Java EE 开发的生命周期!
——Adam Bien
http://adam-bien.com
前言
简约是复杂的最终形式。
——Leonardo DaVinci
现代Web 软件开发的发展日新月异。近些年,大家看到了客户端状态向服务器端移动
的趋势,现在又在往回自我纠正。虽然JavaScript 的作用明显,但是关于其价值,两个工
程师可能会给出三个意见。HTML5 开创了在浏览器里支持富媒体和并发的新时代。在
颇具实力的NoSQL 系统的挑战下,统治业界40 年之久的关系数据模型开始有些过时,
同时版本控制存储也经历了实现和范式的改革。
可用的工具正在不断变化,要从中做出选择难免会眼花缭乱。
同时,工程师们也面临着构建多用户程序所带来的巨大挑战。大家都喜欢简洁、易于维
护的代码,需要代码能够高效并且安全地运行,工程师们必须保证代码的正确性。
在Java 的世界里,很多答案来自于伴随Java 企业版(Java Enterprise Edition)发布的一
系列规范。这项努力的首要目标仍然是:隐藏软件开发固有的复杂语法,并且尝试根据
需求提供清晰的标准模型。换句话说,Java EE 平台包括很多不断演变的工具包,而其
中一个可能不太可靠。
因此几年后,大家开始填补那些Java EE 没有规范的漏洞,最终掌握了一个可以激发想
象力,并且经证明比最初设想更为灵活的测试框架。很明显,为了充实想法以便更好地
分享所收获的经验教训,并不需要罗列任何特别的技术。开发人员一直想拥有一张详
尽的地图,能够帮助理解Java EE,及其附属框架和服务。
本书不会详细介绍某个规范,这些资料可以在别处找到,因为本书认为通过解决方案
(Solution)来开始学习并没有太大意义。
相反,本书从问题(Problem)开始。我们为企业级Java 的可测试开发选择了以用例为
中心的方案,并且在一些理论探索和必要的背景介绍之后,每章都会解决一个高层次的问题。本书提出的解决方案涵盖范围从用户界面到持久化存储,并且会涉及许多标
准和第三方项目。所有的示例都是可执行的,还可以在相关网站的生产环境上运行,从
而加以验证。
新手能够借助本书达到企业级Java 开发人员的水平,能够从零开始将一个空白存储库
建设成完整部署在公有云之上的公开应用程序。所有的程序员都能够从本书中找到极
具吸引力的方法,用来测试种子数据,向客户端推送事件,与分布式数据网格交互,验
证用户界面,等等。
很简单,本书的目标是将复杂的事情变得简单些。幸运的是,这会带来更高的工作效率
和更多的乐趣。
至少,这是我们采用本书中提到的技术时得到的经验。
本书使用的排版约定
如下是本书中使用的排版规范:
斜体(Italic)
表示新名词、URL、电子邮件地址、文件名、文件扩展名。
等宽体(Constant width)
用于程序列表,以及在段落中引用的程序元素,比如变量、函数名称、数据库、数
据类型、环境变量、语句和关键字。
等宽粗体(Constant width bold)
显示命令或其他应该由用户键入的文本。
等宽斜体(Constant width italic)
显示应该由用户提供的值或上下文确定的值所替换的文本。
使用代码示例
从http://continuousdev.org可以下载辅助资料(代码示例、练习等)。第4章里有详细介绍。
本书帮助读者完成自己的工作,所有的内容使用Creative Commons Attribution-ShareAlike
2.0 Generic(http://creativecommons.org/licenses/by-sa/2.0/)许可证,本书邀请社区贡献了
很多工作,包括特性请求、印刷错误勘正,并且通过GitHub Issue Tracker(http://bit.ly
/1e7kQRD)改进加强。读者可以在遵守许可证的前提下重用所有文本或者示例,但需
要注明出处。更多细节请查看许可证。
出处通常包括标题、作者、出版社和ISBN。例如:“Andrew Lee Rubinger 和Aslak Knutsen
撰写的Continuous Enterprise Development in Java(O’Reilly)。Copyright 2014 Andrew Lee
Rubinger and Aslak Knutsen, 978-1-449-32829-0.”
Safari? Books Online
Safari Books Online(http://my.safaribooksonline.com/?portal=oreilly)
是按需的数字图书馆,以书籍和视频的形式,提供来自技术和商
业领域的世界顶级作家的专业内容。
技术专家、软件开发人员、Web 设计师,以及业务和创新专家将Safari Books Online 作
为其主要资源,用来研究、解决问题,学习以及认证培训。
Safari Books Online 为企业、政府机构和个人提供一系列产品组合和付费项目。订阅者
能够访问完整可搜索数据库里的数千本书、培训视频和正式出版前的手稿,涵盖的出版
社包括O’Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microso
Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、
Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New
Riders、McGraw-Hill、Jones & Bartlett、Course Technology,等等。在线可获得更多有关
Safari Books Online 的信息。
如何联系我们
请将对本书的评价和存在的问题通过如下地址告知出版者。
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)
奥莱利技术咨询(北京)有限公司
本书有自己的网页,里面列出了勘误表、示例和所有额外信息。从http://oreil.ly/continu
ous-enterprise访问该网页。
关于本书的评论或者技术问题,请发送邮件到bookquestions@oreilly.com。
要获取更多关于我们的书籍、课程、会议和新闻,请访问网站http://www.oreilly.com。
Facebook 主页:http://facebook.com/oreilly
在Twitter 上关注我们:http://twitter.com/oreillymedia
YouTube 上的视频:http://www.youtube.com/oreillymedia
鸣谢
首先,我要由衷感谢Arquillian 社区:来自世界各地的天才们贡献时间和知识,帮助改
进项目,从代码到写作,再到演讲和在Internet 上的呼喊(是的,我们注意到你了)。
特别感谢所有Arquillian 的模块领袖:Karel Piwko、Bartosz Majsak、Luká? Fry?、Dan Allen、
Stefan Miklosovic、Jakub Narloch、Gerhard Poul、John Ament、Jan Papousek、Bernard Labno、
St?le Pedersen、Ken Finnigan、Tolis Emmanouilidis、Ales Justin、Martin Gencur、Vineet
Reynolds、Davide D’Alto、Jean Deruelle、David Blevins、Mark Struberg、omas Diesler、
Romain Manni-Bucau、Logan McGrath 和Alexis Hassler。
特别感谢Sarah White 和Cheyenne Weaver 给出了视觉识别和书目大纲,是你们让这本
书看上去这么好!
还要感谢完成本书过程中帮助改正内容和给予评论的所有人。
谢谢Meghan Blanchette 坚持推进我们的工作。如果没有你的帮助,很可能(也许是肯
定)就不会有这本书的出版。
放在最后但同样重要的是,由衷感谢我的朋友Adam Bien 为本书作序。
本书献给我们的工作诞生于此,兴起于此,并且仍在持续演进于此的社区。