当前位置: 首页 > news >正文

【呕心沥血】整理全栈自动化测试技术(三):如何编写技术方案

前面两篇笔记我介绍了自动化测试前期调研注意事项和前置准备阶段切入点,有同学在后台提问:

“做完前期的调研和准备工作,领导要求写一个落地方案并评审,自动化测试的落地方案该怎么写”?

首先这个要求我觉得挺正常,一方面评审可以查漏补缺完善细节,另一方面也可以考察具体的落地经验和能力。

其次,我认为技术方案其实有个通用的模版,或者说抽象的经验参考,这也是本篇文章我想聊的话题。

结合个人的工作实践和思考,我认为构成一个技术方案,有如下五点要素:

  • 背景现状:当前的业务、技术表现,遇到了什么问题;
  • 痛点挑战:这些问题对业务和技术带来了哪些痛点,要解决痛点面临哪些挑战;
  • 落地方案:为了解决上述的痛点和挑战,打算从哪些方面用什么手段在什么时间来解决;
  • 产出价值:产出是什么,从哪些维度衡量产出,用哪些指标评估问题的解决程度和创造的价值;
  • 总体规划:整体规划是什么,短中长期里程碑是什么,要投入哪些资源,需要谁协同配合,对业务和团队价值;

下面的内容,我会从上述五点要素来展开说明。

阐述背景现状

首先,在编写技术方案的时候,第一也是最重要的一点,一定要阐述清楚项目背景或当前现状。

我发现很多同学有所谓的技术偏执,遇到问题第一反应是解决问题,拿着锤子满世界都是钉子。

但其实,我更建议在遇到问题时,首先应该考虑如下几点:

  1. 当前问题是偶发问题还是频发问题;
  2. 类似的问题在其他团队/场景是否存在;
  3. 除了方案A,有没有方案B或者方案C来解决问题;
  4. 如果不做该方案,当前问题造成的损失是否可以接受;

这样思考问题的好处在于:

  1. 避免陷入技术陷阱,在低层次挣扎;
  2. 找到更高维度的解决方案,解决更大更多的问题;
  3. 降低重复解决低级问题而带来的资源浪费和精力分散;

那如果要落地自动化测试,背景或者说现状怎么写呢?可以参考如下例子:

  1. 业务范围大,业务场景复杂,每次发版要回归的case太多;
  2. 业务趋于稳定,但测试时间较少,可能无法发现更多更细节的问题;
  3. 迭代周期比较快,测试人力资源不足,回归测试无法覆盖更多的场景;

如上例子仅供参考,阐述背景的原因在于体现当前面临的问题,以便引出后续的解决方案,这是有的放矢。

列举痛点挑战

上面列举了三条当前现状的例子,从中可以发现,当前的现状带来了哪些痛点和挑战。总结如下:

  1. 测试case比较多,回归耗时(时间);
  2. 业务稳定但测试时间不足,容易漏侧(质量);
  3. 测试人力资源不足,会导致测试时间变长或加班赶工(成本);

还记得之前我在软件工程的文章中提到的质量三要素吗?他们分别是时间+范围+成本。

当然,日常工作中还有可能有其他痛点,比如测试用例中很多前置动作都是重复性场景,比如日常测试效率不高需要提高测试过程效率,再比如测试团队的技术建设等原因。

列举痛点和挑战的目的在于,即承接了上面的现状和问题,又可以为后续的技术方案铺路,整体逻辑要清晰合理

说明落地方案

阐述了现状背景,列举了痛点挑战后,接下来就是要说明通过什么方式来解决这些问题,这就是落地方案。

一般在编写技术方案时,我个人的经验是如下几点必须重点说明:

  1. 技术方案针对的需求或业务范围(比如核心业务,核心服务,高频流程);
  2. 技术方案的选型、对比结果和demo效果是否适合当前的团队(成熟稳定的工具+活跃的生态&丰富的文档+简单的上手难度+较低的维护和二次开发成本);
  3. 方案落地所需要投入的资源(人力+时间+购买的资源)、需要哪些团队&人协同配合(沟通协作管理成本);
  4. 方案落地有哪些关键节点&里程碑(落地步骤1-2-3-4-5,分别在什么时候达成什么效果解决什么问题);
  5. 不同里程碑阶段,用哪些指标度量评估问题得到了解决,项目达到了预期效果;

技术方案编写完成后,一定要拉上领导和相关同学以及配合方进行评审。一方面是查漏补缺,另一方面也体现出自己的专业能力,当然有的时候最好能和协作团队达成利益一致,这样可以获得更好的支持配合。

罗列产出价值

具体的落地方案评审结束,接下来就要重点聊聊项目产出和价值了。

产出决定了你的工作量,价值决定了你的KPI和年终绩效,因此这点还是很有必要重点说明的。

当然,衡量产出和价值,一定需要具体的可量化的指标,否则无法量化的东西无法谈价值。

以自动化测试为例,我个人的观点是基于实际的目的出发来制定度量指标。举例:

自动化测试目的

细分类型

度量指标

如何度量

效率

造数据效率

  1. 每周造数条数
  2. 平均造数耗时
  3. 造数任务调用量

和手动造数耗时对比

冒烟测试效率

冒烟执行耗时

和手动冒烟测试耗时对比

线上回归效率

回归执行耗时

和手动回归测试耗时对比

覆盖率

接口覆盖率

  1. P0/P1接口覆盖率
  2. 总体接口覆盖率

梳理核心接口,投入最多资源精力

用例覆盖率

  1. P0case覆盖率
  2. P1case覆盖率

梳理核心case,投入最多资源精力

业务场景覆盖率

  1. 正向场景覆盖率
  2. 逆向场景覆盖率
  3. 核心场景覆盖率

根据业务场景,case by case度量

过程质量

构建执行成功率

自动化任务执行成功率

低于某个阈值判定脚本质量不通过

用例执行通过率

自动化case执行成功率

低于某个阈值判定提测质量不通过

制定度量指标时,建议遵循如下几点:

  1. 切忌面向指标/面向KPI做度量;
  2. 考虑到冗余成本,指标不宜过多;
  3. 制定指标是为了提升质量,而非做数据;
  4. 根据做自动化测试的目的来制定度量指标;
  5. 度量指标对比应该以是否解决了痛点为依据;
  6. 度量指标是辅助评估依据,并不是唯一正确的结果;
  7. 制定指标应考虑到哪些指标更实际有效,从解决问题角度出发;
  8. 度量指标不要单一的评估,应结合多个维度来综合评估开展质量度量;

概括总体规划

聊完产出和价值,方案基本就算完成了,但为了锦上添花,大家可以考虑阐述自己对于项目的总体规划和构思。比如:

  • 当前现状是A;
  • 第一阶段要达成B效果,解决C问题;
  • 未来半年要达到D效果,这样做的好处的E;
  • 长期来看,遮掩做对业务和技术团队的价值是F;

有句话我觉得说的挺对的,惠而不费的话要多说&事要多做。

  总结:
现阶段很多人都在说软件测试太内卷了,工作太难找了,竞争太激烈了。那么如何在这样的现状下使得自己更具有竞争力呢?笔者认为大家需要迅速学习软件测试的硬技能,提升自己的业务能力,早日摆脱初中级测试的Title,虽然测试人员众多,但是高级的软件测试人员还是很稀缺,有很多人挂着高级测试的头衔却还在干着初中级测试的活。在掌握这些硬技能的同时,软技能的培养同样重要,沟通能力、自主学习能力越来越被企业看重。

如果不想被这个时代淘汰,就要做好持续学习的准备。下方给大家准备了全套的软件测试,自动化测试全套教程。

【需要的可以点击下方官方推广小卡片扫码备注000免费领取】

 

相关文章:

【呕心沥血】整理全栈自动化测试技术(三):如何编写技术方案

前面两篇笔记我介绍了自动化测试前期调研注意事项和前置准备阶段切入点,有同学在后台提问: “做完前期的调研和准备工作,领导要求写一个落地方案并评审,自动化测试的落地方案该怎么写”? 首先这个要求我觉得挺正常&a…...

67. 二进制求和

文章目录题目描述竖式模拟转换为十进制计算题目描述 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a “11”, b “1” 输出:“100” 示例 2: 输入:a “1010”, b “1011” …...

1555数列极差(队列 优先队列 )

目录 题目描述 解题思路 代码部分 题目描述 在黑板上写了N个正整数作成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数a*b1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得…...

代码随想录算法训练营第二十七天 | 93.复原IP地址,78.子集,90.子集II

一、参考资料复原IP地址题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/子集题目链接/文章讲解:https://programmercarl.com/0078.…...

jvm类加载器

概念 Bootstarp ClassLoader (引导类加载器) 加载String等核心的类Ext ClassLoader (拓展类加载器)System ClassLoader (系统类加载器) 加载用户自定义的类 关系 BootstrapClassLoader 包含 ExtClassLoaderExtClassLoader 包含 SystemClassLoader彼此是包含关系,不…...

Rust学习入门--【7】Rust 数据类型

类型系统 对于任何一门语言都是重中之重,因为它体现了语言所支持的不同类型的值。 类型系统 也是 IT 初学者最难啃的三座大山之一,而类型系统之所以难以理解,主要是没有合适的现成的参考体系。 我们说类型系统 存在的目的,就是 …...

阅读MySQL必知必会,查缺补漏

MySQL自带数据库 information_schema:是MySQL自带的数据库,主要保持MySQL数据库服务器的系统信息,比如数据库的名称,数据库表的名称,字段名称,存储权限等。 performance_schema:是MySQL系统自…...

MySQL数据库10——多表连接查询

数据如果在多个表里面,需要进行连接查询。 一般在pandas里面merge合并会用到一个索引,按这个索引的规则进行合并叫做有规则的等值连接。若不按规则连接,遍历两两组合的所有可能性,叫做笛卡尔积。 笛卡尔积连接 通常人们都会设置…...

华为OD机试 - 括号检查(Python)| 真题含思路

括号检查 题目 现有一字符串 仅由 (,),{,},[,] 六种括号组成,若字符串满足以下条件之一,则为无效字符串 任意类型的左右括号数量不相等 存在未按正确顺序(先左后右)闭合的括号, 输出括号的最大嵌套深度 若字符串无效则输出 0 0 <= 字符串长度 <= 100000 输入 一个只…...

安全渗透测试中的一款免费开源的超级关键词URL采集工具

安全渗透测试中的一款免费开源的超级关键词URL采集工具。 #################### 免责声明&#xff1a;工具本身并无好坏&#xff0c;希望大家以遵守《网络安全法》相关法律为前提来使用该工具&#xff0c;支持研究学习&#xff0c;切勿用于非法犯罪活动&#xff0c;对于恶意使…...

数据资产管理实践白皮书(6.0版)解读

目录 第一章数据资产管理概述 ( 一 ) 数据资产管理和数据要素的关系...

c/c++开发,无可避免的函数指针使用案例

一、函数指针简介 函数指针是指指向函数而非指向对象的指针。像其他指针一样&#xff0c;函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定&#xff0c;而与函数名无关。例如&#xff1a; char* (*pf1)(char * p1,char *p2); 这是一个函数指针&#xff0c;其…...

QT(12)-QThreadPool

1 简介 QThreadPool是Qt框架中的一个类&#xff0c;提供了一组工作线程池。该线程池自动管理一组工作线程&#xff0c;在线程可用时分配任务。使用线程池的主要优点是&#xff0c;它可以减少创建和销毁线程的开销&#xff0c;因为可以重复使用线程。 线程池设计用于场景中&am…...

【Java|golang】1138. 字母板上的路径

我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”]&#xff0c;如下所示。 我们可以按下面的指令规则行动&#xff1a; 如果方格存…...

Flink 1.14从简单到源码第三讲

文章目录 1.flink多流操作Api1.1split 分流操作1.2.侧输出流1.3.connect 连接操作1.4.union 操作1.5 coGroup 协同分组1.6 join1.7 broadcast 广播2.process3.并行度和Api3.1 任务提交简单流程3.2 task与算子链4. Flink 时间相关(窗口计算)4.1时间语义(窗口计算)4.2 新版api指定…...

淘宝API接口系列,获取购买到的商品订单列表,卖出的商品订单列表,订单详情,订单物流,买家信息,收货地址列表,买家token

custom自定义API操作buyer_order_list获取购买到的商品订单列表buyer_order_detail获取购买到的商品订单详情buyer_order_express获取购买到的商品订单物流buyer_address_list收货地址列表buyer_address_add添加收货地址buyer_info买家信息buyer_token买家tokenseller_order_li…...

ucos-ii 的任务调度原理和实现

ucosii 任务调度和原理1、ucos-ii 任务创建与任务调度 1.1、任务的创建 当你调用 OSTaskCreate( ) 进行任务的创建的时候&#xff0c;会初始化任务的堆栈、保存cpu的寄存器、创建任务的控制块&#xff08;OS_TCB&#xff09;等的操作&#xff1b; if (OSTCBPrioTbl[prio] (OS_…...

Solon2 开发之容器,七、切面与函数环绕拦截

想要环绕拦截一个 Bean 的函数。需要三个前置条件&#xff1a; 通过注解做为“切点”&#xff0c;进行拦截&#xff08;不能无缘无故给拦了吧&#xff1f;费性能&#xff09;Bean 的 method 是被代理的在 Bean 被扫描之前&#xff0c;完成环绕拦截的注册 1、定义切点和注册环…...

代码随想录第十天(28)

文章目录28. 找出字符串中第一个匹配项的下标看答案KMPnext数组&#xff08;前缀表&#xff09;最长公共前后缀如何计算前缀表前缀表与next数组时间复杂度分析28. 找出字符串中第一个匹配项的下标 莫得思路……好久没做题&#xff0c;都已经忘得差不多了 看答案 其实就是自己…...

循环队列来了解一下!!

笔者在之前的一篇文章&#xff0c;详细的介绍了&#xff1a;队列之单向链表与双向链表的模拟实现&#xff1a;https://blog.csdn.net/weixin_64308540/article/details/128742090?spm1001.2014.3001.5502 感兴趣的各位老铁&#xff0c;可以参考一下啦&#xff01;下面进入循环…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

写一个shell脚本&#xff0c;把局域网内&#xff0c;把能ping通的IP和不能ping通的IP分类&#xff0c;并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...