接口用例设计
章节目录:
- 一、针对输入设计
- 1.1 数值型
- 1.2 字符串型
- 1.3 数组或链表类型
- 二、针对业务逻辑
- 2.1 约束条件分析
- 2.2 操作对象分析
- 2.3 状态转换分析
- 2.4 时序分析
- 三、针对输出设计
- 3.1 针对输出结果
- 3.2 接口超时
- 四 、其他测试设计
- 4.1 已废弃接口测试
- 4.2 接口设计合理性分析
- 五、一个完整的例子
- 5.1 针对输入设计
- 5.2 针对逻辑设计
- 5.3 针对输出分析
- 六、总结
- 七、结束语
一、针对输入设计
1.1 数值型
-
1 ~ 35 范围内和范围外的值。
-
1 ~ 35 的边界:0、1、35、36。
-
类型的特殊值:-1、0。
-
数据类型的边界值:
int
的最小值最大值。 -
因为 1 ~ 35 代码的权限 ID 不同,可能需要遍历 1-35 的每个值。
-
常见问题和风险:
- 特殊值处理不当导致程序异常退出。
- 类型边界溢出。
- 取值范围外值未返回正确的错误信息等。
1.2 字符串型
-
长度为 4 位,比 4 位少,比 4 位多。
-
边界值:
String
的最大长度。 -
特殊值:空字符。
-
字符串内容可考虑类型:数字,非数字。
-
特殊字符。
-
业务枚举值。
-
如果是输入用户输入且其他用户可见的内容,则还需要考虑敏感字是否被正常过滤。
-
可能出现的问题和风险:
- 传入非特定类型程序异常退出。
- 超长字符未进行处理,导致存储、显示等异常。
- 其他用户可见设置的敏感字。
1.3 数组或链表类型
- 正常取值:1 ~ 5 个权限,范围外:6 个权限。
- 边界值:1 ~ 35 的边界值,请求允许最大最小值。
- 特殊值:0 个(即空集合)。
- 合法 ID 和不合法的。
- 重复的 ID 等。
- 可能存在的问题和风险:
- 0 个 item 时程序异常退出。
- 重复的 item 处理时未去重导致结果异常等。
二、针对业务逻辑
2.1 约束条件分析
约束条件的测试在功能测试中经常遇到,在接口测试中更为重要。它的意义在于:用户进行操作时,在该操作的前端可以已经进行了约束条件的限制,故用户无法直接触发请求该接口。但是实际上,如果有其他手段:例如 UI 有 bug 或者通过技术手段直接调用接口,那么接口是否针对这些条件进行了限制就尤为重要。
- 常见的例子:要兑换 5Q 币需要 200 积分,但是我积分不足,所以兑换按钮是灰色无法点击的状态。
- 正常用户是无法操作的,但是兑换其实是调后台的一个接口,如果绕过页面按钮的限制,直接调用后台接口兑换呢?是否可以兑换?预期当然是不能兑换的。
- 因此积分这个数值限制就需要针对接口进行测试,并且非常重要。
- **数值限制:**分数限制、金币限制、等级限制等等。(例如:兑换 Q 币活动要求积分 > 50 才可参与。)
- **状态限制:**登录状态等。(例如:同步用户信息需要先登录账号。 )
- **关系限制:**绑定的关系,好友关系等。(例如:帮家人防骗功能只能查询绑定家人的来电信息。 )
- **权限限制:**管理员等。
- 其他约束条件类似(根据业务丰富设计):
- 时间约束:22:00 之前等。
- 常见的问题和风险:约束条件判断不足,导致用户可通过特殊手段获取利益。
2.2 操作对象分析
操作通常是针对对象的,例如用户绑定电话号码,电话号码就是操作对象,而这个电话号码的话费、流量也是对象。
-
对象分析主要是针对合法和不合法对象进行操作。例如下述用例子:
-
用户 A 查询电话 P1 话费:
-
用户 A 查询电话 P1 流量;
-
用户 A 查询电话 P2 话费;
-
用户 A 查询电话 P2 流量。
-
后台的逻辑处理,如果一个电话已经被绑定过,从后台的角度是可以查询到该电话的话费和流量的。但是在用户侧,应该是 **A 绑定了的电话,才能让 A 查询到该电话的话费。**故类似对象的测试也必不可少。
-
常见的问题和风险:
-
用户可访问非权限内的其他用户信息、敏感信息,从而利用这些信息谋取利益。
2.3 状态转换分析
被测逻辑可以抽象成状态机,各个状态之间根据功能逻辑从一个状态切换到另一个状态。如果我们打乱了这个次序,从一个状态切换到另一个不在它下一状态集中的状态,那么逻辑将会打乱,就会出现逻辑问题。
- 例如在做任务的时候,任务有三种状态:未领取,已领取未提交,已完成三种状态。
- 那么可以这样设计:
- 正常的状态切换:未领取状态,领取任务后变为已领取状态;已领取满足任务条件提交后,变成已完成状态;完成后可以再次领取任务。
- **非正常的状态切换:**未领取任务满足任务条件直接提交任务;已领取时再次领取任务等等。
- 常见的问题和风险:
- 可通过特殊手段达到原本不能的状态,从而谋取利益。
2.4 时序分析
在一些复杂的活动中,一个活动是由一系列动作按照指定顺序进行的,这些动作形成一个动作流,只有按照这个顺序依次执行,才能得到预期结果。
- 在正常的流程里,这些动作是根据程序调用依次进行的,并不会打乱,在接口测试时,需要考虑如果不按照时序执行,是否会出现问题。
- 例如,客户端数据同步是由客户端触发进行的,期间的同步用户无法干预。功能测试的时候可见的就是是否能正常进行同步,而进一步分析,同步流程实际涉及了一组动作:
- 假设后台有 3 个接口:登陆获取用户 ID,上报本地数据,上报本地冲突。三个接口需要依次调用执行,才能完成同步。
- 那么在接口测试就可以考虑打乱上述接口的执行顺序去执行,会有怎样的结果,是否会出现异常。例如:获取用户 ID 后不上报本地数据而直接上报本地冲突。
- 常见的问题和风险:
- 非顺序执行后,数据出现异常,可能还会出现程序其他异常。
- 通过打乱顺序获取利益。
三、针对输出设计
针对输出设计其实是针对接口返回的结果进行分析。
3.1 针对输出结果
- 接口处理正确的结果可能只有一个,但是错误异常返回结果有很多情况很多值。如果知道返回结果有很多种,就可以针对不同结果设计用例。例如提交积分任务的时候我们通常能想到的是返回正确和错误,错误可能想到:无效任务,无效登录态,但是不一定能否完全覆盖所有错误码,而接口返回定义的返回码可以设计更多用例:
- 覆盖返回码也是用例设计的一种思路。
- 常见问题和风险:
- 错误前端处理不足,导致前端异常。
- 错误提示处理不当,导致用户看到晦涩的错误码。
- 错误提示不当,导致用户不知道哪里出了问题,如何解决。
3.2 接口超时
- 接口正常情况下是有返回的,那么如果接口不返回呢?也就是说接口超时后的处理也是测试需要考虑的部分。
- 如果超时处理不当,可能会引起以下问题:
- 未进行超时处理,导致整个流程阻塞。
- 超时后又收到接口返回,导致逻辑出现错乱。
四 、其他测试设计
4.1 已废弃接口测试
- 已废弃协议,是指之前有定义,但是因为**需求变更或其他原因,目前版本不用。**这些接口虽然不再使用,但有可能代码并没有及时删除。如果利用技术手段调用这些接口,可能获取额外利益。
- 例如,任务之前有个清理任务,在一个版本需求里将清理任务替换为下载任务。在新版本客户端已不再调用完成清理任务的接口;但是如果该接口未关闭,用户就可以继续请求 submitTask(int taskID) 接口完成清理任务获得积分。
- 因此新版本在考虑兼容旧版本的同时,还应做好相关废弃接口的检查,避免用户获得额外利益。
4.2 接口设计合理性分析
- 接口定义是否合理可以从以下几个方面分析:
- 接口是否冗余。
- 接口字段是否冗余。
- 接口是否返回了调用方期望得到的信息。
- 接口定义是否可满足所有调用需求。
- 接口定义调用是否方便。
五、一个完整的例子
下面举一个完整例子,通过上述方法来分析如何对接口进行用例设计。
某模块提供了一个接口给其他模块,用户请求任务。
5.1 针对输入设计
针对长度:
- 正常(基本流);
- 边界:
- 一个字符。
- 长度非常长。
- 特殊:空字符串。
针对内容:
- 特定类型:中文,英文,数字等;
- 特殊字符:/n/r/t ,.><?*$&%~"ஜღ℡♬€✎等;
- 敏感字符:非用户设置,不涉及。
等价类:
- 取值范围内:1、5、10 等;
- 取值范围外:0、99。
边界法:
- 取值范围边界:0、1、38、39、40。
- 数据类型边界:-2147483648、2147483648。
- 特殊值:0、-1 等。
遍历法:
- 1、2、3、4、5…38、39 对应每种不同 ID。
5.2 针对逻辑设计
约束条件分析:
- 去引导某功能需要:未完成过任务,任务有任务数据。
- 未使用过有任务数据时;
- 未使用无任务数据时;
- 使用过有任务数据时;
- 使用过无任务数据时。
操作对象分析:
- 调用请求接口后,会显根据任务数据,引导对应的任务。任务数据,任务操作方式,任务功能都可以是对象。
- 任务数据:
- 数据类型:本地,云端等。
- 数据有效性:正确数据,错误数据。
- 操作方式:
- 方式:安装,下载,打开等等 。
- 任务功能:
- 功能:用户操作了该功能,未正常操作该功能;什么都不操作;完成一个任务功能;完成多个任务功能;任务功能使用顺序等等。
- 对象:还需要关注,会不会操作到不合法的对象,例如任务数据和功能不对应等问题。
状态转换分析:(假设,功能是有 4 个状态的:完成,未完成,未知。)
- 针对该状态:
- 正常状态转换:未完成状态请求并完成任务后是否可变成完成状态;未完成状态请求但不完成,还是未完成状态。
- 走不到的状态路径:未知和完成状态请求任务,不能进行进行该任务。
时序分析:
- 从时序的角度分析,调用请求接口前需要以下 2 步动作:
- 拉取任务数据;
- 判断任务状态。
- 正常时序:按照正常时序请求 1 -> 2 -> 3;
- 缺失的时序。
- 缺少动作 1 调 2、3;缺少动作 2 调 1、3;缺少动作 1 和 2 直接调。
- 打乱的时序:2 -> 1 -> 3,还可以有 1 -> 3 -> 2;2 -> 3 -> 1;3 -> 1 -> 2;3 -> 2 -> 1。、
- 注意:针对处理逻辑的设计中,可能使用某一种或某几种方式就可以将用例覆盖前,故实际使用中,可能不会全部使用,只要找到最合适的方式覆盖用例即可。
5.3 针对输出分析
- 请求任务接口返回的数据是任务完成结果,即返回完成,未完成两种状态(未知都作为完成返回)。
- 从结果可以考虑遍历:
- 未完成。
- 完成。
- 完成 - 未知。
- 从接口处理时间分析,考虑:请求后快速返回,很长时间才返回,甚至不返回结果的情况。
六、总结
- 接口用例设计方法中,针对输入、输出的设计是通用的,接口设计时都可用到。对于接口逻辑的设计可能会应用比较适合的一种或几种方法,在接口用例设计时,需要选取最合适的方法去覆盖被测逻辑。
- 当测试时间紧任务重的情况下,用例设计需要具体情况具体分析。
七、结束语
“-------怕什么真理无穷,进一寸有一寸的欢喜。”
微信公众号搜索:饺子泡牛奶。
相关文章:
接口用例设计
章节目录: 一、针对输入设计1.1 数值型1.2 字符串型1.3 数组或链表类型 二、针对业务逻辑2.1 约束条件分析2.2 操作对象分析2.3 状态转换分析2.4 时序分析 三、针对输出设计3.1 针对输出结果3.2 接口超时 四 、其他测试设计4.1 已废弃接口测试4.2 接口设计合理性分析…...
Selenium超级详细的教程
Selenium是一个用于自动化测试的工具,它可以模拟用户在浏览器中的各种操作。除了用于测试,Selenium还可以用于爬虫,特别是在处理动态加载页面时非常有用。本文将为您提供一个超级详细的Selenium教程,以帮助您快速入门并了解其各种…...

服务报network error错误
问题:服务请求时会偶发性的报【network error网络超时】(请求瞬间就报) 可能原因: 服务器linux内核调优时将:net.ipv4.tcp_tw_recycle设置为1,开启TCP连接中TIME-WAIT sockets的快速回收,默认为…...
【ES6】利用 Proxy实现函数名链式效果
利用 Proxy,可以将读取属性的操作(get),转变为执行某个函数,从而实现属性的链式操作。 var pipe function (value) {var funcStack [];var oproxy new Proxy({} , {get : function (pipeObject, fnName) {if (fnNa…...

hive部署
下载hive安装包:https://dlcdn.apache.org/hive/hive-2.3.9/解压及环境部署 tar -zxvf apache-hive-2.3.9-bin.tar.gz mv apache-hive-2.3.9-bin hivevim /etc/profile添加至环境变量 export HIVE_HOME/usr/local/hive export PATH$PATH:$HIVE_HOME/binsource /etc…...
ip白名单之网段
代码托管,有时候为了安全性,限制网段内的ip可以访问。 IP地址和掩码均知道时才能确定主机所在的网段,也就是用这个原理来限制可访问的IP网段了。 ip后面加上“/N”就代表掩码的二进制”1“有N位。 例如: ①0.0.0.0/0 主机ip地…...

PMP项目管理主要学习内容是什么?
PMP项目管理是指根据美国项目管理学会(Project Management Institute,简称PMI)制定的项目管理知识体系和方法论进行项目管理的一种认证。PMP主要关注项目的规划、执行和控制等方面的知识和技能。 下面是PMP项目管理《PMBOK指南》第六版的主要学习内容: …...

小米面试题——不用加减乘除计算两数之和
前言 (1)刷B站看到一个面试题,不用加减乘除计算两数之和。 (2)当时我看到这个题目,第一反应就是感觉这是一个数电题目。不过需要采用C语言的方式编写出来。 (3)不过看到大佬的代码之…...
Mysql 日志管理 数据备份
MySQL日志管理 MySQL的默认日志保存位置为/usr/local/mysql/data 日志开启方式有两种:通过配置文件或者是通过命令 通过命令修改开启的日志是临时的,关闭或重启服务后就会关闭 日志的分类 1.错误日志 用来记录当MySQL启动、停止或运行时发生的错误信…...
Java小记-腾讯2020校招-后台-逛街
题目描述: 小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。 小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢…...

FFmpeg5.0源码阅读——FFmpeg大体框架
摘要:前一段时间熟悉了下FFmpeg主流程源码实现,对FFmpeg的整体框架有了个大概的认识,因此在此做一个笔记,希望以比较容易理解的文字描述FFmpeg本身的结构,加深对FFmpeg的框架进行梳理加深理解,如果文章中有…...

【算法刷题之字符串篇】
目录 1.leetcode-344. 反转字符串(1)方法:双指针 2.leetcode-541. 反转字符串 II(1)方法一:模拟(2)方法二:双指针 3.leetcode-剑指 Offer 05. 替换空格(1&…...

js中forEach和map的区别:forEach不会改变原数组,而map会改变数组?错了错了
1.提出思考?forEach不会改变原数组,而map会改变数组? 看到掘金上一篇文章觉得很有意思:大致是描述一般面试官问js中forEach和map的区别?都会回答forEach不会改变原数组,而map会改变,我也一直对…...
深度对话:从底层看Sui设计理念及网络规模扩展
近日,我们采访了George Danezis以了解Sui的交易处理系统如何促成高性能网络。他是Mysten Labs的联合创始人和首席科学家(Sui的最初贡献者),也是伦敦大学学院(University College London,UCL)安全…...
2.单链表练习
1. 链表的基本概念 链表(Linked List)是一种常见的数据结构,用于存储一系列元素,这些元素可以是任意类型的数据。链表中的每个元素被称为节点(Node),每个节点包含两部分:一个存储数…...
Wordpress 安装插件和主题报错
安装主题和插件的时候,就是这个恶心的报错, Wordpress plugin install: Could not create directory 这是权限惹的祸,如下一顿操作猛如虎,就解决了。 sudo chown -R www:www wp-content/themes sudo chown -R www:www wp-conte…...

Spring Cloud 2022.x版本使用gateway和nacos实现动态路由和负载均衡
文章目录 1、nacos下载安装1.1、启动服务器1.2、关闭服务器1.3、服务注册&发现和配置管理接口 2、代码示例2.1、app1工程代码2.2、app2工程代码2.3、gateway网关工程代码 3、动态配置网关路由3.1、配置动态路由3.2、配置为负载模式 4、gateway配置规则4.1、请求转发&#x…...

CSS中如何隐藏元素但保留其占位空间(display:none vs visibility:hidden)?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ display: none;⭐ visibility: hidden;⭐ 如何选择⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为…...

无涯教程-机器学习 - 数据可视化
在上一章中,无涯教程讨论了数据对于机器学习算法的重要性,以了解具有统计信息的数据,还有另一种称为可视化的方式来理解数据。 借助数据可视化,可以看到数据的属性保持什么样的关联,这是查看要素是否与输出相对应的最…...
springboot设置日志输出级别
一、日志等级 trace:最低等级 debug:调试用,通常用于跟踪程序进展 info: 记录用,通常用于记录程序行为 warn:警告 error:错误 fatal:灾难性错误,最高等级 配置application.yml 实现…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...