广义的算法是指解决问题的方案,小到求解数学题,大到制定商业策略,都可以叫做算法。而我们今天讨论的软件测试中的算法,对应的英文单词为 Algorithm,专指计算机处理复杂问题的程序或指令。
随着最近几年人工智能等领域的快速发展,算法受到前所未有的重视,算法测试也随之兴起。
先来看几个大家耳熟能详的算法应用成功的例子:
区别于一般的功能测试,算法测试的侧重点不同。
一般的功能测试是关注前端操作之后服务端返回数据的正确性(增删改查),而算法测试则要关注的是算法(模型)启用之后,数据的增量(有正负)是否符合预期。
举两个例子
上面说到测试方法,是不是似曾相识?
没错,这几个与普通功能测试中用到的测试方法基本一样,而下面就是普通功能测试中不会用到的测试方法
算法pk(赛马)
对于一个需求,不同的人或团队可以设计出不同的算法模型,到底哪个更靠谱,是骡子是马拉出来溜溜,pk一下就知道了。
通过几轮的两两PK或多个同时pk,对比选出最符合预期的前几名。
这个环节是算法测试的关键部分,用例设计主要采用场景法,通过列举不同场景,对多个算法分别进行测试验证,最终综合所有场景中的算法模型的表现,选出前几名。
你可能会有疑问:为什么要前几名,选第一名不就可以了吗? 这个问题后面会解答 。下文中通过实例列举了这个环节中的测试用例,可以更好地理解这样设计用例的原因。
A/B测试
由于算法的准确性会受到测试数据的影响,而在测试环境中,数据的来源一般是手动插入数据库或从线上导入数据。
尽管测试数据会接近于真实数据,但仍然会有数据类型覆盖不够全面、数据量不够大等方面的问题。
因此,即使算法模型在测试环境通过验收之后,仍然不能在生产环境全部放量。
通常采用的方法是 拿出线上流量的5%-10%,其中一部分数据作为对照组,其它部分作为一个或多个实验组(实验组采用的算法为pk中胜出的前几名算法)。对照组合实验组数据分别打不同的标,一段时间后分别统计计算的各项指对照组合实验组的各项指标标,根据关键指标来验证算法是否有效。
实际测试中,对算法的选择往往不是通过一项指标来定的,通常是多项指标综合比较。
看到这里,你是不是还有点迷糊,别担心,下面我们通过一个例子来说明。
某导航APP,要升级导航路线推荐算法,预期是找到耗时更少的路线并推荐给用户。
首先来理解一下需求中的关键词 「耗时更少」:耗时不等同于距离,有可能距离短但是堵车,实际比绕路耗时还长。
经过n天的研发,算法同学最终给出了3个优化后的算法模型,现在到了测试验证环节。
话不多说,进入测试(为了方便描述,我们把原先的导航路线推荐算法成为算法0,新的算法分别为算法1、算法2、算法3)
上述例子中假定最终要采用的是算法2,但是你可能会有很多疑问:
算法的测试,要经过多个环节的结果综合来评估效果,即使某个环节中表现好但最终也不一定会入选,最终会结合效果、成本、稳定性等多方面的因素,最终往往会选择妥协折中后的方案。