带着迷惑和不解,请业务小哥把它出问题的那单数据发了过来再次进行了测试,果然是 不发送邮件,然后我就根据两个条件结合日志逐一查找原因,因为日志比较少,最后还连了代码进行了打断点测试,终于找到原因,原来是参数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大。
然后通过反复的查询还发现,这样直接返回的ASCII值,多位数的时候返回的都是前面一位数的ASCII值,也就是说如果两个数值最高位相同,相同高位,不同个位数的,两个数值,返回的ASCII是同一个!
如果不做处理直接拿来比较就得到的结果可能就不是我们想要的,看到这里我禁不住为自己默默的抹了一汗。 等开发小哥哥修复以后,我专门找了这样的数据来验证,果然问题解决了, 经过这一次深刻的经验教训后,在测试类似种数字的比较,特别是从数据库取值的,我都会特别设计一条这样特殊的测试用例: “构造两个参于比较的数字A,B,A为一位数,B为两位数,且B的十位数小于A,或构造两个相同位数的多位数A,B,且A,B的高位相同,个位数不同,执行比较,查看比较结果是否正确。” 那么这个问题是否在所有的数据库返回值中都存在呢,带着这个疑问,我在接下来的测试工作中关注了另一个数据库,也就是一个用了PG数据库的项目,在此项目测试类似数字比较中复现了问题,那么别的数据库是否有这个问题,还有待验证,期待你的参与。
|