《Web测试囧事》——1.8 使用没有添加时间戳的缓存使用户看到过期数据

本节书摘来自华章计算机《Web测试囧事》一书中的第1章,第1.8节,作者 黄勇 雷辉 徐潇 杨雪敏,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.8 使用没有添加时间戳的缓存使用户看到过期数据

当代主流的网站都使用了缓存技术,目的在于减少用户请求对服务器的压力。当用户首次通过浏览器请求服务器的资源时,服务器会返回所有的资源;当用户再次请求服务器资源时,浏览器会判断资源是否已更新,如果更新了,再向服务器发起请求,如果没有更新,就使用浏览器中缓存的资源。

这里有一个问题,浏览器是如何判断资源是否更新了?一般来说,资源文件在文件名中要么添加时间戳(见图1-16),要么添加标识符(标识符可以是任何一组区别资源不同版本的数值,如v1、v2,或者GUID等)来唯一区分资源的不同版本(见图1-17)。只要本地缓存的资源文件和服务器端最新的资源文件名称不一样,浏览器就要从服务器端获取新的资源文件,如果一样,就使用本地缓存的资源。

《Web测试囧事》——1.8 使用没有添加时间戳的缓存使用户看到过期数据

如果资源文件没有被添加时间戳或者标识符呢?那用户只能通过手动清除浏览器的缓存来强制获取最新的资源文件了,不过这样等于所有用户请求的文件都没有从浏览器缓存中读取,也就没有为服务器缓解访问压力。并且绝大多数用户并不会去手动清除浏览器的缓存,这就导致用户看到网页的资源文件不是最新的。

最近小蔡测试的商品详细信息页面出现的Bug就属于这种情况。根据用户线上反馈,当用户修改了商品图片并且发布之后,不能及时看到更新后的图片,而是需要等一段不确定的时间才能看到更新后的图片。

经过小蔡和开发人员的调查,发现导致这个问题的原因是缓存资源文件没有被设置时间戳或者标识符,导致用户修改后不能看到更新后的图片。而之所以会造成不确定时间后才能看到更新后的图片,是由于不同浏览器对于没有设置时间戳或者标识符的缓存资源文件处理不一致造成的。

例如IE缓存时间就是一个Session的时间,如果用户打开一个新的IE窗口时,他们就会获取最新的静态资源;而其他浏览器(例如Firefox),则会通过HTTP头文件中Last-Modified参数的具体定义来判断是否需要去重新获取资源。

而小蔡在之前的测试中,为了避免缓存数据对测试结果的影响,她在浏览器中设置了每次退出浏览器时清空缓存(见图1-18),这反而导致小蔡漏测了缓存没有及时刷新的问题。

由于缓存在Web产品中是普遍存在的,所以小蔡立刻取消了浏览器中清除缓存的设置,改为使用手工清除缓存的方式。当她之后在测试中遇到测试结果和预期结果不同,并且有可能是缓存未清除造成的情况时,她会手动清除缓存,这样可以更准确地进行测试。

《Web测试囧事》——1.8 使用没有添加时间戳的缓存使用户看到过期数据

《Web测试囧事》——1.8 使用没有添加时间戳的缓存使用户看到过期数据