【测试工程思考】测试自动化基础能力建设

1 回顾

传统软件研发体系下定义的软件测试是从用户视角设计的。测试是试图穷尽用户行为的工程,从测试用例(use case)的英文定义就可见一般。测试的逻辑资产就是用自然语言去描述用户的操作行为或路径。

但随着软件工程向分布式架构和敏捷交付的变革。软件设计变得比以前更加复杂,要验证一个分布式部署的微服务架构应用,简单的use case根本无法发掘应用的质量风险。一个无论是代码上还是能力上都高度依赖其他组件/模块的应用,都不允许测试还像对待黑盒一样进行质量评估。测试需要有更细致,更全局,更系统的洞察力去识别潜在的质量风险。因此,“测试”这个工种在更多的团队里被定义成概念更宽泛的QA。

2 测试自动化的语言学原理

被测对象是用编程语言构筑的,如果测试用例是自然语言编写的,那从测试用例作用到被测对象,是需要多轮语义转译的。从单元测试中获得灵感,如果我们的测试用例和被测对象用同样的语言,这种语言上的同构会省掉语义转译的麻烦。让我们的测试能够像探针一样,深入到代码逻辑的缝隙,做更有针对性的观测和假设验证。

  • 微服务应用的验证那就基于API/SDK定义的schema驱动测试。测试断言可以精确到每个接口返回的字段(这是自然语言用例观测不到的)
  • 应用可靠可用性的验证就用打桩的方式改变一部分组件代码的返回结果作为假设来触发单点故障
  • 大规模背景数据模拟或者数据迁移的验证就直接用脚本访问数据库,比通过接口请求更加快捷。

因此QA的能力要求在此基础上变得更高,除了编程基础,还需要更系统的分析和动手等综合能力。因此越来越多的测试工程师职位转变为“测试开发”。

3. 自动化代码在测试工程中的重要性

3.1 代码即生产力

自动化框架的设计结构将测试脚本的开发变成搭积木游戏或者是数据集驱动的盲盒游戏。一个验证动作,手动执行永远是重复最小粒度的操作,AW的灵活组合,可以快速生产出新的业务逻辑的测试脚本来。

对于较小的改动或粒度比较小的需求,高优先级的脚本用例和文本用例可以同时编写,一些不明确的预期结果可以立马呈现出结果。

对于一个即将生成50-100个大特性的需求来说,直接用自动化构筑验证任务,比写文本用例高效得多。

3.2 代码即资产

测试代码被纳入版本管理工具,有系统性的组织和传递,除了要求测试代码符合公司的自动化规范,还要小组内部达成一致:

  • 对齐频繁调用的公共AW,查漏补缺,统一路径,避免多个地方重复出现功能一致的AW
  • 对齐脚本组织结构和特性树,测试脚本不是业务代码,是为了提高测试效率的测试语言,要能有助于快速执行继承和回归测试
  • 对齐自动化实现的层级和事件节点,不同分级的用例不但表征用例的优先级,也可以作为用例自动化的优先级:优先级越高的用例,越早实现
  • 对齐AW封装程度:AW封装程度越高,测试脚本越简洁直观,但是会提高定位成本和学习成本,复杂的封装关系蒙蔽了测试逻辑本身就适得其反了。

3.3 代码即知识

敏捷开发实践中,不断的迭代导致还来不及写文档,特性细节就又变化了。一个变化的特性,在传统既定的测试流程中设计大量文本的调整。一些部门组织中对测试用例文本的可信度的执念构筑着产品整体的质量信心,但在版本节奏催促下,测试人员最可能的反应是直接手动验证,一个特性验证完,相关的测试资产没有完整记录跟踪,测试资产的可信度很难在高强度下得到保证。文档没有比肩代码的版本控制系统。不可避免会对成员造成误导。

3.4 代码即沟通语言

业务交流时团队定期内部传递能力的重要部分。以定期业务培训和团队知识库管理两种方式维护。

在组织团队培训时,往往是主讲人输出后,听众雅雀无声。双方对领域知识都有相同的了解程度,才能让交流更加顺畅。在架构庞大,调用链过长的系统中,测试代码可以精准快速定位到具体的问题。从某一行代码、某一个断言触发, 可以节省很多自然语言的描述。

在管理知识库时,我们发现文档偏描述性语言,优势在于承载设计思路和逻辑架构,但无法传递具体的测试方法。一堆命令行和截图的拼凑的文档不如一个好的测试脚本:静态代码阐述测试步骤,动态执行体现实测结果。

在系统日渐复杂的产品测试团队中,全员熟悉每个特性和业务细节、演进进度的学习成本和沟通成本巨大,但又不能完全各自为营不闻不问,测试脚本就是很好的沟通语言,它建立在懂代码、懂测试框架这样的基础公共能之上,原则上具备这类公共能力的人员即可理解。如果不能,一种可能是脚本质量差,一种可能是测试对产品知识储备少,无论那种可能,都指向一个更好的提升方向——代码提交者优化测试脚本,代码阅读者补齐相关背景知识,而文档形式的知识,不具备这种生命力。

4 特性测试责任人即脚本责任人

传统测试自动化策略是基于在设计好的用例中,识别可自动化的用例,由相关开发或专门编写测试脚本的人员完成。这种实践方式带来两个问题:

  1. 新特性场景用例开发代价高,自动化交付不及时
  2. 继承特性用例无效或无法再多种场景下重用

从对特性理解和产品整体把握上,专职的脚本开发人员没有特性测试责任人理解深入,从测试文本到测试脚本的转化,中间会产生很多认知沟通成本。
并且,从绩效结果导向上看,特性直接测试责任人如果只对交付结果质量负责,缺少自动化的驱动力就会也缺少对整体测试脚本的掌控力,在后期,整个团队的测试资产对齐维护和测试脚本有效性上都会付出更多的成本。

当要求测试团队每个成员都具备脚本开发,甚至是测试框架的深度理解后,测试代码的开发会从简单的AW组装变成更贴近产品形态结构的简洁高效设计。

高效的自动化能力储备需要前期积累的自动化能力基础,并投入更多的精力去维护和提升自动化测试的效率:

  • 测试自动化是一个细水长流的过程,应该成为测试人员的习惯动作
  • 要将这个习惯培养成好的习惯,制定一定的团队公约并自觉遵守让更多成员获益
  • 同时也要悉心呵护自动化资产,才能让大家的好习惯不至于乏味

5 建设高可用自动化能力

CI/CD不只是代码持续交付的优质生产力,测试执行也可以接入CI/CD流程中。用容器承载每个版本的测试代码,规划一部分核心用例作为转测门禁来实现测试前移

用监控业务的方法,监控测试结果。云平台的运维监控平台不光可以监控基础设施硬件,集群业务指标。将短平快的核心用例打包发布到现网(测试后移),将拨测结果视为为测试服务的业务指标,在监控运维平台上对接测试结果,可以进一步提升测试发现问题的效率。

测试能力的迁移和后移,让测试工程的精力更多得投入到更有价值工程创造上去。

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

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

相关文章

进阶向:AI聊天机器人(NLP+DeepSeek API)

什么是AI聊天机器人? AI聊天机器人是一种通过自然语言处理(NLP)技术模拟人类对话的智能程序系统。其核心是建立在机器学习算法和大型语言模型基础上的对话引擎,能够理解用户的自然语言输入,分析语境和意图,并生成符合上下文的相关回复。 这类机器人系统通常包含以下几个…

一个C#的段子

猜猜按钮的结果是啥。 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } public static bool flag true; privat…

使用 gptqmodel 量化 Qwen3-Coder-30B-A3B-Instruct

代码部分 : quantize_qwen3_coder_30b_a3b_instruct_gptq.py import os########## 环境变量设置 ########## # 当前可用的 CUDA 编号 os.environ["CUDA_VISIBLE_DEVICES"] "1" # GPU 显存资源片段优化 os.environ["PYTORCH_CUDA_ALLOC_CONF"] …

基于python、django的疫苗接种管理系统

基于python、django的疫苗接种管理系统

Go语言实战案例:使用sync.Map构建线程安全map

在并发编程中,共享资源的访问是一个绕不开的问题。Go 中的 map 在并发读写时是不安全的,直接使用可能导致程序 panic。因此,在多协程同时访问 Map 的场景下,必须采取有效的同步措施。本篇将通过一个实战案例,介绍 Go 的…

关于vue2中对接海康摄像头以及直播流rtsp或rtmp,后台ffmpeg转码后通过ws实现

最近项目中需要对接摄像头监控,海康摄像头为rtsp流格式有一个软件VLC media player,可以在线进行rtsp或者rtmp流播放,可用来测试流地址是否可用功能实现思路为后台通过fmpeg把rtsp流进行转码,然后通过ws方式进行一帧一帧推送。&am…

Docker容器强制删除及文件系统修复完整指南

Docker容器强制删除及文件系统修复完整指南 故障现象与原因分析 ​故障表现​: ERROR: for c9ca40be974d_OpIsosMD_OB unable to remove filesystem unlinkat /data/docker/storage/containers/c9ca40be974d...: structure needs cleaning​根本原因​:…

Matplotlib 知识点总结

1. 基础绘图(plot函数)基本语法:plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)功能特点:可绘制点、线和组合图形自动生成x轴(0-N-1)当x未指定时示例:绘制两点连线、多点不规则线等代码…

高可用微服务架构实战:Nacos集群+Nginx负载均衡,Spring Cloud无缝对接

"当你的注册中心挂了,整个微服务就变成了无头苍蝇。" 这是我在生产环境踩坑后最痛的领悟。今天,我将分享如何用Nacos集群Nginx搭建坚如磐石的注册中心,让你的微服务永不迷路! 在 Windows 环境下配置 Nacos 集群&#x…

Spark大数据处理实战指南

Spark 简介 Apache Spark 是一个开源的分布式计算框架,专为大规模数据处理而设计。它通过内存计算和优化的执行引擎显著提升了数据处理速度,适用于批处理、实时流处理、机器学习和图计算等场景。 核心特性 高性能:利用内存计算(In-Memory Processing)减少磁盘 I/O,比传…

浏览器缓存机制全解析:强缓存与协商缓存

浏览器缓存是浏览器为提升页面加载速度、减少服务器压力和节省网络带宽,在本地存储资源(如 HTML、CSS、JS、图片等)的机制。其核心分为强缓存和协商缓存,并涉及多种 HTTP 头字段和存储位置。以下是详细解析:⚙️ 一、缓…

知识随记-----Qt 实用技巧:自定义倒计时按钮防止用户频繁点击

Qt 技巧:实现自定义倒计时按钮防止用户频繁点击注册 项目场景 在一个基于 Qt 开发的聊天应用中,用户注册时需要获取验证码。为防止用户频繁点击获取验证码按钮,需要实现一个倒计时功能,用户点击后按钮进入倒计时状态,倒…

Linux与Windows应急响应

本人首先进行了linux的应急响应,windows之后再进行 Linux与Windows应急响应初体验1 linux应急响应1.1 账户:1.1.1 使用cat /etc/passwd命令查看passwd文件2.1.2 使用cat /etc/shadow命令查找shadow文件,该文件为密码文件的存储项1.2 入侵排查…

计算机网络1-4:计算机网络的定义和分类

目录 计算机网络的定义 计算机网络的分类 计算机网络的定义 计算机网络的分类 按交换技术分类:电路交换网络、报文交换网络、分组交换网络 按使用者分类:公用网、专用网 按传输介质分类:有线网络、无线网络 按覆盖范围分类:…

在QT中动态添加/删除控件,伸缩因子该怎么处理

开发中遇到的问题[TOC](开发中遇到的问题)处理方式在我们的界面开发过程中,通常需要开发一些可以动态添加or删除控件的容器,类似Tab页一样,为了美观的话,我们通常使用伸缩因子将容器中的控件往一个方向挤,类似下面的控…

【设计模式精解】什么是代理模式?彻底理解静态代理和动态代理

目录 静态代理 动态代理 JDK动态代理 CGLIB代理 JDK动态代理和CGLIB代理的区别 总结 代理模式简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,扩展目标对象的功能。 代理模式有静态代理…

MCU AI/ML - 弥合智能和嵌入式系统之间的差距

作者:芯科科技产品营销高级经理Gopinath Krishniah 人工智能(AI)和机器学习(ML)是使系统能够从数据中学习、进行推理并随着时间的推移提高性能的关键技术。这些技术通常用于大型数据中心和功能强大的GPU,但…

Redis中的sdshdr的len和alloc那块的知识点详解

文章目录核心比喻:一个可以伸缩的水瓶场景一:创建一个新字符串场景二:追加字符串(触发“空间预分配”)场景三:再次追加字符串(利用空闲空间)场景四:缩短字符串&#xff0…

在Linux下访问MS SQL Server数据库

Linux作为一个免费的Unix类操作系统,以其开放性源代码、多任务、X window等特点为众多的用户所采用,并有很多企业采用Linux来作为其内部网的全功能服务器(WWW,FTP,Email、DNS)。企业的内部网不仅要提供文本信息的访问,…

计算机视觉-OpenCV

一下载第三方库opencv-python3.4.18.65opencv-contrib-python3.4.18.65import cv2 # 读取的格式是BGR numpy import numpy as np# 读取图片 a cv2.imread(generated_image.jpg) # 读取图片 print(a) # NumPy数组,其中存储了读取的图像文件的像素值。cv2.imshow…