一些有价值bug产生的思考
1、异步处理时防止重复点击的逻辑校验
场景 打款请求时,进入异步处理的队列,生成一个任务号,存在如数据库,且状态为未完成。此时,如果并发操作,如重复点击或者重复调用接口,则发出的两条请求可能被分配到不同服务器处理,此时数据库产生两条数据,同一任务id对应不同进程id,属于异常场景。程序逻辑判断数据>2,不处理,则异步任务终止。
其中,重复点击导致产生两条数据的原因仅为猜测,实际排查过程中发现,前端已经做了防重复点击,可能是后端的前置逻辑导致对同一批数据做两次请求
总结 不仅在同步业务处理时需要注意并发问题,异步任务时也需要根据实现逻辑关注中间状态
解决 1、数据库加联合唯一索引,第二条数据写不进去,直接将数据库报错抛出
2、忽略两天数据的场景,当做正常业务处理,两条都进行更新
3、 排查产生两条数据的原因,源头上杜绝
最终方案选择了2 当时我选择的是1和3,1作为立即解决的方案,在不动业务逻辑的场景下,解决问题,风险较小。3作为后续的溯源很有必要。但是最后没争过开发
2、临时小需求对系统功能的影响,需要思考后再做回归
eg.列表新增字段的需求,需要新增一个时间标签。当做一个简单的回归时正常。但是这个列表中有三个写入的业务类型,其中一个写入类型与其他写入的函数不同。此时,由于未对第三个业务类型进行回归,导致漏测。这也是为什么测试需要参与设计评审的原因。
分析:正常的业务场景和实现方式来说,基于复用原则,和通用的代码实现方式,这种写入应该都是在同一个函数完成。但是防不胜防啊。需求急测试不能急,任何小的修改都可能对你之前的测试结果形成覆盖
3、客户端测试时,需要注意系统与原生兼容和交互,如获取权限,打开文件等
4、前后端交互问题,前端页面展示错误、请求参数错误、交互错误这种类型的bug咱就不提了。主要说一种,请求的同步和异步,也就是时间对请求结果的影响,和前端在处理请求结果时,是否会基于时间的考虑来展示返回结果。
先来个简单的例子,在某修改功能中,要求前端请求后进行查询,以便在列表展示上获取刚才的修改提交。此时,先发出修改请求,再发出查询请求,如果修改请求仍在处理,还没有成功,便返回查询结果,然后返回修改结果,修改成功。此时就造成了展示内容与实际结果不一致。所以查询接口应该等待修改接口返回结果后再发出
前后端交互中也存在同步异步问题。同步就是上面的例子。下面是前后端交互的两种异步场景。
a、轮询(polling) 间隔一定时间不断向后端发送请求,如导出功能,第一次请求导出时,后端给到一个任务id,然后前端拿着这个id每隔1秒请求一次。确定就是消耗大,有延迟。延迟问题可以通过长轮询方式解决,具体自行扩展
b、websocket是跟http一样性质的传输协议。详细区别自己找找,这里就谈一个,http是单向的,websocket是双向的协议。所以很明了,websocket 协议中,服务器端会主动向浏览器端发送结果,进而可以降低延迟。缺点就是资源消耗大。所以在生命周期结束时,应该关闭连接
一些有价值bug产生的思考的更多相关文章
- 为什么我没有拔出钥匙 ——开锁引发的程序bug解决方案的思考
http://blog.csdn.net/wojiushiwo987/article/details/8851204为什么我没有拔出钥匙 ——开 ...
- jsb里出现的 Invalid Native Object的一次bug修复的思考
Cocos2d: jsb: ERROR: File /Users/dcx_JD/Documents/cocos2d-x-2.2.2/scripting/javascript/bindings/gene ...
- 关于bug的一些思考
上午看了两道算法,自己编译器上面敲了一遍,然后又去网站上敲了一遍: 编译器上面无论哦如何都调不出来,网站上面也是: 吃个午饭,睡个觉,醒来重新手撸了一遍,然后就过了 : 面对这种事情,真的是自己应该多 ...
- MyBatis 学习记录7 一个Bug引发的思考
主题 这次学习MyBatis的主题我想记录一个使用起来可能会遇到,但是没有经验的话很不好解决的BUG,在特定情况下很容易发生. 异常 java.lang.IllegalArgumentExceptio ...
- 关于提BUG的一点思考以及工作中总结的规范
在测试的工作中,提BUG是日常工作. 以前自己为了省事,省时,仅仅是截图,在图片上注明一下问题,就放到BUG库中了. 现在发现这样会造成开发的时间的浪费,增加了沟通成本. 对于BUG,当发现了异常时, ...
- 一个小BUG引发的思考。(论开发与测试之间的那点事)
标题不是“一个馒头引发的血案”. 言归正传:今天上午测试的时候,发现了一个BUG,如图: 一个用肉眼就能发现的BUG.原因当然是因为开发同事没有自测试,流入到了测试人员这里了. 无非是开发同事不严谨造 ...
- 面试官,我会写二分查找法!对,没有 bug 的那种!
前言科普 第一篇二分搜索论文是 1946 年发表,然而第一个没有 bug 的二分查找法却是在 1962 年才出现,中间用了 16 年的时间. 2019 年的你,在面试的过程中能手写出没有 bug 的二 ...
- 软件测试价值观-SMBT新理念
软件测试价值观-SMBT新理念 作者:张元礼 http://blog.csdn.net/vincetest 近年来有不少软件测试同行不少有些困惑-软件测试人员的价值在哪里?我们怎么才能做好软件测试?怎 ...
- Mvc分页组件MvcSimplePager代码重构
1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...
随机推荐
- java使用POI实现Excel批量导入数据
1.准备工作 1.1 创建模板表头与数据库表字段一一对应,示例如下 1.2将模板放入项目中,如下图所示: 2.前端页面 2.1 使用超链接提供模板下载地址 <html lang="zh ...
- MySQL 优化 (二)
参数优化 Max_connections (1)简介 Mysql的最大连接数,如果服务器的并发请求量比较大,可以调高这个值,如果连接数越来越多,mysql会为每个连接提供单独的缓冲区,就会开销的越多的 ...
- s3c2440裸机-UART编程(一、UART硬件介绍及传输原理)
1.uart硬件介绍 UART的全称是Universal Asynchronous Receiver and Transmitter(异步收发器). uart主要用于: 1.打印调试 2.数据传输 串 ...
- JUC-3-ConcurrentHashMap
ConcurrentHashMap 锁分段机制 JDK1.8
- 【bzoj4945】[Noi2017]游戏(搜索+2-sat)
bzoj 洛谷 题意: 现在有\(a,b,c\)三种车,每个赛道可能会存在限制:\(a\)表示不能选择\(a\)类型的赛车,\(b,c\)同理:\(x\)表示该赛道不受限制,但\(x\)类型的个数$\ ...
- c++ 命令行执行
常用命令如下 g++ -g -std=c++ a.cpp -std 指定c++的版本 -g 在可执行程序中包含标准调试信息 -o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的.如果 ...
- day94_11_26爬虫find与findall
一.使用json 正常的,如果需要将response结果序列化,需要将结果json.loads res1=json.loads(response.text) 但是这样会很麻烦,request提供了js ...
- angularjs中ng-class常用写法,三元表达式、评估表达式与对象写法
壹 ❀ 引 ng-class可以说在angularjs样式开发中使用频率特别高了,这不我想利用ng-class的三元运算符的写法来定义一个样式,结果怎么都想不起来正确写法,恼羞成怒还是整理一遍吧,那 ...
- 抓包工具之fiddler实战1-基本设置
Fiddler概述 百度搜索fiddler能找到官网网站,百度软件中心也提供了下载,本人去下载了基本和官网的版本一致,但还是建议大家下载软件一定去官网进行下载. Fiddler是干什么的 在百度百科里 ...
- C# Event在.Net规则下由接口定义的实现
最近在学C#(教材<C# in a nutshell>很不错的说),看完delegate(委托)以后,紧接着就是event(事件)了,个人对跟.Net相关的东西并没有什么兴趣(毕竟是会增加 ...