本达人课到目前为止,谈得都是如何实施自动化的测试。但是,无论整个流程多自动化,都需要“人”这个角色来加以设计、开发、管理和维护。这离不开测试人员的全力投入。长期以来,测试人员在开发企业中常常面临着定位不清晰、职业发展路径未明,乃至被管理层认为可有可无的窘境。这一方面,固然与企业对于质量的重视不足有关,需要企业管理层、开发团队负责人员加以改进,另一方面,也的确需要测试人员从自身角度分析原因:怎么样不断提升自己的能力,适应新技术、新架构、新趋势。
在这最后一节课,我想谈谈 QA(质量测试人员)这个角色在微服务架构下的演变方向。
DevOps的出现
早期的软件开发只有软件工程师一人完成,为了提高效率逐渐实行分工模式:开发(Dev)、测试(Test)、运维(Ops)。不同角色担任不同的任务。分工越来越细之后带来了问题也越来越突出,那就是各角色之间的沟通成本越来越高。而全栈工程师、DevOps 和 TestOps 等职位和概念的提出,本质就是把不同的工作集中在一个人身上,或者让一个人涉及到更多方面的工作,从而来降低这种沟通成本。
下面这张图显示的是开发、测试和运维之间的关系。
QA 与 Ops 组合而成的 TestOps,对于测试人员来说是最重要的新方向。但是,要了解 TestOps,必须要先了解 DevOps,因为这是目前已经发展较为成熟的、经过实践验证的概念。
在微服务架构之下,主流的工作流程为:开发人员提交代码到代码仓库,微服务所独有的持续集成 CI 和持续交付 CD 工具,会自动拉取代码,调用一个配置中心,再连接对应远程服务器,将代码部署到服务器上,而后启动服务,再通过工具,或者借由开发、测试人员之间的沟通,通知测试人员进行测试。测试通过后,部署到预生产环境/过渡环境和生产环境,如下图所示。
上图中,红色框内的工作流就被称之为 DevOps。DevOps 是一个完整的面向 IT 运维的工作流,以 IT 自动化以及持续集成(CI)、持续部署(CD)为基础,来优化程式开发、测试、系统运维等所有环节。
Wikipedia 对 DevOps 的定义是:DevOps 是一种软件工程文化和实践,旨在统一软件开发(Dev)和软件运维(Ops)。DevOps 运动的主要特点是在软件构建的所有步骤中极力提倡自动化和监控,从集成、测试、发布到部署和基础设施管理。DevOps 的目标是缩短开发周期,增加部署频率,更可靠的发布,与业务目标紧密结合。
DevOps 在技术领域的实践
DevOps 的影响包括在企业文化层面和技术层面。这里着重介绍它在技术层面的实践方法:
-
内建质量体系:通过持续代码评审、静态分析、自动化测试、自动部署验证等手段构成一套有效的质量保障体系。主要实践包括:
- TDD:测试驱动开发的思想,保证代码质量和不偏离业务需求的技术实现;
- 结对编程和代码审查,依靠团队的自治性让团队成员互相监督和审查代码质量;
- 自动化测试,高自动化,且高频率运行的测试,保证测试用例质量的同时保证了交付软件的质量。
-
持续部署:通过自动化的构建,部署过程快速频繁地将软件交付给用户,提高吞吐量;同时保障过程的安全、平滑、可视化。主要实践包括:
- 在已经做到持续集成的情况下,引入持续部署,每次提交均会出发构建并执行部署;
- 蓝绿部署,用于实现零宕机发布新版本;
- 金丝雀发布,用于使应用发布流程具备快速试错的能力。
-
持续监控:持续对运行环境在系统,应用层面进行监控,及时发现风险或问题,保障系统运行的稳定性。主要实践包括:
- 监控预警,在项目开始初期就引入监控,让整个团队实时能够收到关于产品各个维度数据的反馈;
- 日志聚合,便于错误追踪和展示;
- 分析,利用搜集到的数据实时分析,利用分析结果指导开发进度。
-
度量与反馈:通过对用户行为或业务指标的度量或反馈收集,为产品的决策提供依据。主要实践包括:
- 持续集成反馈,对代码构建质量,代码质量审查的反馈;
- 测试反馈,对软件质量,功能性的测试,给到业务的反馈;
- 运营数据反馈,新功能上线后对业务影响的反馈,用于指导业务人员提新的需求。
-
环境管理:通过对服务器环境的定义,自动化建立和配置、更新等提高基础设施管理的效率,一致性,并更有效利用资源,可伸缩的架构,保证服务的健壮性。主要实践包括:
- 弹性架构,保证服务的吞吐量和具备灵活变更的能力;
- 自动化部署脚本,像胶水一样,用于解决一些工程实践不够完善的流程之间的衔接;
- 基础设施即代码,用代码定义基础设施,便于环境管理,追踪变更,以及保证环境一致性。
-
松耦合架构:对传统应用架构进行领域组件化,服务化,提升可测试性和可部署性。主要实践包括:
- 采用弹性基础设施,比如公有云服务或是 PaaS(Platform as a Service)平台;
- 构建为服务应用;
- 引入契约测试。
结合上述这些技术实践,一个典型的、基于 DevOps 的持续交付流水线如下图所示:
DevOps 使用的主流工具
下面整理了 DevOps 使用的主流工具,其中有些已经在前面的课程中介绍了使用方法。
-
版本控制和协作开发: GitHub、GitLab、BitBucket、SubVersion、Coding、Gitee;
-
自动化构建和测试: Apache Ant、Maven、Selenium、UnitTest、JUnit、JMeter、Gradle、PHPUnit;
-
持续集成和交付: TeamCity、Jenkins、Capistrano、BuildBot、Fabric、Tinderbox、Travis CI、flow.ci Continuum、LuntBuild、CruiseControl、Integrity、Gump、Go;
-
容器平台: Docker、Rocket、Ubuntu(LXC)、第三方厂商如 AWS/阿里云/Azure 等;
-
配置管理: Chef、Puppet、CFengine、Bash、Rudder、Powershell、RunDeck、Saltstack、Ansible;
-
微服务平台: OpenShift、Cloud Foundry、Kubernetes、Mesosphere;
-
服务开通: Puppet、Docker Swarm、Vagrant、Powershell、OpenStack Heat;
-
日志管理: Logstash、CollectD、StatsD、ElasticSearch、Logstash;
-
监控、警告和分析: Nagios、Ganglia、Sensu、zabbix、ICINGA、Graphite、Kibana。
从 DevOps 到 TestOps
在 DevOps 逐渐被广大软件企业、开发团队接受以后,人们发现, DevOps 和测试人员之间的沟通壁垒仍然存在,还需要进一步降低。于是逐步引出了 TestOps 的角色。TestOps 可以定义为“测试运维”,其主要目的是从质量控制的角度,推动整个研发体系与发布体系的融合。可以这样理解:DevOps 是从研发推动配合运维和测试,而 TestOps 是从测试角度推动研发和运维。所以,TestOps 才是真正把测试落地到整个研发体系的关键岗位。
它的具体工作内容包括:
- 持续集成工具的搭建和维护;
- 配置中心的代码编写和维护;
- 服务相关的处理和维护;
- 测试人员的本职工作,即产品测试。
下图中的红框就是 TestOps 的工作范围,也即是 QA+Ops 的范畴:
TestOps 的技能要求
TestOps 人员,必须能够提供测试所需的基础设施和平台,以及执行所有级别的测试,从单元测试一直到最后的端到端测试。这意味着,他们/她们需要具备下列能力:
-
Dev 能力:用于测试工具开发和运维工具开发,而不是业务代码的开发。常用语言包括:Java、Python、PHP、Shell。
-
Ops 能力:用于微服务设施和基础设施的搭建和维护,但是不同于运维人员所做的服务性能和安全性监控。常用工具包括:TeamCity、Jenkins、Docker、Maven、Ansible、Git、Linux。
-
Test 能力:这涵盖了测试人员所需具备的测试能力和对整个测试体系的运用,包括测试用例、测试方法、缺陷生命周期、单元测试、接口测试、契约测试、端到端测试等。
这无疑对测试人员的技术水平提出了更高的要求,但是好处是非常明显的。
对于团队来说,这样可以:
- 促进合作,降低了交流成本;
- 更加有效地控制持续交付生命周期;
- 实现高质量的持续集成。
对于测试人员自己来说,则可以:
- 掌握运维技能,更加游刃有余地完成测试的配置;
- 学会如何利用自动化测试来实现持续交付;
- 主动控制开发生命周期,在整个团队中获得更大的发言权。
由此而见,虽然 DevOps 能推动整个开发、运维团队统一研发流程,帮助团队更敏捷的提交产品,但是无法发现开发过程中测试的缺陷。只有专业的 TestOps,才能站在专业的测试角度推动测试、开发和运维的协调进行。TestOps 和 DevOps 构成了一个完整的持续集成和持续交付体系,从而完善了整个微服务架构下的工程师队伍体系。
TestOps 之父、微软测试专家 Seth Eliot 曾经指出:“在 Facebook 和微软 Bing 开发团队中,只有统一的工程团队,而没有单独的测试人员。对于开发人员而言,目标不只是开发代码,还应当完成上述所有的 Testops 任务。”
最后,抛开所有这些术语、概念,我认为,测试人员提升自己的综合能力才是关键:培养自己的编程能力,更早地介入项目测试(单元测试、契约测试),提高自己的(接口/UI)自动化能力,提升测试效率,同时学习运维技术,能够独立部署和维护测试环境。这样,才能提升自己在整个团队中的话语权,既保证了整个开发产品的质量,又为自己的职业生涯拓展了更宽的道路。
我经常发现,很多有着十年甚至更长时间的测试人员、开发人员,他们并不是具备十年的工作经验,而只是把自己第一年的经验重复了十遍!要想摆脱这样的局面,必须不断革新自己的知识体系,拥抱 DevOps、TestOps、微服务这些新的发展趋势,提高自己在职场和行业中的竞争力,居于不败之地。