软件测试中如何测试算法?

广义的算法是指解决问题的方案,小到求解数学题,大到制定商业策略,都可以叫做算法。而我们今天讨论的软件测试中的算法,对应的英文单词为 Algorithm,专指计算机处理复杂问题的程序或指令。

随着最近几年人工智能等领域的快速发展,算法受到前所未有的重视,算法测试也随之兴起。

为了让同学们能对算法测试有一定了解,老规矩,我将这篇文章大纲先公布如下:

1、算法测试测什么?
2、算法测试如何做?
3、补充算法测试一个案例
4、答疑解惑

一、算法测试测什么?

先来看几个大家耳熟能详的算法应用成功的例子:

  1. 阿尔法围棋机器人,打败了人类棋手,其实就是运用了复杂的人工智能算法
  2. 今日头条、抖音等APP ,使用了兴趣算法推荐,推送的都是你感兴趣的
  3. 购物软件,你搜过什么商品,就会不胜其烦一直推荐,也是使用了算法推荐机制

区别于一般的功能测试,算法测试的侧重点不同。

一般的功能测试是关注前端操作之后服务端返回数据的正确性(增删改查),而算法测试则要关注的是算法(模型)启用之后,数据的增量(有正负)是否符合预期。

举两个例子

例子1: 某软件中的广告推荐更新了一套算法,预期要把推荐转化率提升几个百分点。

【测试要关注的是】新算法有没有提升转化率百分比,提升量的有没有达到预期。

例子2: 某人脸识别软件更新了识别算法,预期是减少识别耗时。

【测试要关注的是】耗时减少的同时准确率有没有下降。

二、如何测试算法?

1、普通功能测试会使用到的方法

1)算法稳定性测试

a ) 长时间运行,算法是否奔溃

b )数据量提升后,算法模型的结果是否符合预期

2 ) 算法性能测试

a )算法模型的响应时间

b )算法模型对处理器cpu和磁盘的消耗

3 ) 算法兼容性测试

a ) 设置不同阈值内的数据,算法结果是否稳定(比如用户年龄、区域、性别等)

上面说到测试方法,是不是似曾相识?没错,这几个与普通功能测试中用到的测试方法基本一样

2、普通功能测试中不会用到的测试方法

1 ) 算法pk(赛马)

对于一个需求,不同的人或团队可以设计出不同的算法模型,到底哪个更靠谱,是骡子是马拉出来溜溜,pk一下就知道了。

这个环节是算法测试的关键部分,用例设计主要采用场景法,通过列举不同场景,对多个算法分别进行测试验证,最终综合所有场景中的算法模型的表现,选出前几名。

你可能会有疑问:为什么要前几名,选第一名不就可以了吗?

下文中通过实例列举了这个环节中的测试用例,可以更好地理解这样设计用例的原因 ( 在此暂时不表 )。

2)A/B测试

由于算法的准确性会受到测试数据的影响,而在测试环境中,数据的来源一般是手动插入数据库或从线上导入数据。

尽管测试数据会接近于真实数据,但仍会有数据类型覆盖不够全面、数据量不够大等方面的问题。因此,即使算法模型在测试环境通过验收,仍然不能在生产环境全部放量。

通常采用的方法是:拿出线上流量的5%-10%,其中一部分数据作为对照组,其它部分作为一个或多个实验组(实验组采用的算法为pk中胜出的前几名算法)。对照组合实验组数据分别打不同的标,一段时间后分别统计计算的各项指对照组合实验组的各项指标标,根据关键指标来验证算法是否有效。

实际测试中,对算法的选择往往不是通过一项指标来定的,通常是多项指标综合比较。

看到这里,你是不是还有点迷糊,别担心,我们也通过下面的例子来说明。

三、算法测试实例

某导航APP,要升级导航路线推荐算法,预期是找到耗时更少的路线并推荐给用户。

首先来理解一下需求中的关键词 「耗时更少」:耗时不等同于距离,有可能距离短但是堵车,实际比绕路耗时还长。

经过n天的研发,算法同学最终给出了3个优化后的算法模型,现在到了测试验证环节。

为方便描述,我把旧导航路线推荐算法称为算法0,新算法分别称算法1、算法2、算法3

1、算法pk(下面是场景化测试用例的列举)

同一条路线,默认为当前时间和天气状况,多轮测试之后,选出最优的算法,假定是算法2

同一条路线,分别设定不同时间段(早晚高峰、工作日、节假日等),找出最优算法,假定是算法1

同一条路线,分别设定不同的天气状况(雨、雪、雷、沙尘、冰雹等),找出最优算法,假定是算法3

还有其它很多场景的测试,这里就不一一列举了……

2、稳定性测试

长时间(24小时以上)运行算法模型,是否有稳定的表现,假定这里的最优算法是算法1

超长距离(1000km以上)测试算法模型,对比推荐效果是否稳定,假定这里的最优算法是算法2

……

3、兼容性测试

选取不同城市的道路测试(比如重庆、贵州等地),测试山路、爬坡、转弯等不同路况下导航推荐算法的表现,假定这里的最优算法是算法1

选取不同通行能力的道路(城市和乡间小路等),测试小路、窄路等不同路况下,推荐算法是否有稳定表现,假定这里的最优算法是算法3

……

4、性能测试

同一条路线下,不同算法模型的耗时,假定耗时最少的算法是算法3

同一条路线下,不同算法模型对服务器的压力,假定最终结果是算法2最服务器压力最小

……

5、AB测试

经过上面几个环节的测试,综合所有结果,假定最终选出的算法1和算法3

线上灰度放量,选取目标用户,被选中的用户会收到「是否参加内测/灰度」之类的消息

经过一段时间的A/B测试之后,拿到真实的数据,最终经过架构师、研发经理、产品经理等研讨之后选出符合预期的算法

四、答疑解惑

上述例子中,假定最终要采用的是算法2,但是你可能会有很多疑问:

1、算法1在早晚高峰期时段表现最好,我就是上下班使用导航软件,为什么不采用?
2、耗时最少的是算法3。我就希望推荐路线要快,为什么不采用?

算法的测试,要经过多个环节综合来评估效果,所以即使某个环节表现好最终也不一定入选。

最终会结合效果、成本、稳定性等多方面的因素,最终往往会选择妥协折中后的方案。

  自动化测试相关教程推荐:

2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili

测试开发相关教程推荐

2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili

postman/jmeter/fiddler测试工具类教程推荐

讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili

2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili

2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili

  总结:

 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/259439.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言初阶】数组

目录 一、一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 二、二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 三、数组越界 四、数组作…

每日一博 - Protobuf vs. Protostuff:性能、易用性和适用场景分析

文章目录 历史区别联系性能差异最佳实践场景分析小结 历史 对于Protostuff和Protobuf的关系,需要了解它们的起源和发展。 Protobuf(Protocol Buffers)是由Google开发的一种数据序列化格式,用于结构化数据的存储和交换。它最初是…

【✅Java中有了基本类型为什么还需要包装类?】

✅Java中有了基本类型为什么还需要包装类? ✅Java中有了基本类型为什么还需要包装类✅Java的8中基本数据类型 ✅知识拓展✅基本类型和包装类型的区别✅如何理解自动拆装箱?✅拆箱与装箱✅自动拆装箱✅自动拆装箱原理 ✅哪些地方会自动拆装箱?…

C++20形式的utf-8字符串转宽字符串,不依赖编译器编码形式

默认的char[]编码都是要看编译器编译选项的,你选了ANSI那它就是ANSI,你选了UTF8那它就是UTF8. 【注意:经典DevC只支持ANSI编码(痛苦);上图是小熊猫DevC,则有这个选项】 这一点对我的代码造成了…

【教3妹学编程-算法题】循环移位后的矩阵相似检查

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 3妹:“太阳当空照,花儿对我笑&…

Ubuntu 常用命令之 apt-get 命令用法介绍

apt-get是Ubuntu系统下的一个命令行工具,用于处理包。这个命令可以自动下载和安装软件包及其依赖项。它是Advanced Packaging Tool (APT)的一部分,APT是处理包的高级工具,可以处理复杂的包关系,如依赖关系等。 apt-get命令的常见…

linux: ip route 与 route 用法详解与对比

文章目录 1. 引言2. ip route2.1 描述2.2 语法2.3 参数2.4 例子 3. route3.1 描述3.2 语法3.3 参数3.4 例子 4. 对比5. 参考 1. 引言 本文主要介绍 ip route 以及 route 的用法和区别。 2. ip route 2.1 描述 用于管理静态路由表。linux 系统中,可以自定义从 1&…

聚类算法及可视化方法的实践与探索

簇内平方和表示数据点到其簇内质心的距离的平方和,公式如下: 其中, 是k簇数, ni是第 i 个簇的样本数, xij是第 i个簇中的第 j 个样本。 import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sk…

Python Opencv实践 - 手势音量控制

本文基于前面的手部跟踪功能做一个手势音量控制功能,代码用到了前面手部跟踪封装的HandDetector.这篇文章在这里: Python Opencv实践 - 手部跟踪-CSDN博客文章浏览阅读626次,点赞11次,收藏7次。使用mediapipe库做手部的实时跟踪&…

47 星南二楼

动态规划&#xff0c;相当于求解最长子序列问题 #include <iostream> using namespace::std; using std::cout; using std::cin; int n; int a[5100],dp[5100];int xnel(int n, int a[]) {int result 0;for(int i0; i<n; i){for(int j0; j<i; j){if(a[j]<a[…

node版本与npm版本不对应的解决方案

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 错误情况 今天遇到了个问题&#xff0c;原来用的node的版本是v14.16.0的&#xff0c;后来升级到了最新版20多的时候&#xff0c;以前的项目启动不了。 于是我手动将node卸载了&#xff0c…

【2023年网络安全优秀创新成果大赛专刊】银行数据安全解决方案(天空卫士)

在2023年网络安全优秀创新成果大赛&#xff0c;成都分站中&#xff0c;天空卫士银行数据安全方案获得优秀解决方案奖。与此同时&#xff0c;天空卫士受信息安全杂志邀请&#xff0c;编写《银行数据安全解决方案》。12月6日&#xff0c;天空卫士编写的《银行数据安全解决方案》做…

DAY11

问题一&#xff1a;指针与引用的区别 疑问 为什么引用的本质是指针常量&#xff0c;但是对它求sizeof却是变量所占内存空间的大小那&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 1.引用是给变…

Playground AI刚刚推出了它的新宠儿——Playground V2,去试试?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

令人惊叹的代码技巧

在编程世界中&#xff0c;有一些令人惊叹的代码技巧和巧妙的实现方式。以下是一些我见过的令人印象深刻的代码技巧&#xff1a; 函数式编程魔法&#xff1a; 使用函数式编程的一些特性&#xff0c;比如高阶函数、匿名函数和Lambda表达式&#xff0c;可以使代码更为简洁、易读。…

(9)Linux Git的介绍以及缓冲区

&#x1f4ad; 前言 本章我们先对缓冲区的概念进行一个详细的探究&#xff0c;之后会带着大家一步步去编写一个简陋的 "进度条" 小程序。最后我们来介绍一下 Git&#xff0c;着重讲解一下 Git 三板斧&#xff0c;一般只要掌握三板斧就基本够用了。 缓冲区&#xff…

Redis权限管理体系(三): ACL 配置持久化

点击上方蓝字关注我 前面我们已经了解了ACL用户管理的用途及使用&#xff1a; Redis权限管理体系(一&#xff09;&#xff1a;客户端名及用户名 Redis权限管理体系(二&#xff09;&#xff1a;终于等来了Redis权限控制体系ACL 但因默认配置中ACL的配置未持久化&#xff0c;因此…

oracle怎样才算开启了内存大页?

oracle怎样才算开启了内存大页&#xff1f; 关键核查下面三点&#xff1a; 1./etc/sysctl.conf vm.nr_hugepages16384这是给了32G&#xff0c;计划sga给30G&#xff0c;一般需多分配2-4G sysctl -p生效 看cat /proc/meminfo|grep Huge啥结果&#xff1f; 这种明显是配了…

Go项目快速集成Swagger UI

swag Swag将Go的注释转换为Swagger2.0文档。我们为流行的 Go Web Framework 创建了各种插件&#xff0c;这样可以与现有Go项目快速集成&#xff08;使用Swagger UI&#xff09;。 目录 快速开始支持的Web框架如何与Gin集成格式化说明开发现状声明式注释格式 通用API信息API操…

【每日一题】【12.20】2828.判别首字母缩略词

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 1.题目链接 2828. 判别首字母缩略词https://leetcode.cn/problems/check-if-a-string-is-an-acronym-of-words/ 2.题目描述 今天…