前段时间遇到一个策略型产品进行了重构,需要测试重构后的策略合理性,在这里和大家分享一下。
1、背景介绍:
表情搜索的主要功能是根据用户的查询词,返回与用户查询词相关的表情图。由于老代码存在性能问题,为了解决性能问题,这次主要对老代码进行了重构。
2、实现了解:
分析了下之前的代码,性能瓶颈主要集中在对于关键词相关表情图进行索引、召回和排序上。而本次优化是保证之前召回和排序策略基本不变的情况下,进行性能优化。
3、确定测试范围:
根据开发的改动,梳理了下本次重构后的测试范围:
1、 性能测试。
2、 接口正确性测试。
3、 接口排序策略合理性测试。
1和2都是传统意义的测试,而第3点的测试,一开始想到的回归方法是通过线上导流,对比线上结果和测试结果的一致性来测试,因为线上已经运行的策略我们认为是合理的,可以作为参考对比项。
导流对比的结果并不如人意:对于同一个词,由于排序策略是每次实时计算的,所以每次服务器的返回顺序都有可能不一样。所以通过导流对比测试的方法行不通。
不能通过导流对比测试,后面想到了通过评测方式来解决。
对于评测和传统测试,主要有以下区别:
4、评测维度:
针对随机抽取线上5W个请求词,主要考虑以下几维度的评测:
1、图片数。
2、重合率。
3、相似度。
1、对比每个词线上和测试服务器返回图片的个数。
a)统计测试比线上少的词占比。
b)统计测试比线上少50/100/150这3个维度的占比。
从这个维度,可以知道测试和线上服务器返回图片数的差距。可以推进开发解决线上服务器返回图片太少的问题。有了这个后,怎么知道测试服务器好的图片是否排在前面呢?
2、对比每个词线上和测试服务器返回图片重合率。
a)计算方法:测试服务器前N张图片与线上服务器前N张图片的交集个数/N。
b)统计前5/12/24/50/100张图的重合率。
从这个维度,可以知道好的图片排在前面的比例,通过分析badcase,可以推进开发调整策略,将好的图片尽量排在前面。那么对于线上和测试同样的前5张图片,线上服务器abcde和测试服务器decba这两种顺序,重合率是100%,用什么办法衡量这种情况呢?
3、对比每个词线上和测试服务器返回图片距离相似度。
a)采用莱文斯坦(Levenshtein)距离算法,将每张图片格式化成一个唯一字符。进行两个list对比。
b)分别获取前5/12/20/30张图片的数值。
5、评测结果:
最终对于线上随机取的5W个词,输出以下表格:
对以上3个维度,可以通过数据化指标,从不同纬度衡量测试服务器和线上服务器的图片排序到底差距有多大。