<audio id="audio" title="10 | 软件测试工程师需要掌握的非测试知识有哪些？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/0d/a3/0d6545ae4be3cab46d6406bb0efc1ba3.mp3"></audio>

我在上一篇文章中，跟你分享了测试工程师应该具备的核心竞争力，大多是测试专业知识方面的内容。但是，在专栏第一篇文章中，我提到了这样一个观点：一个优秀的测试工程师，必须具备宽广的知识面，才能设计出有的放矢的测试用例，保证整个软件产品的质量。

所以，今天我要分享的主题就是，除了测试专业知识外，你还要掌握哪些知识，才能一路披荆斩棘，成长为一名优秀的测试工程师，或者是测试架构师。

与开发工程师相比，你需要了解的技术种类要多得多，视野也要宽广很多，只是在每类技术的深度方面不如开发工程师。

**你可以参照下面这个比喻，来理解开发工程师和测试工程师的对知识的要求：开发工程师通常是“深度遍历”，关注的是“点”；而测试工程师通常是“广度遍历”，关注的是“面”。**

那么，测试工程师需要掌握的非测试知识主要有哪些呢？

如果你花时间静下心来仔细想一下，很可能会把自己吓一大跳，需要了解掌握的非测试知识实在是太多了，这简直就是一个mini版的系统架构师啊！

- 小到Linux/Unix/Windows操作系统的基础知识，Oracle/MySQL等传统关系型数据库技术，NoSQL非关系型数据库技术，中间件技术，Shell/Python脚本开发，版本管理工具与策略，CI/CD流水线设计，F5负载均衡技术，Fiddler/Wireshark/Tcpdump等抓包工具，浏览器Developer Tool等；
- 大到网站架构设计，容器技术，微服务架构，服务网格（Service Mesh），DevOps，云计算，大数据，人工智能和区块链技术等。

可以说，测试工程师需要掌握的这些技术，几乎涵盖了当今主流软件技术的方方面面。当然，你也不可能一口气吃成胖子，所以我就挑选了几个我认为比较重要，又符合当前技术趋势的关键知识点，和你分享。

希望我的分享，可以帮助你在面对新的技术趋势时，站在更高的高度，更好地把握测试工作的内涵和外延。

## 网站架构的核心知识

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

这时，如果你想要做好互联网产品功能测试以外的其他测试，比如性能测试、稳定性测试、全链路压测、故障切换（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官网的教程](https://docs.docker.com/get-started/)，在这里你完全可以理清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思维，以及前端开发技术的核心知识以及实践。

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

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

## 思考题

你所在的测试领域，还有哪些非测试知识是必须掌握的，这些知识可以从哪些方面帮到你呢？

欢迎你给我留言。


