Reflective 感受 (你要如何形容本周的情绪)
印象深刻的一个案例是修复一个 test 偶尔失败的测试 bug。
# 1
let!(:old_market_price) { create(:market_price, currency: currency.code) }
let!(:current_market_price) { create(:market_price, currency: currency.code) }
# 2
let!(:old_market_price) { create(:market_price, currency: currency.code, created_at: 1.hour.ago) }
let!(:current_market_price) { create(:market_price, currency: currency.code, created_at: Time.zone.now) }
上面 1 和 2 两个,如果不加上 created_at,不能保证 factory girl 能先创建 old_market_price 再创建 current_market_price,而后面的测试都是以 current_market_price 为比对对象,所以就会有时候的 current_market_price 并不是真正的 current_market_price,就会 test 失败。
解决这个问题首先我想的的是有可能是测试数据污染,可是我们的 database cleaner 在每一个 test 开始之前都已经清空了数据,所以不存在数据污染。后来不太知道怎么重现这个问题。
问了 nic,这种情况下他会怎么做,他说他可能会循环这个 test 100 遍甚至 1000 遍,看会不会必然出现 faild,然后 faild 了就打断点进去看看为什么。
我按照他说的办法实作了,结果真的发现了问题所在。
还有一个案例是因为勾选了记住我 3 天,session 过期后,devise 会重新帮忙建立并登录,但是 devise 只处理了自己 session key 并没有处理这之外的,所以 session 过期后的 key 值都是 nil 了,所以就无法获取到,导致两部验证检查就会频繁让你输入(session 1 小时就过期了),所以最后把这个检查拿掉了。
- 因为数据创建不符合预期导致 test failed
- session 过期 devise 只帮忙处理登录相关的 session key,自己的 session key 会失效
本周一个重要的领悟是什么?
解决问题重要的是重现问题,这样才能找到问题所在,一般找到问题原因了,这个问题就离解决差不远了。