如何实现敏捷交付中的自动化测试优化

news2024/12/22 6:15:41

在提及自动化测试的时候,很多人会把工具的使用等同于自动化测试。自动化测试应该是一个策略性的系统化工程,不只有自动化工具。自动化测试要发挥其频繁快速的质量反馈作用,还需要团队从文化和技术上去建设和学习。

提到敏捷交付,我们总会说到持续集成,持续交付,持续发布,即频繁地交付产品特性。而我们都知道要实现真正的持续交付,必然少不了两个关键要素:

  • 持续集成工具
  • 自动化测试 , 自动化的产品质量反馈机制

只有测试不行,只有集成工具也不行,二者需合二为一,保持相同的步调,实现持续不断的质量反馈,方能实现保质地持续发布。


自动化测试不只自动化工具

可以开门见山地说:Automation Test ≠ Automation Tools ≠ Continuous Test

根据我个人的项目经验,试着画了下面这个图来表达这三者的关系。

在提及自动化测试的时候,很多人会把工具的使用等同于自动化测试。自动化测试应该是一个策略性的系统工程,不只有自动化工具。像我们的产品一样,不仅要有技术语言,还要有产品架构设计。自动化测试除了工具框架,还需要考虑:

项目的技术栈,产品架构,开发流程,基础设施,可靠的测试数据,稳定干净的测试环境,如何呈现测试报告,如何工程化测试配置,测试套件等等。

有了自动化测试还不够,我们的目的是在持续交付的过程中实现快速频繁的质量反馈,我们需要持续不断地测试(Continous Testing)。实现持续测试,不仅需要团队从文化上去支持,真正做到全员对测试和质量负责,创建Devops文化氛围,打通开发-测试-运维的壁垒;还需团队从技术上去储备知识,比如云平台、虚拟化技术,容器及相应的编排技术,甚至网络知识等等。

维基百科对自动化的解释:

In software testing, test automation is the use of software separate from the software being tested to control the execution of tests and the comparison of actual outcomes with predicted outcomes.

从定义可以总结出自动化测试的两个特点:

  • 自动化测试本身也是软件
  • 自动化测试基于预期结果进行断言

测试,质量评估的重要手段之一,而自动化测试只是测试的一种具体实现方式而已。它能释放QA的双手和一部分大脑(这部分大脑,即know knowns),将对已知特性和既定逻辑流程的检测交由计算机来完成。而QA去做更多需要思辨能力,分析判断能力的事情。例如,通过向团队提问,来澄清需求的unknowns;通过探索产品去拓宽对产品的knowns;抑或运用经验帮助团队走出Unknown Unknowns 带来的迷局。

维基百科对持续测试的解释:

Continuous testing is the process of executing automated tests as part of the software delivery pipeline to obtain immediate feedback on the business risks associated with a software release candidate.

从这个定义可以看出,持续测试的目的即在软件交付的流水线中执行自动化测试以提供对产品质量的反馈。

想强调定义里的几个关键字:automated tests, delivery pipeline, immediate feedback, business risks.

  • automated tests 而不是automated test,一个产品只有一种,或者某一层级上的自动化测试是无法达到整体质量评估的,持续测试需要不同类型的自动化测试在交付的不同阶段为产品的不同层级提供反馈。
  • delivery pipeline,immediate feedback,自动化测试一定是和交付流水线交合集成的,至少是同频运行的,不是孤立的,只有这样才能就团队每一次的新变更对产品质量的影响做出快速而及时的反馈。
  • business risks,持续测试广义上来说包含交付中的所有质量反馈行为,既要测试左移,质量内建,也要测试右移,实现产品质量主动监控,不然无法识别业务风险。

测试工具的选择需要考虑项目的技术栈,也需要考虑QA自身的技术能力。

不管多火的工具,如果不能兼容项目的技术栈和基础设施,那都无处发挥其优势,流行的不一定是适合项目的。

在写自动化之前,QA需要对项目的技术栈,开发流程,和基础设施有基本的认识和了解;另外也需要了解和掌握各个工具之间的优劣,这样才能为项目选择最匹配的自动化工具。是不是像老生常谈?但是别人告诉你的经验和自己经历的实战真的两种不同的收获。就跟蹲家看电视和去现场看演唱会的区别一样,别人的经验之谈总归是别人的,自己走过的路才是自己的。

这两年Cypress真的很火,去年在项目上做UI自动化测试的时候,出于好奇也想实践一把。实践出真知,Cypress本身可以通过环境变量和plugin配置代理,但是不支持socks5的代理(客观现状是项目所有资产,包括测试环境都是通过socks5的代理连接),线上环境无法访问。当时还试过将socks5的代理转换成http代理,但因为Cypress本身是多线程的,而socks5只能截获第一个进程的网络通信, 即使能连通应用本身,Cypress也无法将测试过程可视化的优势发挥出来。人无完人,工具也一样,只有适合你的才是好的。

考虑自己也不会造轮子,喜欢拿来就用,加之项目上socks5代理约束,之后便转用了CodeceptJS, 几次尝试下来,觉得非常满足项目需要。下面罗列CodeceptJS 几个好用的点,具体细节请移步官网。

  • 支持不同的helper: WebDriver, Puppeteer, Protractor, Nightmare, Testcafe, 我在项目上选用的是Puppeteer。
  • 支持web也支持mobile,当时项目上的第一个产品是有手机端版本的, 这也是选择这个工具的一个考虑。
  • 封装良好的页面元素操作方法,拿来即用,对于不擅长编码的我来说,非常友好。
  • 因为项目产品是和矿场上爆破紧密相关的,很多产品都有矿场地图展示和设备可视化,CodeceptJS 提供了现成的codeceptjs-resemblehelper以实现视觉上的回归测试。
  • 最近发现它还支持API测试,包括REST和GraphQL的, 但是这部分特性尚未实践。

由于团队有完全的自由来选择技术栈,在做第三个产品的时候, 我们的开发小哥哥就已经不满足于只写REST API了,第三个产品开始引入GraphQL。在以前的项目上用过REST Assured 做API测试,觉得也是好用的,但当时并没有选用REST Assured, 因为在那时,刚好发现一枚ThouhgtWorks开发自己做的API功能测试工具 Pandaria。(这也从侧面证明TW的开发很有质量意识)选择这个工具,除了自己不会造轮子,除了它支持代理,更重要的是它基于Cucumber JVM,我个人以前的项目上用过cucumber,对gherkin语法还算熟悉,还有它能提供漂亮的测试报告。它既支持REST API的测试,也支持GraphQL 的测试,完美匹配我个人的技术和项目的实际情况。


选择合适的时候做自动化, 避免不必要的浪费。

在项目做第一个规范安全流程的产品时,MVP1(Minimum Viable Product) 一完成,该产品的接口自动化测试和端到端自动化测试便实现了,并集成到了产品CI/ CD 流水线上。后来由于客户方硬件集成的问题,该产品基于MVP1进行了一次演进,从产品直接融入并规范安全流程换成了‘曲线救国’地强化安全流程,页面和接口设计也有较大变动。由于产品流程设计上的变动导致之前的接口测试和端到端的自动化测试全部都失效,需要重新编写和维护。

这个经历挺真实的,自动化是有好处,但是也是有代价的:在MVP1,特别是POC(Proof Of Concept)阶段的产品建议不要急于做自动化,项目的初期更别尝试做UI层面的自动化。当然对工具的spike是可以的,把框架搭建好,等待特性稳定了,就可以直接加测试用例了。

我们选择自动化一定是要考虑项目是否存在客观的现实需求,在动手实施具体的自动化测试之前,一定要对自动化测试的投入产出比做一次客观理性地评估。如上图所示,自动化测试的成本相对单次(或者少量的)手动测试来说是较高的,为了少量的测试活动而做自动化,投入产出比是很低的。需要QA根据项目进度,产品演进程度,测试策略,回归频率等等做一个综合评估,找到出图中交集的点,即何时何种情况团队和产品应该必须引入自动化测试了。因为自动化前期需要投入产品分析,工具框架选型,用例设计,数据环境准备等等,后期还需要持续不断地投入人力进行及时的维护和更新以保证自动化测试的严密性和足够的覆盖率。


自动化测试和产品代码一样重要,需要全员负责。

虽然敏捷强调质量全员负责,但我所待过的团队,做过的项目,践行得好的很少。幸运的是,现在团队的质量意识都很好。但故事一开始不都是美好的,每个团队都是在 “掉坑-反馈-调整磨合” 的循环里走向成熟的。

在交付一个微服务化的产品时,后端多个API,每个API有相应的API集成测试,产品还有UI测试,同时团队还有额外的3个产品需要维护。每个产品都有自动化测试,前端的后端的。其中一个微服务实现的产品就有四套测试,而且后续还会增加视觉测试。

在刚开始的时候,测试挂了没人去看,也没人去修。由于项目是基于Truck Based Development,为了保证测试的及时性,每天不是在加新用例的路上,就是在修各种测试的路上。UI测试相较于API测试更为脆弱,需要频繁的维护成本,特别是项目基于主干开发的团队。那段时间感觉自己成了automation engineer,对产品新增的功能特性并不是非常清楚,对故事卡的可测性也没及时作出反馈,感觉自动化并未真的达到释放自己精力和时间的初衷。

如果只是QA一个人来维护管理,那么这个QA一定做不了自动化以外的事情了。ThoughtWorks好多项目都只有一个QA,我们的这个QA是Quality Analyst, 并不是Automation Engineer。敏捷项目之下,QA的首要任务应该是驱动团队各个角色对质量负责。

为了提升团队对自动化测试的重视程度, 如下是一些我个人在项目上实践过的方法:

  • 为每套自动化测试编写清晰的README, 保证团队里除你以外其他的小伙伴,也都清楚明白如何运行自动化测试。
  • 除了实用的README引导团队如何运行测试,可视化良好的测试报告也非常必要。如下是我们项目上的测试报告:

  • 让UI测试更稳定,请求开发把页面的关键组件元素加上ID 属性,用唯一的ID去定位元素就稳定多了。
  • 建议每个Dev提交代码前,在本地自行运行测试脚本,保证自动化测试的及时性和正确性,并对新变更提供及时的质量反馈。

除了以上,项目还需要有高度可视化或者能及时通知测试状态的方式。

项目上用的是Jenkins自带的 Build Monitor View。将对项目pipeline的监控投影到电视上,并配置相应的提示音,能非常及时地让团队知道最新的构建,部署,测试状态。

如下是我们项目上当前的一个流水线dashboard:

这些实践都是对‘质量全员负责’最落地的践行。我相信,每个团队是不一样的,但是敏捷QA的主要价值一定是能驱动团队为质量作出改进和贡献。

敏捷QA是对项目流程质量,产品内部质量,产品外部质量都需要负责的,而自动化测试只是质量保证的一种措施而已而非唯一措施。‘质量全员负责’的团队才能释放出你们的QA,去做更多Quality Analysis的工作,比如提更多需要思辨能力的问题以实现产品风险的识别和管理,反思开发流程以促进团队流程质量的提升,分析产品架构制定适合项目产品的整体测试策略等等。


持续测试除了自动化测试还需要QA和团队具备Devops相关的技术。

在项目上做自动化集成到流水线的时候,有遇到一些常见的在云容器里运行测试会遇到的问题。

1)测试工具相关的

  • 在容器里安装puppeteer之前,需要手动下载Chromium包以及相关的依赖。
  • 在docker里面启动puppeteer,要么配置一个puppeteer的user,要么选择去掉默认的沙盒环境。
  • 当时还遇到因为docker默认的64MB内存空间不够,Chrome渲染页面崩溃

虽然很多问题都是可以从网上找到答案,但是在解决问题的时候,通常需要我们了解工具框架的工作原理,否则连搜索关键字可能都憋不出来。

2)测试报告可视化相关的

测试报告对于我们快速定位失败根因有很大的帮助,好的测试报告可以直接揭示问题的根源。在云端运行测试,我们通常希望测试工具能输出可读性强的测试报告以方便非技术人员阅读,也希望测试工具能把运行过程的细节打印在console里,以方便技术人员定位根因。

像前面提到的CodeceptJS它就提供多种不同形态的运行,并且可以运用Mocha生成各种类型的测试报告。目前市面上的测试工具,都会有对第三方库的依赖,特别是前端测试框架和工具,这个对QA或者团队的技术宽度是有一定要求的。

另外Jenkins有非常丰富的插件库,在选择测试工具的时候可以把是否有Jenkins报告可视化支持考虑进去。QA需要对Jenkins和测试工具都相当熟悉,还需要知道如何通过将某一测试工具生成的某种格式的测试报告集成在Jenkins上以方便一键获取测试报告。像cucumber的测试报告插件:

像Allure的测试报告插件:

有了这些插件的辅助,在流水线上就一键可得测试报告,为‘质量团队负责’提供了很好的契机。

3)Pipeline as Code, 想要集成测试到流水线,不可避免是需要一些DevOps相关知识的

也许项目的需求是如何通过Jenkinsfile 并行运行各种测试,也许是通过Jenkinsfile传递测试相关参数以为云上运行测试所用,还也许你需要在Jenkinsfile里添加调试信息用以线上调试,等等。

云上运行,我们还要学会如何在一个slave 上优雅地管理运行测试的容器,不出现容器占用,slave内存不足,测试失败之后报告不可得等等问题。

所以只会自动化工具不够,只有自动化测试也不够。如果你们团队开发们没有DevOps的经验,或者他们忙于特性开发,上线冲刺,那么QA必须对Docker,Kubernetes 基本命令和用法有些了解。QA就是一个不分前后端,不挑技术栈,需要持续不断学习的角色。


最后用个比喻结束这篇文章

会自动化工具算是有了织网的道具,有自动化测试资产算是编出了能捞鱼的网,而持续测试才能真正地实现持续交付,才算是把一张张过滤不同缺陷的网放置于了不断提交变更的交付之流中。

只有网而无法至于河里,或者不知道于何处放置,那就只能站于岸边时时撒网捕鱼,不够及时,也不算释放了捕鱼人(QA和团队)

我们期望的是,各种不同的网(自动化测试资产),置于不同的河段(软件产品的不同层级:函数级别?组件级别?接口级别?系统级别?),过滤不同的鱼(缺陷),而不管是谁(团队的所有角色)都可以去确认有没有捞着鱼(测试挂了吗?为什么挂?我们对目前的变更有足够的信心吗?),也需要所有人时时确认我们的渔网是不是破了?(测试覆盖率不够?断言不严谨?测试用例过时?)

软件交付是一项团队工作,即便自动化测试也一样需要全员协作。

正在做测试的朋友可以进来交流,群里给大家整理了大量学习资料和面试题项目简历等等....

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库监控与调优【十二】—— JOIN语句优化

JOIN语句优化-JOIN种类、算法与原理 JOIN的种类 笛卡尔连接(cross join) -- 举例:通过笛卡尔连接查询两张表的结果集和单查两张表的结果集对比 SELECT count( * ) FROM users a CROSS JOIN orders b; SELECT ( SELECT count( * ) FROM user…

SpringBoot + Vue前后端分离项目实战 || 四:用户管理功能实现

系列文章: SpringBoot Vue前后端分离项目实战 || 一:Vue前端设计 SpringBoot Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接 SpringBoot Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接 文章目录 前端…

微服务: sleuth和zipkin的用处与zipkin安装使用(下)

目录 0. 上篇传送门: 1. 前言简介 mq安装传送门: 微服务: 01-rabbitmq的应用场景及安装(docker) 1.1 Sleuth是一款分布式跟踪解决方案。 1.2 Zipkin是一个开源的分布式跟踪系统。 2. zipkin安装方式 2.1 windows下安装zipkin: 2.1.0 下载jar包位置 2.1.1 下载后,找…

数值计算例题整理

数值计算 一、误差的来源和分类二、有效数字第一个大题(非线性方程组的迭代法)第二个大题(LU分解)第三个大题(牛顿插值法)第四个大题(直线拟合) 一、误差的来源和分类 误差是描述数…

Git 原理和使用

Git 安装 Git是开放源代码的代码托管⼯具,最早是在Linux下开发的。开始也只能应⽤于Linux平台,后⾯慢慢的被移植到windows下,现在,Git可以在Linux、Unix、Mac和Windows这⼏⼤平台上正常运⾏了。 Linux-centos 安装git sudo yu…

8.3 PowerBI系列之DAX函数专题-矩阵Matrix中高亮显示最大最小值

需求 用颜色标量年度最大最小值 用颜色标示折线的最大值最小值 实现 在条件格式–规则–基于字段进行计算 度量值 is_max_min var displayed_data calculatetable( addcolumns( summarize(‘订单表’,‘产品表’[商品次级类别],‘订单表’[订单日…

arcgis栅格影像裁剪--shp

1、打开软件,导入数据,如下: 2、裁剪面形状如下,为shp文件: 3、在arctoolbox中找到"数据管理工具"--"栅格"--"栅格处理"--"裁剪"工具,如下: 4、打开裁…

(ESP32)报错-portTICK_RATE_MS‘ undeclared

(ESP32)报错-portTICK_RATE_MS undeclared 问题详情ESP- IDF未正确设置 问题详情 报错提示 portTICK_RATE_MS undeclared (first use in this function); did you mean portTICK_PERIOD_MS?具体情况 已经引用相关头文件,并且右键后可以大概…

leetcode 2462. Total Cost to Hire K Workers(雇用 K 名员工的总成本)

每次从 开头candidates个 和 末尾candidates个 工人中选择一个cost最小的。 如果有2个工人cost相同,就选index较小的。 每个工人的cost在数组costs里。 直到雇够k个工人。 问雇k个工人需要多少cost. 思路: 可以考虑用一个优先队列,按cost排…

2023开放原子全球开源峰会——一场开发者的盛宴

文章目录 上午场下午场开发者之夜 #“2023我在开源峰会”特别征文# 2023开放原子全球开源峰会,6月11日-13日在北京盛大召开,开幕第一天正好是周六,没什么事情,一大早就过去了,早晨大概7点出发,公交、地铁一…

Docker Desktop 安装使用教程

一、前言 作为开发人员,在日常开发中,我们需要在本地去启动一些服务,如:redis、MySQL等,就需要去下载这些在本地去启动,操作较为繁琐。此时,我们可以使用Docker Desktop,来搭建我们需…

php+mysql期末作业小项目

目录 1、登录界面 2、注册界面 3、主界面 4、学生表界面 5 、查询学生界面​编辑 6、修改学生信息界面​编辑 7、删除学生信息界面 8、添加学生信息界面 9、后台数据库​编辑 一个简单的php➕mysql项目学生信息管理系统,用于广大学子完成期末作业的参考&…

Android Studio导入flutter项目,运行和调试按钮灰色

描述:用android Studio导入flutter项目,运行和调试按钮无法点击并置灰,显示如下 解决方法:检查是否设置如下内容: 1.是否配置了Android SDK ,打开 file > project Structure >project 2.是否配置了F…

【架构】领域驱动设计(DDD)的几种典型架构介绍

文章目录 前言一、专业术语二、架构演变三、限界上下文四、领域驱动设计的四重边界五、整洁分层架构六、六边形架构七、洋葱架构总结 前言 我们生活中都听说了DDD,也了解了DDD,那么怎么将一个新项目从头开始按照DDD的过程进行划分与架构设计呢&#xff…

【Web自动化测试】如何生成高质量的测试报告

运行了所有测试用例,控制台输入的结果,如果很多测试用例那也不能够清晰快速的知道多少用例通过率以及错误情况。 web自动化测试实战之批量执行测试用例场景: 运行 AllTest.py 文件后得到的测试结果不够专业,无法直观的分析测试结果,我们能否…

如何学习和提高CAPL语言编程能力

CAPL是Vector公司开发的,用来配合它的系列产品使用的一款面向过程的语言。CAPL是Communication Access Programming Language的缩写,从字面意思来说,是专门用于通信访问的编程语言。 最初访问CAN总线,现在已扩展到所有的汽车总线…

代理模式(Proxy)

定义 代理是一种结构型设计模式,让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。 前言 1. 问题 举个例子:有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需…

mac部署fastadmin踩坑记录

粘贴一下解决配置,主要Nginx配置问题 //后台NGINX location / {if (!-e $request_filename) {rewrite ^(.?\.php)(/.)$ /$1?s$2 last;# 加上这一句配置试试rewrite ^(.*)$ /ewgadmin.php?s$1 last; # 对应项目修改对应入口文件break;}}//接口文档Nginx配置 loca…

sql server还原新数据库,解决原库还原中...

1)用studyDB库,备份出数据库备份文件 studyDB_backup_2023_06_19.bak 2)用备份文件 studyDB_backup_2023_06_19.bak还原数据新库CollegeStudyDB和原库studyDB到同一服务器 3)数据库CollegeStudyDB按原成功,但是原库s…

Linux环境准备以及CentOS7.6系统安装

(该图由AI绘制 本人提供教学 FREE) 运维概述与Linux系统安装 一、VMware虚拟机 1、什么是虚拟机 其实虚拟机就是在Windows的真机上创建一个独立的其他操作系统的运行环境而且其对宿主机(Windows)没有任何影响。 2、虚拟机的种…