NO.1 DevOps中的自动化测试
自动化测试是将自动化工具和技术应用于软件测试,旨在减少测试工作,更快,更经济地验证软件质量。有助于以更少的工作量构建质量更好的软件。
自动化测试有以下优点:
✔ 缩短测试时间。测试自动运行,可以提高测试效率,缩短测试时间。
✔ 实现手工测试难以完成的测试场景。比如性能测试。
✔ 减少测试工作量。测试自动化可以让测试人员专注于手工测试部分。
✔ 降低人为失误。每次测试的结果和执行的内容固化为脚本,可减少人为失误。
✔ 保证软件质量。通过强有力的自动测试,软件质量得以保证。
NO.2 测试左移
Bug是不可避免发生的,我们无法阻止bug发生,阻止bug发生只会隐藏问题,完全没bug的软件是不存在的,那么我们该怎么做呢?DevOps提倡的理念是“Fail fast, Fail early”,尽量在软件开发的早期阶段暴露问题,避免在软件开发后期去修复问题。让我们从工程实践角度来看一下bug在需求阶段,设计阶段,测试阶段等不同阶段引入的比例和发现的比例,从图上我们能看到85%的bug都是在coding阶段引入的。
当bug越往后修复的难度、修复的成本却越来越高,到了发布阶段,需要花费的成本是编码阶段的640倍!
问题发现得越晚,修复成本呈指数级增长。在集成阶段发现问题的修复成本是编码阶段修复成本的40倍!
造成修复成本高的原因有几个:
复现困难:线上问题,集成问题,牵扯到多个模块,如何复现?如何模拟真实环境?多线程的场景?
定位困难:出现一个线上问题,如何定位,多团队如何配合,如何确定根因?
修复困难:如何确定修复方案,谁来修,临时方案还是长久,是否是架构问题,多个模块都需要修复会增加再一次间接引入问题成本,修复会不会引入其他问题?
这就是为什么DevOps提倡要尽早发现、尽早暴露问题,也就是测试左移。
使用必要的测试手段在软件开发周期的早些阶段发现和解决问题,需要重视代码扫描、单元测试覆盖和接口测试,这些手段每次提交代码都会自动执行并及时报告问题,做到“Fail fast, Fail early”。发现问题不是关键,关键是形成质量意识的生态,不断减少存量问题,不断减少问题的发生。测试左移,需要各环节共建配合。
自动化测试是产品交付不可或缺的一部分,而持续集成、持续交付是DevOps的核心理念,因此,自动化测试是DevOps的重要基础。
CI/CD建立在自动化测试基础上
NO.3 名通经验分享
2020年12月23日,名通专家在全球通大厦北三B分享了自动化测试的经验,并给出了最佳实践总结:
一
代码从不隐藏设计者的意图
? 代码简洁,树立代码是技术债务观念。
? 全员学习,严格执行、监督、分阶段推进、考核、总结!
?观念的颠覆带来思想、行为的转变。
截止2019年底,基本实现0漏洞、0Bug、少异味。
✔ 项目的代码质量有了较大提高,在发生需求变更时,可以做到应对自如!
✔ 性能有了较大的提升,1升1降(成功率提升了、接口访问时延降低了)是最好的证明!
✔ 业务逻辑耦合度逐步解耦,朝着“微服务”发展。
✔ 工程代码不再是一堆散乱的、堆砌的文件,逐渐变得结构化。
✔ 版本逐步归一化,深刻认识到无节制地、随意地拷贝工程的可怕。
一个项目代码扫描结果变化
二
单元测试编织质量安全网
单元测试编写规范:
? 每个单元测试必须有断言
? 一个单元测试只测一个场景
? 一个单元测试函数不超过15行代码
? 单元测试函数之间不能有任何依赖关系
? 所有单元测试函数均可独立、重复运行
? 所有单元测试函数执行必须是毫秒级
截止2020年3季度,整体单元测试覆盖率超过40%,做到更自信的发布和重构。
三
自动化接口测试与压力测试可以更早更全面发现问题
接口测试的好处:
✔ 更早发现问题。接口测试可以在功能界面未开发出来之前对系统的接口进行测试,从而更早的发现总是并以更低的成本修复问题。
✔ 测试更全面。系统中的有些 bug 如果想通过 UI 层功能测试会比较困难,或者构造测试数据和测试条件非常复杂,而通过接口测试可以更简单、更全面的覆盖到底层的代码逻辑,从而发现一些隐藏 bug。
✔ 测试门槛低。接口测试使用Postman、Jmeter、SoupUI等工具就可以实施,无需掌握开发技能。
✔ 自动化测试。验证通过的接口测试用例可以保存成脚本,上传到DevOps 流水线后可自动执行。
我们在实际生产中使用Postman做API测试,使用Jmeter做压力测试。
Postman作为chrome的一个插件,可发送任何类型的http请求,方便测试api接口。可快速构建请求,保存以供后续使用,且可分析api返回的响应数据。
Postman在本地完成api请求的测试后,导出测试脚本(json文件),上传到gitlab中的test目录文件夹。
Jenkins已集成newman执行环境,可执行测试脚本。后续代码提交时,jenkins通过newman执行postman测试脚本,实现自动化接口测试。
流水线完成后,可在控制台查看测试报告。
在性能测试方面,Jmeter通过多线程模拟服务器访问压力。与PostMan的使用过程类似,Jmeter组装报文后,可导出jmx文件,与接口测试一样上传gitlab上TEST文件夹内。测试用例可集成到jenkin上,构建自动执行测试用例。同样可在jenkin中通过控制台查看测试报告。
生产中测试用例逐渐增多,通过人工管理、执行测试用例,来保证测试的全面性是不现实的。将测试用例集成到DevOps流水线上,可减少人力的消耗,由流水线替代人力操作,自动化执行测试,保证版本发布的顺利与产品的高质量。
四
自动化UI测试做到自信发布
UI自动化测试工具基于SELENIUM、APPIUM等主流开源技术构建,与DevOps流水线技术兼容。通过自研可视化脚本录制工具、报告管理工具等降低使用门槛,提高开发效率。
UI自动化测试工具包括验证脚本开发及维护、验证脚本执行及结果反馈、业务逻辑处理三方面。具备以下三个特点:
?可视化:自研可视化验证脚本录制工具,降低使用门槛,提高脚本开发效率。
? 组件化:以最小业务单元为单位录制验证脚本,脚本之间可自由组合、复用形成验证计划。功能变更后只需修改或重新录制相应业务单元脚本,维护方便。
? 自动化:验证脚本运行无人值守,支持定时运行或人为触发运行。运行结束后自动生产验证报告,并向工程测试人员发送短信通知运行结果。
UI自动化测试工具目前应用于全业务开通领域的掌上运维集客专线产品功能验证,以及综合代维系统按次费工单功能测试,不仅能节省大量存量功能测试时间,还能提升关键存量功能测试覆盖率,减少人为失误。
NO.4 小结
自动化测试是持续测试的基础,如果没有持续测试,也就不能对持续集成进行及时验证,自然就无法做到有效的持续交付,因此,自动化测试是实现DevOps转型的重要条件。
作为持续测试必需的能力,自动化测试不仅仅是工具的运用,还需要过程、方法等多方面的支撑,尤其是思想的转变,只有建立起测试很重要、测试左移这些理念,才能把自动化测试做好。这种氛围的培养需要网管系统的共同参与,让我们通过定期的经验分享、培训,通过相互学习,从“只重视系统功能开发”向“功能和质量并重”的方向转变。