5年时间里,自动化测试于我带来的意义,希望你也能早点知道
摘要:在我有限的软件测试经历里,曾有一段专职的自动化测试经历。

接触自动化
那时第一次上手自动化测试,团队里用的是Python,接口自动化测试的框架是requests+Excel+Jenkins,APP自动化测试的框架是Appium。
整个公司当时有一款已有的APP,因此在试用期内,我的任务是完成对已有APP的自动化脚本编写和调试。
记得当时刚开始去,很没有经验,在跟功能测试同学了解了业务之后,只顾埋着头部署环境,突然有一天,测试主管问我,是否要输出一份自动化测试用例。我恍然大悟,于是把功能测试的用例拿来参考了一下,对用例做了一次筛选,输出了一份自动化测试用例(现在回过头看,当时的做法真的很草率,既没有一个自动化测试计划,也没有对自动化用例做评审,只知道功能测试同学的痛点就是迭代太快,回归来不及做)。
用例输出后,大概花了一个月的时间,完成了环境部署和基本用例脚本的编写,那时候大概实现了四五十个场景,并且完成了自动发送测试报告。剩下的两个月,我就一步一步的将场景扩充为二百多个。
其间也遇到了一些问题,比如登录图形验证码的获取,不过使用OCR图形识别很快就得到了解决,同事也有使用云打码一类的平台。
最大的一个问题是,当APP版本更新迭代后,固定页面所有的id、class等属性都会变化,因为这些都是写死在代码里的,如果要更改意味着每个page都要更改,工作量非常之大,而且获取这些属性还需要借助一些工具,如UI AuTomatorviewer 、Appium自带的Inspector。
在忙碌了一段时间后,先找到一个安卓开发,跟他排查了一下,他也找不到问题所在,后面又找了另一个开发,他排查之后发现是安卓混淆打包的问题,他给我出了一个不做混淆打包的APP,这才解决了这一问题。
另外一个比较大的问题是,APP自动化测试的运行时间非常久,我们两三百条用例,如果加上失败重试,大概要跑四五个小时,而且还会出现中间脚本出错运行停止的问题。
记得一个印象比较深的事情是,我们第二天要发版了,头一天下班前我开始跑脚本,等到晚上我一直没有收到测试报告的邮件,于是晚上十点多赶回公司,发现自动化脚本已经停止了。

对于时间久的问题,后面我尝试引入UI AuTomator2(以下简称u2)框架来代替Appium,毋庸置疑,u2在执行速度上有很大优势。
我曾经对比过这两个框架,同一个场景,Appium需要耗时60多秒的,u2只需要20多秒,足足节省了三分之二的时间。
但随之而来新的问题是,u2不太稳定,Appium中查找元素有用到显式等待、隐式等待和强制等待,而u2中看似不需要这些,实际上多跑几遍场景就会发现u2执行太快会找不到元素,因此还得手动加上强制等待。这样一来时间并没有节省多少。
这个问题当时没有得到解决,反而是在我离职后的一段时间里,通过学习pytest-xdist的文档,发现pytest-xdist可以基于ssh和socket来实现分布式执行。
举个例子,假如有200条场景,同时启动2个执行机,那么就会往执行机-1上推送100个场景,往执行机-2上推送另外100个场景,最终两个执行机的测试报告会集成为一个报告。这样的解决方案如果当时能应用到实践中,那么APP自动化测试时间过长的问题会得到完美解决,唯一需要注意的是,每个场景要独立,不能相互依赖。
话说回来,APP自动化测试做下来好像没有产生多少收益,因为只有我一个人开发和维护,所以到了维护阶段就显得耗时耗力,特别是本来一个固定的页面改了或者中间插入了一套新的逻辑,就意味着相当多的页面需要调整。
第二次接触项目
差不多这样做了几个月后,公司开始立新的项目,新的项目一开始就下决心要做接口测试,因此我又介入到这个项目中,参加立项会议、参加技术评审,了解了要做哪些,并且接口文档怎么管理,接口怎么定义等等之后,就开始了新项目的接口测试。
那个阶段,使用requests读取Excel的方式在接口不多的时候还挺方便,因为代码框架比较固定,只需要Excel里修改参数。
但随着接口越来越多,也意味着接口之间的依赖越来越多,Excel管理简直就是灾难,在Excel里要理清不同接口的依赖关系,是非常头痛的一件事。
后来我使用Postman做了一些快速测试,等待时间充裕的时候,再慢慢把整个主流程的接口测试加上。在接口测试阶段,前前后后发现了一些问题,但很大的不足是没有解决Excel存储数据的问题和没有做数据正确性的校验。
而且我们还是和支付相关的业务,这使得接口测试结果只能保证服务是正常的,返回码是正常的,但是数据是否正确无从得知。
直到后来,自动化团队换了一批人,新来的同事开始推行Java栈,使用Springboot+httpclient+Maven来作为接口自动化框架,基本舍弃了之前的Python自动化脚本。
那几个月好几位同事投入到同一个项目的接口自动化脚本的编写中,对比之前我一个人负责两个项目的自动化,情况的确好了很多。
这个自动化也是基于场景的,有做正常和异常输入的校验,以及最后的入库检查,脚本量非常大,所有异常场景的请求数据和期望结果都是入库的,后续请求的时候,先从数据库拿到请求数据发送请求,得到响应结果再和数据库的期望结果做比较,正常场景需要手动写逻辑,响应结果里重要字段的值和数据库里的值做比较。
那个时候,考虑了很多前端无法测到的复杂的场景,并发、幂等之类的,因此发现的缺陷更有意义一点,但是维护成本依然比较高。

自动化是什么?
最近的一两年,我有时会想到自动化测试是什么?自动化测试本来是为提高测试效率而生,有时候使用不得当,却成为测试活动中的累赘。
但不可否认的是,自动化测试仍然是行之有效的,区别只是使用的动机和使用的方式,在我看来,做好自动化测试需要规避以下几点:
不要为了自动化为自动化
自动化测试不能基于KPI,而要看当前的项目适不适合做自动化,有没有足够资源的投入和外部团队的配合。
自动化不是万能的
不要贪多求全,妄想所有的测试场景都能通过自动化实现,尤其是更新迭代快的项目。能把稳定的功能实现,并且做好回归 ,已经足够了。
自动化的场景
一种是基本场景,另一种可以是前端无法实现的场景。
而对于接口中无穷无尽的字段进行严苛的异常校验,来保证足够程序足够健壮,有时候反而没有那么必要。
因为开发周期短的公司一周好几个版本,开发根本就没时间对一些不太重要的字段做异常处理,当然重要字段的类型、长度、非空校验等还是要做。
对自动化的认知
有些同行认为,自动化就是为了发现缺陷的,但是自动化发现的缺陷根本比不上功能测试,发现不了缺陷的自动化就没有意义吗?
事实并非如此,尤其是一些回归测试的自动化,一方面是为了提高效率,一方面是为了增强上线前团队的信心。
团队人才的培养
遇到了一些公司,好不容易做起了自动化,做得也不错,等到负责人离职之后,就没人维护了,然后再招一些自动化测试人员另起炉灶,反反复复,归根结底是没有人做技术备份。
很多测试同学虽然也意识到自动化的重要性。但由于技术基础薄弱,缺乏系统性学习和过来人的指点,又缺少全流程的实战演练环境,很难在短时间内自学成才达到企业的用人要求。还有不少同学卡在编程语言/基础自动化测试技术这一关,更不用说掌握高级自动化实战思维和经验并灵活应用了。
【自动化测试学习建议】
我的自动化测试之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,所以,我和朋友特意花了一段时间整理编写了下面的《自动化测试工程师学习路线》,也整理了不少【网盘资源】,需要的朋友可以文末免费获取网盘链接。希望会给你带来帮助和方向。
1. 自动化测试必备Python编程内容

2. Web UI 自动化测试基础内容

3. Web UI 自动化测试实战内容

4. APP UI 自动化测试基础内容

5. APP UI 自动化测试实战内容

6. API 接口自动化测试基础内容

7. API 接口自动化测试实战内容

8. CI/CD持续集成专项技术

9. 自动化测试框架实战技术

上面就是我整理出来的一份自动化测试工程师技术路径图。希望大家能在这个成长过程中收益良多。全方位提升测试技术,建立一套属于自己的技术体系。帮助大家不断学习和优化技术栈,跟进先进和主流的测试技术,给到大家带来的不仅仅是技术和薪资的提升,更多的是改变测试人在IT技术领域的地位和心态,拔高测试行业的技术深度。
最后:这里有我建立的一个专门交流软件测试方面问题的学习群,里面也有很多大公司的技术大牛。很多时候,技术大牛的几句话就会让我们醍醐灌顶,少浪费时间,如果想要多跟有经验的人学习,就找我加入我的软件测试交流裙194117263,以后有工作的内推机会都相互推荐一下,毕竟我们是关系社会。
相关文章:
5年时间里,自动化测试于我带来的意义,希望你也能早点知道
摘要:在我有限的软件测试经历里,曾有一段专职的自动化测试经历。 接触自动化 那时第一次上手自动化测试,团队里用的是Python,接口自动化测试的框架是requestsExcelJenkins,APP自动化测试的框架是Appium。 整个公司当…...
【MyBaits】SpringBoot整合MyBatis之动态SQL
目录 一、背景 二、if标签 三、trim标签 四、where标签 五、set标签 六、foreach标签 一、背景 如果我们要执行的SQL语句中不确定有哪些参数,此时我们如果使用传统的就必须列举所有的可能通过判断分支来解决这种问题,显示这是十分繁琐的。在Spring…...
涅槃重生,BitKeep如何闯出千万用户新起点
在全球,BitKeep钱包现在已经有超过千万用户在使用。 当我得知这个数据的时候,有些惊讶,也有点意料之中。关注BitKeep这几年,真心看得出这家公司的发展之迅速。还记得2018年他们推出第一个版本时,小而美,简洁…...
绝地求生 压枪python版
仅做学习交流,非盈利,侵联删(狗头保命) 一、概述 1.1 效果 总的来说,这种方式是通过图像识别来完成的,不侵入游戏,不读取内存,安全不被检测。 1.2 前置知识 游戏中有各种不同的枪械&#x…...
麒麟操作V10SP1系统systemd目标单元
通过命令列出当前系统中所有可用的 systemd 目标单元。 用于被控制系统启动时运行哪些服务和进程,以及系统在运行过程中的行为。 rootkylin:~# systemctl list-units --typetargetUNIT LOAD ACTIVE SUB DESCRIPTION basic.target…...
python基于LBP+SVM开发构建基于fer2013数据集的人脸表情识别模型是种什么体验,让结果告诉你...
本身LBPSVM是比较经典的技术路线用来做图像识别、目标检测,没有什么特殊的地方 fer2013数据集在我之前的博文中也有详细的实践过,如下: 《fer2013人脸表情数据实践》 系统地基于CNN开发实现 《Python实现将人脸表情数据集fer2013转化为图像…...
antd——实现不分页的表格前端排序功能——基础积累
最近在写后台管理系统时,遇到一个需求,就是给表格中的某些字段添加排序功能。注意该表格是不分页的,因此排序可以只通过前端处理。 如下图所示: 在antd官网上是有关于表格排序的功能的。 对某一列数据进行排序,通过…...
案例11:Java超市管理系统设计与实现开题报告
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
@JsonAlias 和 @JsonProperty的使用
JsonAlias 和 JsonProperty 前言一、JsonAlias二、JsonProperty总结 前言 使用场景:主要运用于参数映射。 如:将admin_id 的值赋予adminId 常用于:接收第三方参数,并对参数进行驼峰化或别名。 一、JsonAlias 是在反序列化的时候…...
Grafana系列-统一展示-8-ElasticSearch日志快速搜索仪表板
系列文章 Grafana 系列文章 概述 我们是基于这篇文章: Grafana 系列文章(十二):如何使用 Loki 创建一个用于搜索日志的 Grafana 仪表板, 创建一个类似的, 但是基于 ElasticSearch 的日志快速搜索仪表板. 最终完整效果如下: 📝…...
【K8s】openEuler23操作系统安装Docker和Kubernetes
openEuler23操作系统安装 服务器搭建环境随手记 文章目录 openEuler23操作系统安装前言:一、前期准备(所有节点)1.1所有节点,关闭防火墙规则,关闭selinux,关闭swap交换,打通所有服务器网络&am…...
异常数据检测 | Python实现ADTK时间序列异常数据检测
文章目录 文章概述模型描述程序设计参考资料文章概述 异常数据检测 | Python实现ADTK时间序列异常数据检测 智能运维AIOps的数据基本上都是时间序列形式的,而异常检测告警是AIOps中重要组成部分。 模型描述 笔者最近在处理时间序列数据时有使用到adtk这个python库,在这里和大…...
软件测试之jmeter性能测试让你打开一个全新的世界
一、Jmeter简介 1 概述 jmeter是一个软件,使负载测试或业绩为导向的业务(功能)测试不同的协议或技术。 它是 Apache 软件基金会的Stefano Mazzocchi JMeter 最初开发的。 它主要对 Apache JServ(现在称为如 Apache Tomcat…...
Redis数据结构——动态字符串、Dict、ZipList
一、Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题: 获取字符串长度…...
ipad可以用别的品牌的手写笔吗?便宜的ipad电容笔
而对于那些把ipad当做学习工具的人而言,苹果Pencil就成了必备品。但因为苹果Pencil太贵了,学生们买不起。因此,最好的选择还是平替电容笔。作为一个ipad的忠实用户,同时也是一个数字热爱着,这两年来,我一直…...
【数据库】关于SQL SERVER的排序规则的问题分析
在安装报表系统,运行sql语句时候提示“无法解决 equal to 操作的排序规则冲突。”,费了半天时间才搞定,原来是因为sql语句中没有加全collate Chinese_PRC_CI_AI_WS ! 用排序规则特点计算汉字笔划和取得拼音首字母 SQL SERVER的…...
算法修炼之练气篇——练气十三层
博主:命运之光 专栏:算法修炼之练气篇 目录 题目 1023: [编程入门]选择排序 题目描述 输入格式 输出格式 样例输入 样例输出 题目 1065: 二级C语言-最小绝对值 题目描述 输入格式 输出格式 样例输入 样例输出 题目 1021: [编程入门]迭代法求…...
ChatGPT:AI不取代程序员,只取代的不掌握AI的程序员
作者:成都兰亭集势信息技术有限公司技术总监张雄 可能大家会有如下的问题,我就使用chatGPT这个AI工具的API来问一下。 问:chatGPT会替换掉程序员吗?如果能,预计好久? 答:作为一名 AI 语言模型&a…...
数字革命下的产品:百数十年变迁的启示与思考。
随着数字化时代的到来,软件开发成为各行各业不可或缺的一部分。然而,传统的软件开发方法需要长时间的开发周期,高昂的成本和大量的人力资源。因此,低代码开发平台应运而生。低代码开发平台通过简化开发人员的工作和加速软件开发流…...
部门新来一00后,给我卷崩溃了...
2022年已经结束结束了,最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备今年的金三银四的面试计划。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必要的,它几乎涵盖了所有的…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
