记开发中的一次异常调试
库存分配中,用intellij运行junit test,测试通过。用mvn clean install过程中测试用例不通过。代码一致,环境不一致。
思考
代码相同,环境不同,结果不同,可能原因有两个
- 存在随机变量
- 环境设置影响
分析
首先,对代码进行通读,这段代码就是一个简单的业务逻辑处理,不涉及到外部环境,所以环境应该影响比较小
然后查找随机变量,代码中并没有明显的随机值。考虑到业务代码的特殊性,涉及到一些时间点的处理,时间点本身也是一种随机值,所以需要对时间点进行考量
排查
当前系统时间为Now,设置7天后过期时间即为Expiry,测试边界条件,业务要求在当前距到期时间不足7天为禁售期。Expect为期望出货时间,按正常逻辑来说Expect+7天应该正好到过期时间,所以应该是可以出售,但是实际过程操作中,Now和Expect都使用了new Date()
操作,所以导致时间点有个错位,导致出货失败。Intellij中执行较慢,所以now和expect有个时间错位,使用mvn clean install
的时候,执行较快,now和expect没有错位,Now和expect时间点一致。比较时间点的时候使用了after函数,那么在intellij中就会返回true,在mvn中返回false,从而导致不一致的情况出现。
总结
时间本身也是一个随机值,项目中用到时间,尤其是一些时间敏感的地方,需要对时间进行仔细控制。写测试用例需要保证幂等性,即不论环境,多次执行需保证相同结果。