前言
严格来讲,测试开发也属于开发的一种,只是输出的产品和服务的用户群不同罢了,我所在的部门主要负责通过技术手段提高部门内业务测试和开发同学的工作效率来达到保障产品质量的目的。最近一两年我主要负责部门内自动化能力和专项测试体系的建设,在这过程中接触到了很多其他的技术栈,比如Devops、后端&前端框架、CI、CD、Python、iOS(PS:之前我是做Android开发的)等。
其实,我在实践过程中发现,合理应用容器技术,不仅能提升开发效率,而且还能提升技术水平。
快速上手新技术
众所周知,新技术的学习往往从学习简单示例(例如Hello World)开始,这是学习新知识的标准思路:最小系统原则,即从变量最少的最小系统开始,循序渐进地学习。
现实生活中,简单的事物背后往往蕴含着复杂的机制。用户在构建最小系统的时候,首先面对的就是环境(或者说前置条件)的搭建。虽然随着程序语言自身的发展,周边工具越来越多,但学习成本仍然居高不下,各大技术论坛中关于环境安装的问题总是层出不穷。
就拿专项测试中的耗电量测试来说吧,这块领域目前还比较空白,在《APP耗电量测试白皮书》这篇文章中提到的battery-historian是我调研各种方案的过程中发现作为分析工具口碑比较不错的一个,考虑到希望快速验证测试分析效果,不想在配置环境上花费太多时间,于是通过docker的方式在本地服务器上快速部署好了一个耗电量测试平台:
docker run --restart=always -d -p 9999:9999 bhaavan/battery-historian
通过Docker的使用,用户可以将精力和注意力都尽快地放在语言本身的学习上,而无须折腾系统环境的各种配置。Docker官网的口号就包含了以上含义:Build,Ship and Run Any App,Anywhere,即“任何应用都可以自动构建、发布、运行于任何环境”,将环境的影响因素降至最低,全面掌控应用整个生命周期。
面向业务开发
最近几年,各种新的技术和工具层出不穷,虽然万变不离其宗,但能快速掌握新的业务需求和新的技术栈,对一个优秀技术人员来说非常重要。
例如,在自动化测试系统中需要集中管理被测应用,对外提供包下载服务,这时需要部署一个Nginx服务作为静态文件服务器,因为官方的Nginx镜像mime类型不支持应用下载,所以我去Docker Hub搜索到Nginx官方镜像,根据自身业务需求修改Dockerfile定制了符合要求的镜像,然后快速部署启动:
docker run -d -p 8899:80 --name webserver -v /Users/mafei/Downloads:/usr/share/nginx/html/ logan62334/nginx
可见,容器技术可以帮助我们更加专注地面向业务需求,快速启用新技能。
降低运维成本
还是拿之前文章《终端自动化测试探索之路》中提到的自动化测试平台来说,其中涉及了Jenkins环境、Android&iOS编译环境、Python环境、Nodejs环境等,因为我们的自动化服务器集群有3~5台机器,如果每台都去配置这些环境成本有点高,而且一旦出现升级版本之类的情况运维成本也会比较高,而通过容器技术可以有效改善这些痛点,参考上篇文章《利用Docker+Jenkins+Pipeline完成Android自动化测试打包服务》。
提高开发工作效率
经常整理和收集常用代码库是软件工程师实现高效交付的“秘诀”。
在技术团队中,为何行业新人和资深工程师之间的生产力可以有几十倍的差距呢?暂且不论基础技能和经验的差距,同样是做一件任务,新人首先面对的就是工具的选型,然后需要解决工程实践中的各种“坑”。而资深工程师接手后,可以快速规划所需要的资源,并在最短时间内利用积累的模块搭建起系统,从而可以快速完成任务。
目前Docker官方支持的编程语言镜像已达几十种,涵盖所有的主流编程语言的开发环境。除此之外,常用数据库、缓存系统、主流Web框架等都有官方的镜像,另外,Docker Hub还提供了丰富的第三方镜像。
比如想要通过Flask+MongoDB来快速部署一个Web服务,完全可以用Docker Compose编排功能将Python、Flask、MongoDB等镜像组合起来,就可以快速搭建起一个完整的Web服务。
使用Docker Hub发布开源项目
技术人员从社区借鉴和学习各种好用的工具和技能时,也需要积极反馈社区,共同营造一个良好的生态环境。
读者如果参与开源项目的建设,那么可以通过Docker完成程序的打包、测试、发布和部署,通过Docker Hub来管理和维护镜像,这样可以统一又清晰地管理整个开源项目。