测试之路 - 精准而优雅

引子

这几年业内一直在做精准测试,大都使用工具 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.mzph.cn/diannao/12918.shtml

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

相关文章

抖音小程序使用Vant

安装 Vant 有针对小程序的版本,通过npm安装: npm i vant/weapp -S --production构建 npm 安装 Vant Weapp 后需要构建 NPM,在菜单的【工具】选项中选择【构建 NPM】: 使用组件 抖音小程序和微信小程序还是有一些差别的&#x…

怎么把3d模型导出cad立面---模大狮模型网

在设计工作中,将3D模型导出到CAD软件并生成立面图是一项常见但关键的任务。这不仅有助于更好地展示设计方案,还能方便后续的工程制图和施工。本文将介绍如何通过3ds Max软件将3D模型导出到CAD软件,并生成高质量的立面图,为您提供实…

现货正泰漏电小型断路器NXB-32LE-C16 30MA1P+N原装正品NXB-40L

品牌:CHNT/正泰 型号:NXBLE 额定电流:25A,16A,20A,40A,32A 漏电保护器类型:2P 产地:中国大陆 电压:1000V及以下 极数:3P,4p,2P,1PN 电源方式:交流电 3C证书编号:…

大模型时代下的先行者:景联文科技引领数据标注新时代

在大模型时代,数据标注不再是简单的分类标注,而是一项融合了技术革新、专业技能、法律合规和精细化管理的综合性任务,对推动AI技术的发展和落地应用具有重要意义。 景联文科技作为AI基础行业的数据供应商,可协助人工智能企业解决整…

easyx快速入门1

1.基本说明 EasyX 是针对 C 的图形库,可以帮助 C/C 初学者快速上手图形和游戏编程。 比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练…

fl studio试用版文件保存无法打开??一个方法教你免费打开!

前言 当下,各款编曲软件五花八门,而这其中最有声誉的必为FL Studio莫属 这个软件呢国人习惯叫他水果,拥有强大的录音、编曲、混音等功能,所以广受音乐圈欢迎。如今,大部分水果一旦有编曲所需,一般都要使用…

CSS 根据子元素选择父元素,并设置父元素的样式

场景举例&#xff1a;当子元素有增加了一个class时&#xff0c;需要影响其父元素的样式 可以使用":has"伪类来实现选择父元素的效果 <style>.parent:has(.child){background-color: #eee;}p{width:100px;border:1px solid #000;} </style> <body>…

人机协同中的比较、调整与反转

人机协同是指人与机器之间的合作关系&#xff0c;通过共同努力实现特定任务的目标。在人机协同中&#xff0c;存在着比较与调整的过程&#xff0c;这是为了实现更好的合作效果和任务完成质量。 比较是指人与机器在任务执行过程中对彼此的表现进行评估和比较。这可以通过对机器的…

vue+ts+vite+pinia+less+echarts 前端可视化 实战项目

1.初始化前端 输入 npm init vuelatest 命令 然后 选择需要的插件2.构建完成后 在终端切换到vue-project文件夹下 npm install 下载依赖 3.下载 less样式 npm install less less-loader -D 4.下载axios npm install axios 5.下载echarts npm install echarts -S 6.引入中国…

战网国际服加速器用哪个好 暴雪战网好用加速器介绍

战网国际版&#xff0c;又称Battle.net环球版&#xff0c;是暴雪娱乐操盘的全球性游戏互动平台&#xff0c;它跨越地理界限&#xff0c;服务于全球游戏爱好者。与地区限定版本相异&#xff0c;国际版赋予玩家自由进入暴雪旗下众多经典游戏的权利&#xff0c;无论身处何方&#…

对比测评3款BI分析工具

前不久&#xff0c;一位准备入职阿里的学弟问我&#xff0c;他要做电商数据分析&#xff0c;电商有庞杂的标签、模型、数据和业务逻辑&#xff0c;菜鸟应该要具备什么样的分析能力啊&#xff1f; 我看了他的岗位职责&#xff0c;主要是负责经营决策支持、专题分析和数据看板搭…

leetcode-字符串变形-104

题目要求 思路 1.首先根据ASCII的规则&#xff0c;把字符串大小写替换&#xff0c;空格保持不变 2.将整个字符串进行翻转 3.以空格为区间&#xff0c;将区间内的字符串进行翻转&#xff0c;其中翻转的函数reverse() 代码实现 class Solution { public:string trans(string s…

【C语言】通讯录系统实现

目录 1、通讯录系统介绍 2、代码分装 3、代码实现步骤 3.1制作菜单函数以及游戏运行逻辑流程 3.2、封装人的信息PeoInfo以及通讯录Contact结构体类型 3.3、初始化通讯录InitContact函数 3.4、增加联系人AddContact函数 3.5、显示所有联系人ShowContact函数 3.6、删除联系人D…

Shell之常用命令

目录 1.排序工具--sort命令 1.1 快读查找一个目录中最大文件 2.去重工具--uniq命令 2.1 分析判断远程登录错误次数&#xff0c;禁止该用户远程登录 3.修改工具--tr命令 4.列截取工具--cut命令 5.分割文件工具--split命令 6.合并文件列--paste命令 7.扫描工具--eval命令…

【Linux】常用指令、热键与权限管理

一、常用指令 &#xff08;1&#xff09;ls 功能&#xff1a;列出指定目录下的所有子目录与文件 用法&#xff1a;ls &#xff08;选项&#xff09; &#xff08;目录或文件名&#xff09; 常用选项&#xff1a; -a&#xff1a;列出目录下的所有文件&#xff0c;包括隐藏…

c语言中数字字符串和数字互转

#include <getopt.h> #include <stdio.h> #include <stdlib.h>#define MAX_PATH 256 char filename[MAX_PATH 5]; int main(int argc, char** argv) {//数字字符串转数字const char* kk "689";int zhi atoi(kk) 8;//数字字符串转doubledoub…

代码随想录训练营Day 29|力扣39. 组合总和、40.组合总和II、131.分割回文串

1.组合总和 题目链接/文章讲解&#xff1a; 代码随想录 视频讲解&#xff1a;带你学透回溯算法-组合总和&#xff08;对应「leetcode」力扣题目&#xff1a;39.组合总和&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 代码&#xff1a;&#xff08;未剪枝版 &#xf…

ChatGPT未来可能应用于iPhone?

苹果接即将与OpenAI达成协议 ChatGPT未来应用于iPhone 前言 就在5月11日&#xff0c;苹果公司正与OpenAI进行深入讨论&#xff0c;计划在其最新的iOS操作系统中整合OpenAI的先进技术。这一举措是苹果公司在为其产品线融入更先进的人工智能功能所做努力的一部分。 目前情况双方…

vue2 八大组件通信,父子通信,跨层级通信,事件总线,vuex等

文章目录 什么是组件通信&#xff1f;父子通信流程propsProps 定义Props 作用特点数组写法对象写法&#xff08;props校验&#xff09;简写只验证数据类型&#xff1a;完整写法&#xff0c;完整的验证&#xff1a; props父向子传值用props父传子在子组件中修改props $emit子向父…

自定义 Gradle 插件进行统一的静态代码分析

静态代码分析是一项了不起的技术, 它能让代码库更易于维护. 但是, 如果你在不同的版本库中拥有多个服务(可能由不同的团队开发), 如何才能让每个人都遵循既定的代码风格呢? 一个好办法是将所有规则封装在一个插件中, 该插件会在每个项目构建时自动执行所需的验证. 因此, 在本…