测试之路 - 精准而优雅

引子

这几年业内一直在做精准测试,大都使用工具 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),更多干货实践,欢迎交流分享~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Gini Impurity(基尼不纯度)

基尼不纯度:衡量集合的无序程度; 基尼不纯度 基尼不纯度:将来自集合的某种结果随机应用于某一数据项的预期误差率。 1、显然基尼不纯度越小,纯度越高,集合的有序程度越高,分类的效果越好; 2、…

Blog搭建:pycharm+虚拟环境+django

pycharm创建项目 在pycharm新建项目,选择Django 项目名称:自定义项目位置:自定义创建git:方便上传到github选择虚拟环境方式venvpython解释器位置,和版本,如果你没有下载他会跳转到不同版本的供你下载temp…

力扣82题删除排序链表中的重复元素

82题删除排序链表中的重复元素 题目描述 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 题目分析 这个题需要返回已排序链表,我们需要考虑一种情况就是头结点为重复元素&…

大数据Spark教程从入门到精通第四篇:Spark快速上手

一:Spark快速上手 1:创建Maven项目 idea安装scala_idea scala插件-CSDN博客 代表了我们安装scala的maven环境已经准备好了,代码可以正常跑了

这个notebook集合,赞

这几天在Github上看到一个数据科学仓库,汇总了很多Python notebook代码,主要是数据方向。 项目地址: https://github.com/donnemartin/data-science-ipython-notebooks 其中包括了pandas、numpy、matplotlib、scikit-learn、tensorflow、sp…

学习Nginx(一):基础

介绍 Nginx是一个高性能的HTTP和反向代理的web服务器,它的设计重点是高并发、高性能和低内存消耗。它常被用于提供静态内容、负载均衡和作为Web服务器。 Nginx具有以下功能和特点: 静态文件服务:作为一个Web服务器,Nginx可以处…

5.2 操作系统安装必备知识

目前操作系统安装方式接近于全自动化,用户无需做过多操作就能完成操作系统安装。但是操作系统安装也有其复杂的一面,例如固件及分区表的不同就会导致操作系统安装失败。本节主要介绍系统安装的一些必备知识。 5.2.1 BIOS 概述 BIOS(Basic Input/Output …

【谷粒商城】04.快速开发

1.克隆代码 https://gitee.com/renrenio DELLLJL MINGW64 ~/Desktop $ git clone https://gitee.com/renrenio/renren-fast.git Cloning into renren-fast... remote: Enumerating objects: 1965, done. remote: Counting objects: 100% (1965/1965), done. remote: Compress…

基于卷积神经网络CNN,使用二维卷积Conv2D实现MNIST数字识别的四种方法

前言 系列专栏:机器学习:高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学…

如何找到MySQL中存储引擎所对应的表空间并且打开?

在上节课我们学习了数据库(MySQL)进阶:存储引擎,有不少同学产生疑惑,到底要怎么找到表空间并且打开啊?这节课我们就来探讨。 首先,根据这个路径:C:\ProgramData\MySQL\MySQL Server…

又双叒叕新增2本SCI期刊“On Hold“,慎投,有剔除风险!

本周投稿推荐 SSCI • 2区社科经管类,3.0-4.0(录用友好) EI • 计算机工程生物医学等(领域广,录用极快) CNKI • 3天内初审录用,随即出版(急录友好) SCI&EI …

C++容器:list(双向链表)

一丶list介绍 C中的list容器底层确实是以双向链表的形式实现的。 list容器是C标准模板库(STL)中的一部分,它提供了对列表数据结构的实现。 双向链表结构:list容器的每个元素都是通过指针链接在一起的,每个元素都包含…

英语学习笔记14——What color‘s your ... ?

What color’s your … ? 你的 …… 是什么颜色的? 词汇 Vocabulary case n. 箱子【封闭的】 相关:box n. 箱子【开口的】    bookcase n. 书架 补充:case n. 案件,案例 口语:It’s a small case.    小意思&…

电脑常用的PDF阅读器-嗨动PDF编辑器!带你详细了解它

电脑常用的PDF阅读器-嗨动PDF编辑器!在数字化信息爆炸的时代,PDF格式的文件因其易于打印和保留原始格式等优点,成为了人们日常工作和学习的常用格式。而对于PDF文件的处理,一款功能强大、操作简便的PDF阅读器是必不可少的。今天&a…

APP封装后防止破解的全方位策略

移动应用开发完成后,封装(编译打包)是发布前的重要步骤。然而,一旦APP发布,就可能面临被逆向工程破解的风险,从而导致源代码泄露、数据被盗取等严重后果。 本文将介绍一系列实用的策略和技术,帮…

GM812条码模块的技术参数

扫码性能参数 *测试条件:环境温度23℃;环境照度300 LUX; **测试条件:测试距离(最小景深最大景深)/2; 环境温度23℃;环境照度300 LUX; *规格如有更改,恕不另…

处理Mini-ImageNet数据集,用于分类任务

一、Mini-ImageNet数据集介绍 ImageNet 1000类的数据太大了,全部下载大概有100GB左右。 2016年google DeepMind团队从ImagNet数据集中抽取的一小部分(大小约3GB)制作了Mini-ImageNet数据集,共有100个类别,每个类别有…

vscode对一些软件的调试插件。

vscode对一些软件的调试插件。 1、ae ,f1然后选择运行 after effect 脚本 2、maya,右键send code to maya 3、max,ctrle运行脚本到max 4、unity 从在Visual Studio代码使用.NET的核心: 1、安装.NET Core SDK,链接: https://dotn…

Unity 模拟放大镜局部放大UI 效果实现

UI 放大实现 RectTransformUtility.ScreenPointToLocalPointInRectangle(rectScale, eventData.position, eventData.pressEventCamera, out localPos); 使用IPointerDownHandler 获取鼠标点击时的有效负载,并将鼠标坐标转成对应的UI 坐标,rectScale 为…

(1)双指针算法介绍与练习:移动零

目录 双指针算法介绍 练习:移动零 双指针算法介绍 双指针算法常见于数组和双向链表的题型 在数组中,双指针中的指针代表数组元素的下标,而不是真正的指针类型变量 在双向链表中,双指针中的指针即为真正意义上的指针&#xff…