• 12
  • 13
分享
  • 踩坑记录:我在数据库数字比较上栽了个跟头——软件测试圈
  • 曼倩诙谐 2021-04-06 10:12:46 字数 1758 阅读 1809 收藏 13

  说起这个数字比较,这是我这几年测试生涯中踩的第一个坑,至今印象深刻,使得从那以后在遇到数字比较的测试,我都会特别关注这个点,记得那还是第一次接触数据库数字比较的测试,按照设计测试用例的惯例,进行了用例设计。

  记得当时这个需求的背景是业务要求做一个功能:

  根据版本号,比较产品中的两个参数的大小,暂时我们就给它叫做参数1和参数2吧,当版本号满足大于给定的版本号‘32’时,比较参数1和参数2的大小,当参数1大于等于参数2时,就把这个产品的相关信息发送邮件给相关的业务人员,给出警示,大致功能流程图如下:

1-1.jpg


  开发实现的方案是:版本号由前台数值传到后台接收,然后代码直接进行比较,参数1和参数2,分别对应数据库表1中的字段1和字段3,当版本号大于32时,就直接从数据库表1中取字段1和字段3的值,进行比较,值取不到的为空不做比较,不发送邮件。

  根据业务需求和开发实现方案,测试用例分析设计。根据边界值及实际业务场景值及后台实现方案分析:

  1.版本的取值只是整数,不会有负数,所以取值只有四种情况,大于32的版本号,小于32的版本号,等于32的版本号,版本号为空,由前台传值,只要能接收到就可以,其他有效性问题由前台保证。

  2.参数1和参数2的取值,只是正整数,没有字母和特殊字符,不存在字段值为空的场景,所以在符合条件的情况下就比较参数1和参数2的数值大小即可,那么这样的场景也有四种情况:

  1)参数1大于参数2,发送邮件通知到相关人员。

  2)参数1等于参数2,发送邮件通知到相关人员。

  3)参数1小于参数2,不发送邮件通知到相关人员。

  4)历史数据原因导致参数1或参数2丢失的场景。

  根据以上两个条件的分析,组合出以下测试场景:

1-2.jpg


  根据组合出的场景输出测试用例,执行测试,把所有的场景完整的覆盖了三次,心想这么简单的一个数字比较应该不会出现问题了吧,然而往往事与愿违,这个功能刚上线不久,业务就跑来找我说这个功能实现的有点问题,应该发邮件的没有发邮件,当时我听到这个消息都懵了,我都反复验证了三次所有的场景,哪里出问题了?

  带着迷惑和不解,请业务小哥把它出问题的那单数据发了过来再次进行了测试,果然是不发送邮件,然后我就根据两个条件结合日志逐一查找原因,因为日志比较少,最后还连了代码进行了打断点测试,终于找到原因,原来是参数1和参数2的值比较结果不对,参数1取到的值为12,参数2取到的值为9,按道理,这样比较出来的结果应该是参数1大于参数2,需要发送邮件的。

  然而通过打断点跟踪代码发现,参数1与参数2的比较结果是参数1小于参数2,直接跳过发邮件环节。

  问题点找到了,但为何会这样就不能理解了,剩下的就交给开发小哥哥分析原因修改了。

  开发小哥哥经过一翻分析最后得出的结论是程序没有对数字做处理,oracle数据库返回给程序代码的值是当前数值的ASCII值,现在的参数1和参数2分别为12和9,9的ASCII值比12的大,所以返回的结果是参数1和参数2,听到这个结论,我赶紧去查一下数据库存储数值的ASCII,果然是9比12大。

1-3.jpg1-4.jpg


  然后通过反复的查询还发现,这样直接返回的ASCII值,多位数的时候返回的都是前面一位数的ASCII值,也就是说如果两个数值最高位相同,相同高位,不同个位数的,两个数值,返回的ASCII是同一个!

1-5.jpg1-6.jpg


  如果不做处理直接拿来比较就得到的结果可能就不是我们想要的,看到这里我禁不住为自己默默的抹了一汗。

  等开发小哥哥修复以后,我专门找了这样的数据来验证,果然问题解决了,经过这一次深刻的经验教训后,在测试类似种数字的比较,特别是从数据库取值的,我都会特别设计一条这样特殊的测试用例:

  “构造两个参于比较的数字A,B,A为一位数,B为两位数,且B的十位数小于A,或构造两个相同位数的多位数A,B,且A,B的高位相同,个位数不同,执行比较,查看比较结果是否正确。”    

  那么这个问题是否在所有的数据库返回值中都存在呢,带着这个疑问,我在接下来的测试工作中关注了另一个数据库,也就是一个用了PG数据库的项目,在此项目测试类似数字比较中复现了问题,那么别的数据库是否有这个问题,还有待验证,期待你的参与。


作者:李卫卫   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   今年绝对是意想不到之年,以为三年之后,应该各行各业能开始起来,然后百花开发。结果变成了各行各业,不是倒闭了,就是裁员了。有句话说,今年你还能在原公司,拿到年终,那你所呆的公司,就是最好的公司,你肯定就是骨干了。  但其实,有些公司一直在裁员,但有些公司却一直在招人,或是一直都招不到适合的人。像跟算力相关的人工智能、模型等,有做不完的研发和版本更新;或是金融业,特别是银行,由于国产代替化及新的业务场景,因此,有做不完的系统改造和需求。  我们也不知道这样特殊的日子还有多久才能过去,但自己做好准备,永远不会错的。  今天的主题来聊聊银行的测试岗位招聘。银行的测试岗位招聘有别于其它的行业的招聘要...
            0 0 970
            分享
          • 数据库事务事务是什么是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合。事务的四大特性原子性:事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。隔离性:一个事务的执行不能被其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。持续性:也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就是永久性的。接下来的其它操作或故障不应该对其执行结果有任...
            12 12 1742
            分享
          •   免费的性能测试框架搭建课程快来领啊,成功提交问卷后还有精选好课任你挑选,数量有限,先填先得~链接:http://vote.51testing.com/  早些时候,京东家电出了一个事故。  部分用户在领取京东的无门槛优惠券之后,可以用极低的价格(几十块几块甚至0元)购买数百元的小家电,主要是烤箱及微波炉类产品。  吸引了不少羊毛党,前来薅羊毛。  传闻在极短的时间里,出现了24万笔低价订单,涉及商品金额数千万。  关于此次事故,引发了圈子的热烈探讨。  影响面无疑是巨大的,甚至有传闻说,小家电组全部开除!但其实传言难辨真假,我们作为吃瓜群众,并非内部人士,也不清楚后续的处理情况。  假如抛...
            2 4 7033
            分享
          • 今日晚间,达达、顺丰同城、闪送相继宣布与抖音生活服务达成合作,为餐饮商家提供同城配送解决方案。在抖音北京本地页面,提供外卖到家业务的商家已经开始提供商家自配业务。据一位火锅品牌商家向新消费日报透露,商家随机选择配送平台的功能,实际上已经试运行一段时间。“达达、顺丰同城、闪送都是全城配送,所以基本可以覆盖主城区所有地点,只是配送费用不同。”此前,抖音曾与饿了么达成合作,“饿了么外卖”出现在抖音小程序,不到4个月时间,抖音在即时配送领域再添新合作商,抖音在本地生活的野心尽显。团购服务商张霖对新消费日报记者表示,抖音选择在这一节点深耕本地生活,是因为价格敏感的用户比例在增加。“虽然总需求萎缩,但线上...
            0 0 747
            分享
          •   背景  Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。而对于爬虫来说,使用Selenium操控浏览器来爬取网上的数据那么肯定是爬虫中的杀手武器。这里,我将介绍selenium+谷歌浏览器的一般使用。  需求  在平常的爬虫开发中,有时候网页是一堆js堆起来的代码,涉及很多异步计算,如果是普通的http控制台请求,那么得到的源文件是一堆js,需要自己在去组装数据,很费力;但是采用Selenium+ChromeDriver可以达到所见即所得的完美效果。  实现方式  项目结构:为了方便使用,用的winform程序,附nug...
            15 14 1588
            分享
      • 51testing软件测试圈微信