测试之路 - 精准而优雅

news2024/9/21 0:48:36

引子

这几年业内一直在做精准测试,大都使用工具 diff 代码改动、分析代码覆盖率这些平台集成的能力。

业务测试中,我们在技术设计和代码实现的基础上也做了一些精减和精准的测试实践,通过深入测试有针对的设计 case,发现隐藏问题,保证质量。

接下来我将通过以下几个场景,介绍一下在 toB 业务中应用精减和精准的思路和实践。


场景一:上传表格的验证

需求点

业务同学需要在运营后台使用表格模板上传多组数据,上传时需要校验表头和字段的格式。
很多数据

作为 QA,这不就来活了,上传校验 case 贴上来:

问题点

  • case 中校验内容很多,每个字段的缺失、错误、格式正确性都需要验证。

  • 怎么能更好更快的测试呢?

精准测试

  1. 找到对应的上传功能代码:

    os: 原来神神秘秘在那敲代码的家伙们,也和我用一样的 for i 和 String 工具类。

  2. 通过走查代码发现问题:用 startWith 是几个意思?需求是全匹配啊!

  3. 提个 BUG,问题修复(startWith 换成 equals):

  4. 发现本次纯数字是用同样的正则和 .length() > 判断,实际测一个上传数字校验即可。

    这个正则(^-?\d+$)判断纯数字有问题,大家看出来了吗?

精减结果

1. 正常数据的表格 ,上传成功。
2. 非数字格式和长度大于30的表格,分别上传失败。
3. 剩下的case通过审阅代码的方式验证。
4. 测试通过。

结果:

  • 审阅代码发现了【startWith】、【正则(^-?\d+$)】两个问题。
  • 减少了 case 中 10 条上传异常表格的数据准备和操作,节省了时间。

小结

  • 首先找到代码位置,练习审阅代码,可以通过接口名搜索/diff 代码/开发提供找到代码。

  • 同类重复的测试场景,结合代码对 case 场景归类,可以适当选取重复的内容通过审阅代码进行测试。

  • 注意:当你通过审阅代码测试时,需要特别关注如【正则】、【同类型代码(复制)】和 【get 参数】和【需求文案】,这也是审阅而不实际验证的弊端。

  • 沉淀总结 Code Review 经验,关注【判断条件】、【取值】、【公式】等经常出错的逻辑点,挖掘代码中隐藏的 BUG。

场景二:获取可用规则

需求点

【获取可用规则】是匹配规则的第一部分,要根据处置优先级和启用状态命中匹配到可用规则,如下图所示:

先不展开直接本部分上 case:

问题点

匹配规则是很复杂的场景,规则本身、状态(开关)和优先级(包含同优先级)的场景很多。

完整的规则如何测试?【获取可用规则】部分就上面的两条 case ,够不够全面?

精准测试

  1. 首先了解代码获取优先级的逻辑,实际就是一个排序 SQL(优先级字段和自增 ID 字段倒序):

  2. 拿到 SQL 返回的集合,取第一条(get0):

  3. 通过上面的了解,我们知道状态和优先级是通过 SQL 倒序取第一条实现的,按上述 case 可以覆盖【获取可用规则】的场景:
    a. 前置在库里手动插入三个规则;
    b. 构造一条可以命中规则的数据;
    c. 验证排序规则的结果为对应期望结果。
    d. 测试完成。

  4. 保险一点,写个 SQL 再查一遍:

    SQL 结果第一个(即表中 id 为 44 )规则命中,同第 3 步 case 执行的结果一致。

小结

  • 对自己的 case 或者测试的系统没有把握,可以通过结合代码进行测试以确保功能正确性,就不用担心这部分测试不充分啦。

  • 在测试执行过程中,我是通过数据库 insert 的数据,这里有一个前提: case 中已经保证了页面创建的规则在库里保存正确。

  • 当然排序和优先级还有其他的实现方式,比如【加载到内存处理】或者【给优先级的选项增加不同的权重系数】等,期望大家总结沉淀,以后遇到从容应对。

    ^ _ ^ :仔细的测试同学可能已经发现,这里把【获取规则】和【规则匹配验证】拆开验证,这是拆解理顺复杂逻辑的好方式。

场景三:规则组匹配验证

需求点

【规则组匹配】为匹配规则的第二部分,每一行是一个规则组,规则组里可以选择配置应用 4 条‘子基本规则’(条件为且),‘子基本规则’不命中则该规则组不命中。
还是这张原型图_

再看一下技术设计的部分流程图:

问题点

  • 规则匹配要测试到不同规则组命中的场景,也要测试 A1,A2,A3,A4 子规则本身的正确性。

  • 如果要对规则组进行测试,应该设计 A1+A3,A3+A4,A1+A2+A3,A2+A3+A4,A1+A2+A3+A4…笛卡尔积全量的规则组 case 进行验证

这样穷举出来的 case 最全,但需要的测试时间也更多,有没有更好的解决办法?

精减结果

  1. 本场景中即有规则组又有子规则,先测试规则组的命中,然后对‘子规则’单独测试(场景四)

  2. 测试规则组时,根据对设计方案的理解,既然是依次排除,那无需穷举 case, 编写 case 时排除不需要测试的场景:

  3. 通过审阅代码,确认代码实现是同技术设计一致的,上面的 case 可以覆盖逻辑:

  4. 执行测试时先构造命中规则数据,然后构造排除规则的数据(图中标记的数字为库表的记录 id),查询日志进行验证:

  5. 结合页面的验证结果,真实排除了规则不匹配的规则组,测试完成。

小结

  • 当遇到功能复杂的业务场景,拆分独立的功能单独测试,往往会让测试思路更清晰,最后再做集成测试,保证功能完整性。

  • 在听完技术评审后,结合技术设计有针对的编写 case,即能避免冗余 case,又能避免覆盖率不够。

  • 在审阅代码后,通过 log 关键字查询日志和验证,确保页面结果和系统逻辑结果一致,防止黑盒测试不充分。

场景四:同类的规则条件

需求点:

【同类的规则条件】为匹配规则的第三部分,单个规则组内所有‘子基本规则’都命中这个规则组才命中,需要测试各‘子基本规则’的匹配逻辑。

问题:

case 初版设计(从最全匹配的 case,逐次减少一个参数,这样保证每个参数都能测试到):

本场景问题同上一场景类似,case 设计应为笛卡尔积的子规则,但执行的场景多,有没有更精减的方式呢?

精减思路:

  1. 了解代码中获取匹配数据的逻辑,实际就是一个多 where 条件的 sql:

  2. 所以需要保证的是:最细颗粒度条件参数可以传入并查询正确,部分条件参数可查询正确,case 可以精减为:
    截取部分case

  3. 测试时,通过手写 SQL 查询对应数据:

    -- 手动打码SQL
    SELECT * from dbzz_****.****_volume_count where
    **_id=99530 and ***_id = 999435 and **_type = 2 and
    ****_id in (9999623,9999624) and period =14 ORDER BY id desc ;
    

    通过对比页面结果和 SQL 查询的结果,两个维度验证数据准确性。

  4. 在此分享一个本场景发现的缺陷:标记且注释置灰的位置为问题代码

    缺陷: 获取数据时以最细规则(最长匹配)取倒序最近一条(order by id desc limit 1)时没有问题,但以粗粒度的宽泛条件也取倒序最近一条,则数据不全(因为表中每一条记录都是以最细粒度存储)。

    发现原因: 之前遇到一个类似的 SQL 逻辑没有使用 sum,所以对此格外关注。

    修复: 条件宽泛情况下的数据应是同条件下多条记录的合集,所以应去掉条数限制并改成 sum。
    原mapper是select num,修复后是select sum(num)

小结

  • 业务中复杂的参数匹配,转化成代码时实际上是个多条件 SQL,思路是只要保证最细条件和部分条件都能传入并查询正确即可。

  • 在审阅代码时,关注 mapper 信息并结合对需求的理解,可以单独写 SQL 验证取值逻辑。

  • 积累业务中同类型中的 BUG 经验,如上面 SUM 的缺陷,在后续的测试中保持关注,提高警惕。

总结

通过分析技术设计和代码实现,可以适当分类精减 case,通过 Code Review 减少复杂的错误验证,转为审阅代码进行测试。

通过审阅代码,从代码层面确认逻辑是否正确,比如关注字段取值、匹配入参、查询条件、判断条件、公式计算等,发现隐藏的缺陷。

以上的内容举例,在测试实践中减少了重复的验证投入,有针对的设计也更有效的发现问题,最后也会让我们的测试结果更有信心。

关于作者

聂飞 测试开发工程师


转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。
关注公众号「转转技术」(综合性)、「大转转FE」(专注于FE)、「转转QA」(专注于QA),更多干货实践,欢迎交流分享~

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

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

相关文章

智游剪辑1.5.0发布!

智游剪辑1.5.0发布了,快来看看更新了啥功能吧! 主页卡片升级 现在功能卡片新增图标,比以前更好看更直观 我的收藏 遇到自己喜欢的功能直接点击收藏就可以了,后面我们就能快速找到这个功能 批量ncm转mp3功能 目前看后台有很多人…

STC8增强型单片机开发【热敏电阻】

目录 一、引言 二、热敏电阻概述 三、STC8增强型单片机简介 四、基于STC8单片机的热敏电阻测温系统 五、热敏电阻测温系统的优化与扩展 提高测量精度 扩展系统功能 六、 温度计算步骤 通过ADC采样计算出热敏电阻位置的电压 通过欧姆定律计算热敏电阻的阻值 通过阻值…

Java微信小程序订阅消息提醒的实现与对接

文章目录 一、准备工作1. 注册微信小程序,并开通订阅消息功能。2. 获取小程序的AppID和AppSecret。3. 在微信小程序管理后台,设置提醒模板,并获取模板ID。4. 小程序端需要获取用户订阅允许提醒的权限(1)引导用户触发订…

win11快速安装mysql数据库系统

win11快速安装mysql数据库系统 1、下载 1.1 打开官网 1.2 向下滚动页面 1.3 进入下载选项 1.4 下载8.0.4 LTS 1.5 开始下载 1.6 下载中 2、解压 大家注意,此时解压后目录是没有data目录的。 3、数据库初始化 3.1 管理员身份打开CMD 开始菜单上,输入…

【找到所有数组中消失的数字】leetcode,python

很菜的写法: class Solution:def findDisappearedNumbers(self, nums: List[int]) -> List[int]:nlen(nums)#存1-Nnum_1[i for i in range(1,n1)]#预存数num_2[]nums.sort()for i in nums:num_1[i-1]0for i in num_1:if i!0:num_2.append(i)return num_2能过但是…

link.click()时浏览器报错The file at ‘data:image/png;base64,iVBORw

代码如下: const dataURL canvas.toDataURL({format: "png",width: 400,height: 400, });const link document.createElement("a"); link.download new Date().getTime();link.href dataURL; document.body.appendChild(link); link.click…

webpack优化构建速度示例-合理配置loader的include exclude:

实际上,babel-loader 在 Webpack 配置中默认并不包含 exclude 和 include 选项的默认值,通常,为了优化构建性能,开发者会显式地设置 exclude 和 include 选项,以便 babel-loader 只处理必要的文件。 src/index.js impo…

【漏洞复现】Secnet-智能路由系统弱口令

0x01 产品简介 Secnet安网智能AC管理系统是广州安网通信技术有限公司(简称“安网通信”)的无线AP管理系统 0x02 漏洞描述 攻击者可直接利用弱口令登录系统 0x03 搜索语法 fofa: title"安网-智能路由系统" || title"智能路由系统" || title"安网科…

做海外问卷调查有什么方法技巧?

大家好,我是橙河老师,很久没更新文章了,一方面是比较忙,另一方面是觉得关于项目介绍的文章,写的也差不多了。 后面的文章,还是着重讲解不同渠道的特点、做题技巧、人设创建这些实战性的内容。 我不像其他公…

有什么操作简单的副业或兼职呢?

以下是操作简单的副业或兼职 1. 网络兼职 可以在网上找一些兼职工作,如网络营销、客服、文案撰写等,只需要有一台电脑和网络连接即可。 2. 手机任务 可以用手机做做致米宝库的任务,一天有一百多块钱,还可以电脑学习项目资源&am…

PCIE协议-2-事务层规范-Virtual Channel (VC) Mechanism

2.5 虚拟通道(VC)机制 虚拟通道(VC)机制提供了对可以在整个结构中传输使用TC(流量类别)标签区分的流量的支持。VC的基础是独立的结构资源(队列/缓冲区及其相关的控制逻辑)。这些资源…

异步I/O库-libuv介绍

1.简介 libuv是一个跨平台的支持事件驱动的异步I/O的库,使开发者可以以非阻塞的方式执行文件I/O操作、网络通信、子进程管理等。 libuv的主要特点包括: 事件循环:libuv有一个基于事件循环的模型,它不断地轮询事件,并…

VC++ 6.0开发文件重复整理工具开发

开发背景:手机上的文件越来越多,想要备份下文件结果文件太多杂乱无章且重复文件冗余存储造成存储空间滥发,所以决定开发一个小工具来整理重复文件。由于本人电脑运行慢,选择VC6.0作为开发IDE,操作虽然麻烦点&#xff0…

【记录】docker笔记(五):Docker网络-Network Namespace

Docker 网络理论基础 要了解docker网络,先了解如下基础概念。 Network Namespace Docker 网络的底层原理是 Linux 的 Network Namespace ,所以对于 Linux Network Namespace 的理解对 Docker 网络底层原理的理解非常重要。 简介 Network Name…

java技术:nacos

目录 一、docker安装 1、创建一个nacos 2、复制配置信息出来(方便修改配置文件) 3、删除nacos 4、修改配置文件(主要是一下几个) 6、创建数据库 nacos 7、重启nacos mysql 一、docker安装 1、创建一个nacos docker run …

添砖Java之路(其七)——static

目录 static: 1.被类的所有对象所共享(和c有点像) 2.多了一种调用方法,可以通过类名调用 3.随着类的加载而加载,是优先于对象的存在。 工具类: 为什么主类的方法要加static: 理解 public static void main&#…

你还在手动加好友?试试这款神器,释放双手自动添加!

你还在手动添加微信好友吗?尤其是在忙碌的时候,手动加好友不仅费时又很容易出错。试试这个自动添加好友神器——个微管理系统,释放你的双手,轻松拓展好友列表! 1、多号同时登录在线 系统支持多个微信号同时登录在线&…

USB-OTG:1、OTG原理介绍

目录 🍅点击这里查看所有博文 随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记…

运维别卷系列 - 云原生监控平台 之 05.prometheus alertManager 实践

文章目录 [toc]Alertmanager 简介Alertmanager 实现的核心概念GroupingInhibitionSilencesClient behaviorHigh Availability Alertmanager 配置文件globaltemplatesrouteinhibit_rulesreceivers Alertmanager 部署创建 cm创建 svc创建 stsPrometheus 配置告警Prometheus 配置文…

010.理解异步性

异步消息传递是响应式系统的一个关键特性。但到底是什么异步性,为什么它对响应式应用程序如此重要?我们的人生注定在许多异步任务中。你可能没有意识到,但你的日常活动如果它们本质上不是异步的,那就太烦人了。要理解什么是异步,…