网站架构的核心知识

现如今,互联网产品已经占据了软件行业的大半壁以江山。作为测试工程师,你很多时候都在和互联网产品,尤其是网站类应用产品的测试打交道。

这时,如果你想要做好互联网产品功能测试以外的其他测试,比如性能测试、稳定性测试、全链路压测、故障切换(Failover)测试、动态集群容量伸缩测试、服务降级测试和安全渗透测试等,就要掌握网站的架构知识。否则,面对这类测试时,你将束手无策。

比如,如果你不清楚 Memcached 这类分布式缓存集群的应用场景和基本原理,如果你不清楚缓存击穿、缓存雪崩、缓存预热、缓存集群扩容局限性等问题,你就设计不出针对缓存系统特有问题的测试用例;
再比如,如果你对网站的可伸缩性架构设计不了解,不清楚应用服务器的各种负载均衡实现的基本原理,不了解数据库的读写分离技术,你就无法完成诸如故障切换、动态集群容量伸缩、服务降级等相关的测试,同时对于性能测试和全链路压测过程中可能遇到的各种瓶颈,也会很难定位和调整。
这就有点像当年做传统软件产品测试时,我们必须了解软件的架构设计一样,现在被测对象成了互联网产品,我们就必须要了解网站架构。

所以,我强烈建议你要掌握网站架构的核心知识,你不需要像系统架构师那样能够熟练驾驭各种架构,并根据业务选型,但你至少需要理解架构相关的基本知识以及核心原理。

基于此,我在专栏的最后安排了一系列文章,包括了网站高性能架构设计、网站高可用架构设计、网站伸缩性架构设计和网站可扩展性架构设计,为你详细讲解互联网架构的核心知识,提升你的互联网产品测试能力。

容器技术
“容器”已不再是一个陌生词汇了,大多数人都在实际工作中或多或少地用到了容器技术。与传统的虚拟机相比,容器技术在轻量化程度、资源占用、运行效率等方面具有压倒性的优势。

除了那些专门做容器测试的测试工程师外,一般的测试工程师接触容器技术的机会也越来越多。

很多中大型互联网企业都在推行容器化开发与运维,开发人员递交给测试工程师的软件版本通常就是一个 Docker Image,直接在容器上进行测试。有些公司还会把测试用例和执行框架也打包成 Docker Image,配合版本管理机制,实现用容器测试容器。

对测试开发工程师来说,需要应用容器的场景就更多了。比如,目前主流的 Selenium Grid 就已经提供了官方 Docker 版本,可以直接以容器的方式建立测试执行环境,也可以很方便地在 Pivotal Cloud Foundry 和 Google Cloud Platform 等云计算平台上快速建立测试执行环境。

基于 Docker 的 Selenium Grid 大大减轻了批量虚拟机节点上 Web Driver、浏览器版本和守护者进程版本等升级维护的工作量。

测试开发工程师还可以通过 Docker Image 的形式,提供某些测试工具,而不是以传统的安装包或者 JAR 文件的形式,可以实现测试工具开箱即用。

可见,容器技术已经慢慢渗透到软件研发与运维的各个层面,作为新时代的测试开发工程师,你必须像熟练使用 VMware 一样,掌握 Docker 和 Kubernetes 的原理和使用方法。

那对于一个测试工程师来说,怎么才能快速具备容器相关知识,并上手涉及容器技术的互联网产品测试呢?

在这里,我还是要跟你强调选择学习资料时,一定要注意权威性,我给你的推荐依然是Docker 官网的教程,在这里你完全可以理清 Docker 概念以及具体使用方法,那再结合具体的实战,相信你必定收获颇丰。

云计算技术
一方面,很多企业,尤其是互联网企业都在尝试“上云”, 也就是逐渐把生产环境从原本的集中式数据中心模式转向私有云或者混合云模式。

前段时间,eBay 的一些产品线就对外宣布了和 Pivotal Cloud Foundry 的合作,会将部分产品线迁移到云端。显然,作为测试工程师,你必须理解服务在云端部署的技术细节才能更好的完成测试任务。

另一方面,测试基础服务作为提供测试服务的基础设施,比如测试执行环境服务(Test Execution Service)和测试数据准备服务(Test Data Service)等,也在逐渐走向云端。 比如,国外非常流行的 Sauce Labs,就是一个著名的测试执行环境公有云服务。

一些大型互联网企业,通常还会考虑建立自己的测试执行私有云。最典型的就是,基于 Appium + Selenium Grid,搭建移动终端设备的测试执行私有云。

所以,除了专门进行云计算平台测试的工程师,必须要掌握云计算的知识外,其他互联网产品的测试工程师,也要能够理解并掌握基本的云计算知识和技术。

在我看来,对于云计算的学习,你的侧重点应该是如何使用云提供的基础设施以及服务。我建议的高效学习方法是,参考你所采用的云方案的官方文档,再结合实际案例进行试用,学习效果会更好。

你可以尝试用云服务去部署自己的应用,同时还可以结合云平台提供的各类服务(配置服务,数据库服务等)和你的应用做集成。另外,我还建议你尝试用云平台建立自己的小应用集群,体验集群规模的动态收缩与扩展。你还可以尝试在云平台上直接使用 Docker 部署发布你的服务。

更进一步,你可以尝试在云端建立自己的 Selenium Gird 集群,现在 Selenium Gird 已经发布了对应的 Docker 版本镜像,你可以非常方便地在云平台上搭建自己的 Selenium Grid。

不要以为这会有多复杂,理解了 Docker 的基本概念以及对应云平台的使用方法,你就可以在短时间内快速搭建起这样的 Selenium 集群。

相信以上这些基本的应用场景,都将更好地帮助你理解云平台的核心功能以及使用场景,从而帮你完成对应产品的测试。

DevOps 思维
DevOps 强调的是,开发、测试和运维等组织团队之间,通过高效自动化工具的协作和沟通,来完成软件的全生命周期管理,从而实现更频繁地持续交付高质量的软件,其根本目的是要提升业务的交付能力。

DevOps 的具体表现形式可以是工具、方法和流水线,但其更深层次的内涵还是在思想方法,以敏捷和精益为核心,通过发现问题,以系统性的方法或者工具来解决问题,从而实现持续改进。

因此,测试工程师也必须深入理解 DevOps 思想的核心和精髓,才能在自动化测试和测试工具平台的实现上做出最契合的设计。无论是测试工程师,还是测试开发工程师,都会成为 DevOps 实践成功落地的重要推动力。

要想真正学习和掌握 DevOps,并不是简单地学习几款工具的使用,更重要的是需要有 DevOps 思维,能够将各个工具有机结合,提供高效的 CI/CD 流水线。

对于 DevOps,我建议的学习路径是,你可以从深入掌握 Jenkins 之类的工具开始,到熟练应用和组合各种 plugin 来完成灵活高效的流水线搭建,之后再将更多的工具逐渐集成到流水线中以完成更多的任务。

相信通过这样的学习,当你再面对相关的测试工作时,必然可以轻松应对。

前端开发技术
前端开发技术的发展突飞猛进,新的框架与技术层出不穷,Vue.js,Angular 和 React 等让人应接不暇。并且,还有很多在此类框架基础上开发的组件库可以直接使用,比如 AntD,大大降低了前端开发的难度和时间成本。

但是,前端开发技术的发展和测试又有什么关系呢?

从测试工程师的角度来讲,如果你能够掌握前端开发技术,也就意味着你可以更高效地做前端的测试,更容易发现潜在缺陷。同时,你还可以自己构建测试页面,来完成各类前端组件的精细化测试,大大提高测试覆盖率和效率。

从测试开发工程师的角度来讲,很多测试平台和工具都需要 UI 界面,比如很多公司内部构建的测试数据服务和测试执行服务,如果你能熟练掌握基本的前端开发技术,那你就可以很方便、高效地构建测试平台和工具的 UI。

关于前端技术的学习路径,通常你首先需要掌握最基本的 JavaScript、CSS、JQuery 和 HTML5 等知识,然后再去学习一些主流的前端开发框架,比如 Angular.js、Backbone.js 等。当然现在的 Node.js 的生态圈非常发达,你如果能够掌握 Node.js,那么很多东西实现起来都可以得心应手。

我个人推荐从网上下载一些样例代码进行学习,同时学习使用脚手架从无到有去建立自己的前端应用。

总结
为了应对技术发展趋势,做好软件产品的测试工作,软件测试工程师需要掌握非常多的非测试专业知识,包括:网站架构、容器技术、云计算技术、DevOps 思维,以及前端开发技术的核心知识以及实践。

对于这类新技术的学习,我强烈推荐你直接阅读官方网站的文档以及代码示例。这种方式,可以让你少走弯路,同时保证所学内容是最新的。

当然,我跟你分享的这些非测试专业知识,只是众多技术的冰山一角,你在实际的测试工作中也会遇到更多的技术,希望你可以举一反三,不断扩充自己的知识面,向着一个优秀测试工程师、架构师努力!