有一类 BUG,不是功能性的,在用户使用过程中也不会遇到,但是一些测试用例还是会覆盖到,当然也有不改的,因为不会对用户有什么影响。
分享一个 “BUG”,用户的 VIP 到期时间最大只能到 2038 年的某一天。
场景就是在用户不断地购买 VIP 时,在 2038 年某一次购买失败。
业务场景如下:用户购买一个月 VIP,VIP 到期时间往后延长 30 天,如果之前不是 VIP,当前时间戳往后延长 30 天,花费若干。
当时设计测试用例为了验证系统的交易风险控制中的额度控制和购买 VIP 整个流程的稳定性验证,写了一个 for 循环,一直在不停地购买 VIP。
数据库存储比较简单,每个用户(如果存在)都有一条记录,用来记录用户 VIP 状态,字段也简单,就是记录用户 VIP 的到期时间以及其他信息。购买记录和交易记录都在另外的表存储(跟这个 “BUG” 没有关系)。
BUG 原因:在存储时间戳时,使用的 int 类型表示到期时间,mysql int 有符号位支持的最大长度是 2147483647;既 2038-01-19 11:14:07(北京时间) 已经达到了最大存储值,导致无法保存正确的时间。
解决方案:就当不存在。
虽然是无心插柳发现的 “BUG”,也并没有解决掉,但是依然觉得非常有趣。