不同于传统的瀑布式开发,开发人员不再是“流水线上的工人”,DevOps更关注软件开发人员和操作人员之间的有效协作,我们可以把DevOps看作开发、技术运营和质量保障(QA)三者的交集。
在理想的DevOps周期中,遵循着这样步骤——开发人员编写代码,在QA环境中构建并部署二进制文件,执行测试用例,以稳定的集成流程将成果部署至生产环境当中。很明显,这种方法非常强调构建、部署与测试环节的自动化。使用持续集成(CI)工具,自动化测试工具已经成为DevOps周期中的一种规范性因素。
敏捷测试与DevOps测试之间仍存在着不少细微差异,但熟悉敏捷开发人员一般能够快速适应DevOps。事实上,敏捷原则主要体现在开发及QA迭代当中,但在运营领域则普及度不高。DevOps的核心,正是纠正这一差距。现在,DevOps不再单纯强调持续集成,而更多强调“持续开发”。在流程中,编写出的代码将被提交至版本控制系统,而后在生产环境中进行构建、部署、测试与安装,之后交付最终用户使用。
由于整个环境与流程严格遵循标准化要求,各环节中的每位参与者都将因此受益。链内各项操作都以自动化方式进行,利益相关方能够将精力集中在设计并编码高质量的可交付成果之上,彻底摆脱构建、运营与QA流程带来的负担。从编写代码、到提交代码、再到生产部署以供最终用户使用,整个周期被显著缩短到3到4个小时之内。
DevOps中的QA角色
在传统的软件测试中,QA人员会在指定环境中对已部署的build成果进行功能与回归测试,并投入几天时间持续测试,关注现有成果还有哪些问题。但这一切在DevOps当中都变得完全不同。比如,QA人员需要在DevOps周期内协同工作,保证所有测试用例全面实现自动化,并获得接近100%的代码覆盖率;他们需要保证环境标准化,实现环境与QA框架间的自动对接;所有预测试任务、清理、后测试任务等全部自动执行,与持续集成周期保持统一。
DevOps要求交付链内的各项功能实现高度协同。这也意味着链内各参与者的角色定位有所变化,或者说开始相互融合,这为开发人员赋予了一定的部署权限。部署工程师可以将测试用例添加至QA repo当中,QA工程师则负责提供自动化测试用例。总体而言,链内的每位参与者都将为交付成果的质量与及时性负责。
DevOps与测试自动化
为了实现这种强大的速度与敏捷性,最重要的就是实现测试流程的全面自动化,确保其能够在QA环境中完成部署并自动运行。为此,我们需要构建起专门的自动化测试工具与持续集成工具,建立一套成熟的自动化测试框架,借此快速编写出新的测试用例,具体来看有以下几点。
第一,为特定build挑选合适的测试用例;第二,测试执行在本质上应该遵循精益原则;第三,QA与开发人员需要当面交流,确定特定build中可能产生重要影响的具体因素,同时执行针对性测试与健壮性测试;第四,需要配置专门的代码分析与覆盖率工具,确保能够实现接近100%的代码覆盖率;第五,回归测试的结果将很快过时,必须熟悉持续测试这一全新理念;第六,需要明确指定与新功能相关的测试策略,将临时build交付给QA人员,QA人员创建测试脚本并在临时build上运行自动化测试,直到代码稳定性达到要求并足以部署至生产环境中为止;第七,所有测试环境必须实现标准化,且部署流程必须全面自动化;第八,使用多种自动化技术,确保QA人员能够在多种跨平台环境或浏览器内运行自动化测试;第九,并发执行测试以缩短存活时间,这又将反过来促进DevOps的成功实施;第十,为每轮测试运行设置退出标准,确保在将测试结果反馈给流程后,由其做出明确的通过或未通过决策;第十一,在生产环境中部署代码之前,需要报告并修复已发现的问题或严重bug,相关信息通过同一事件链进行传递。
测试之余,对应用程序监控的工作也不容忽视。QA人员还应及早发现问题并主动报告,在生产环境上设置监控机制以便在bug引发实际故障之前将其识别出来,还可以设置专门的计数器,如响应时间、内存与CPU利用率等,为最终用户提供全面的洞察能力。举个例子,如果在各个build中,登录的平均响应时间逐渐增加,则后续build很可能因为响应时间过长而影响到最终用户的实际使用体验。
同样的,QA人员还可以在生产环境中定期执行部分现有高优先级测试用例,借此主动监控运行环境。此项策略可以捕捉到“偶发性”或者“无法重现”的bug,最终提升应用程序稳定性、增强最终用户满意度。最终,这些监控结果都能够以丰富的报告形式,如包括故障日志与屏幕截图等自动收集并发布。
总结
瀑布式流程让位于V-Model,V-Model又被敏捷化取代。软件开发理念就是这样一代代快速更迭。毫无疑问,DevOps代表着未来。这样一种持续改进周期,将让软件开发流程获得全面的动态特性。我们有必要接纳DevOps、理解DevOps并最终贯彻DevOps。以往的测试概念仍然有效,将这些宝贵的经验与自动化、特别是更高水平的自动化相结合,正是实现DevOps成功的核心前提。