接口测试用例设计:常见问题和风险

一、接口测试

接口测试,即对API进行测试。

接口测试过程容易出现的典型问题:

(1) 传入参数处理不当,导致程序奔溃

(2) 类型溢出,导致数据读出和写入不一致

(3) 因对象权限未进行校验,可以访问其他用户的敏感信息

(4) 状态处理不当,导致逻辑出现错乱

(5) 逻辑校验不完善,可利用漏洞获取非法正当权益

二、接口测试用例设计

接口测试过程中,通常需要先编写测试用例,保证测试的覆盖性、准确性。

一份用例的好坏,决定着你测试接口的准确性和覆盖程度。

接口测试的用例的设计,主要从接口输入和输出两方面进行考虑:

1、针对输入设计,输入即入参,常见的参数类型有:

数值型(int,long,float,double)
字符串类型
数组和链表
结构体(结构体(struct)是一些元素的结合,元素实际也是数值型,字符串型,数组或者链表数值型、字符串型、数组或者链表三种参数类型用例设计)
补充:针对输入设计,还需要覆盖必填参数、选填参数。

数值型:

如果参数规定了值的范围,则需要考虑等价类取值范围内,取值范围外,取值的边界,如有需要,可能会遍历取值范围内的各个值。

例如:检查权限的接口:TaskID的取值范围是1-35,那么设计时需考虑:

· 1-35范围内和范围外的值;

· 1-35的边界:0,1,35,36;

· 类型的特殊值:-1,0;

· 数据类型的边界值:int的最小值最大值;

· 1-35代码的权限ID不同,可能需要遍历1-35的每个值。

常见问题和风险:

1)特殊值处理不当导致程序异常退出;

2)类型边界溢出;

3)取值范围外值未返回正确的错误信息。

字符串型:

· 字符串型的参数,主要考虑字符串的长度和内容;

· 例如:接口转换设置闹钟的接口string ddhh ,用例需考虑:

· 长度:长度为4位,比4位少,比4位多

· 边界值:string的最大长度

· 特殊值:空字符

· 字符串内容可考虑类型:数字、非数字;

· 特殊字符;

· 如果用户输入切其他用户可见的内容,则需要考虑敏感字是否被正常过滤。

常见问题和风险:

1)传入非特定的类型程序异常退出。

2)超长字符未进行处理、导致存储、显示等异常。

3)其他用户可见设置的敏感字。

数组或链表类型:

参数类型为数组或链表时,用例可以考虑:

例如:批量提交任务的接口submitTask(int[] taskID),参数用例设计考虑:

· 正常取值:1-5个权限,范围外:6个权限;

· 边界值:1-35的 边界值,请求允许最大最小值;

· 特殊值:0个;

· 合法id和不合法的;

· 重复的id等。

常见问题和风险:

1)0个item是程序异常退出。

2)重复的item处理时未去重导致数据异常。

2、针对逻辑设计

接口需要进行一些逻辑处理的,按照逻辑设计用例可以从以下几个角度分析:

· 约束条件分析

· 关系限制分析

· 权限限制分析

· 操作对象分析

· 状态转换分析

· 时序分析分析

约束条件分析:

数值限制:分数限制、金币限制、等级限制等。
例如:Q币兑换要求积分>50才可以参加。

状态限制:登录状态等。
例如:同步用户信息需要先登录账户。

关系限制:绑定的关系,好友关系等。
例如:帮家人防骗功能只能查询绑定家人的来电信息。

权限限制:

管理员等。

约束条件的测试在功能测试中经常遇到,在接口测试中更为重要。它的意义在于:用户进行操作时,在该操作的前端可以已经进行约束条件的限制,故用户已经直接触发请求该接口。

但是实际上,如果有其他手段,例如UI有bug或者通过技术手段直接调用手段,那么接口是否针对这些条件进行了限制尤为重要。

例如:要兑换5Q币需要200积分,但是我的积分不足,所以兑换按钮是灰色无法点击的状态。

正常用户是无法操作的,但是兑换其实是调后台的一个接口,如果绕过页面按钮的限制,直接调用后台接口兑换呢?是否可以兑换?预期当然是不能兑换的,因此积分这个数值限制就需要针对接口进行测试,并且非常重要。

其他约束条件类似:

时间约束:22:00之前;

数值约束:积分200,限量5个;

状态约束:登录手机管家等等约束条件类似。

常见问题和风险:

约束条件不足,导致用户可以通过特殊手段获取利益。

操作对象分析:

操作通常针对对象的,例如用户绑定电话号码,电话号码就是操作对象,而这个电话号码的话费、流量也是对象。

对象分析主要是针对合法和不合法对象进行操作。例如:

· 用户A查询电话P1话费

· 用户A查询电话P1流量

· 用户A查询电话P2话费

· 用户A查询电话的P2流量

后台的逻辑处理,如果一个电话已经被绑定过,从后台的角度是可以查询到该电话的话费和流量的,但是在用户侧,应该是A绑定了的电话,才能让A查询到该电话的话费,故类似对象的测试也是必不可少的。

常见的问题和风险:

用户可访问非权限内的其他用户信息、敏感信息,从而利用这些信息谋取利益。

状态转换分析

被测试逻辑可以抽象成状态机,各个状态之间根据功能逻辑从一个状态切换到另一个状态。如果我们打乱了这个次序,从一个状态切换到另一个不在它下一状态集中的状态,那么逻辑将会打乱,就会出现逻辑问题。

从某状态改变到新的状态,依赖于转换接口。而对于某转换接口,其输入状态是确定的,比如Fun23,这个函数只能把状态2转换为状态3,而不能将状态1转换为状态3,那么测试点就可以是:

·状态为2,调用接口,状态切换为23

· 状态为1,3等,调用接口,状态不可切换

那么可以这样设计:

正常的状态切换:未领取状态,领取任务后变为已领取状态;已领取满足任务条件提交后,变成已完成状态;完成后可以再次领取任务。

非正常的状态切换:未领取任务满足任务条件直接提交任务;已领取时再次领取任务等。

常见的问题和风险:

可通过特殊手段达到原本不能的状态,从而谋取利益。

时序分析:

在一些复杂的活动中,一个活动是由一系列动作按照指定顺序进行的,这些动作形成一个动作流,只有按照这个顺序依次执行,才能得到预期结果。

在正常的流程里,这些动作是根据程序调用依次进行的,并不会打乱,在接口测试时,需要考虑如果不按照时序进行,是否会出现问题。

例如:客户端数据同步是由客户端触发进行的,期间的同步用户无法干预。功能测试的时候可见的就是是否能正常进行同步,而进一步分析,同步流畅实现涉及了一组动作:

从时序图可以看出,后台又3个接口;登录获取用户ID,上报本地数据库,上报本地冲突。三个接口需要依次调用执行,才能完成同步。那么在接口测试就可以考虑打乱上诉接口的执行顺序去进行执行,会有怎样的接口,是否会出现异常。例如:获取用户ID后不上报本地数据而直接上报本地冲突。

常见问题和风险:

1)非顺序执行后,数据出现异常,可能还会出现程序其他异常。

2)通过打乱顺序获取利益。

3、针对输出结果设计

接口处理正确的结果可能只有一个,但是错误异常返回接口有很多情况很多值,如果知道返回结果有很多种,就可以针对不同结果设计用例。

例如:提交积分任务的时候我们通常能想到的是返回正确和错误,错误可能想到:无效任务、无效登录态,但是不一定能否完全覆盖所有错误码,而接口返回定义的返回码可以设计更多用例。

覆盖返回码也是用例设计的一种思路。

常见问题和风险:

1)错误前端处理不足,导致前端异常。

2)错误提示处理不当,导致用户看到晦涩的错误码。

3)错误提示不当,导致用户不知道哪里出了问题,如何解决。

接口超时情况:

接口正常情况下试有返回的,那么如果接口不返回呢,也就是接口超时后的处理也是测试需要考虑的部分,如果超时处理不当,可以会引出一下问题:

· 未进行超时处理,导致整个流程阻塞;

· 超时后又收到接口返回,导致逻辑出现错乱。

接口测试,即对API进行测试。

接口测试过程容易出现的典型问题:

(1) 传入参数处理不当,导致程序奔溃

(2) 类型溢出,导致数据读出和写入不一致

(3) 因对象权限未进行校验,可以访问其他用户的敏感信息

(4) 状态处理不当,导致逻辑出现错乱

(5) 逻辑校验不完善,可利用漏洞获取非法正当权益

三、接口测试用例设计

接口测试过程中,通常需要先编写测试用例,保证测试的覆盖性、准确性。

一份用例的好坏,决定着你测试接口的准确性和覆盖程度。

接口测试的用例的设计,主要从接口输入和输出两方面进行考虑:

1、针对输入设计,输入即入参,常见的参数类型有:

数值型(int,long,float,double)
字符串类型
数组和链表
结构体(结构体(struct)是一些元素的结合,元素实际也是数值型,字符串型,数组或者链表数值型、字符串型、数组或者链表三种参数类型用例设计)
补充:针对输入设计,还需要覆盖必填参数、选填参数。

数值型:

如果参数规定了值的范围,则需要考虑等价类取值范围内,取值范围外,取值的边界,如有需要,可能会遍历取值范围内的各个值。

例如:检查权限的接口:TaskID的取值范围是1-35,那么设计时需考虑:

· 1-35范围内和范围外的值;

· 1-35的边界:0,1,35,36;

· 类型的特殊值:-1,0;

· 数据类型的边界值:int的最小值最大值;

· 1-35代码的权限ID不同,可能需要遍历1-35的每个值。

常见问题和风险:

1)特殊值处理不当导致程序异常退出;

2)类型边界溢出;

3)取值范围外值未返回正确的错误信息。

字符串型:

· 字符串型的参数,主要考虑字符串的长度和内容;

· 例如:接口转换设置闹钟的接口string ddhh ,用例需考虑:

· 长度:长度为4位,比4位少,比4位多

· 边界值:string的最大长度

· 特殊值:空字符

· 字符串内容可考虑类型:数字、非数字;

· 特殊字符;

· 如果用户输入切其他用户可见的内容,则需要考虑敏感字是否被正常过滤。

常见问题和风险:

1)传入非特定的类型程序异常退出。

2)超长字符未进行处理、导致存储、显示等异常。

3)其他用户可见设置的敏感字。

数组或链表类型:

参数类型为数组或链表时,用例可以考虑:

例如:批量提交任务的接口submitTask(int[] taskID),参数用例设计考虑:

· 正常取值:1-5个权限,范围外:6个权限;

· 边界值:1-35的 边界值,请求允许最大最小值;

· 特殊值:0个;

· 合法id和不合法的;

· 重复的id等。

常见问题和风险:

1)0个item是程序异常退出。

2)重复的item处理时未去重导致数据异常。

2、针对逻辑设计

接口需要进行一些逻辑处理的,按照逻辑设计用例可以从以下几个角度分析:

· 约束条件分析

· 关系限制分析

· 权限限制分析

· 操作对象分析

· 状态转换分析

· 时序分析分析

约束条件分析:

数值限制:分数限制、金币限制、等级限制等。
例如:Q币兑换要求积分>50才可以参加。

状态限制:登录状态等。
例如:同步用户信息需要先登录账户。

关系限制:绑定的关系,好友关系等。
例如:帮家人防骗功能只能查询绑定家人的来电信息。

权限限制:

管理员等。

约束条件的测试在功能测试中经常遇到,在接口测试中更为重要。它的意义在于:用户进行操作时,在该操作的前端可以已经进行约束条件的限制,故用户已经直接触发请求该接口。

但是实际上,如果有其他手段,例如UI有bug或者通过技术手段直接调用手段,那么接口是否针对这些条件进行了限制尤为重要。

例如:要兑换5Q币需要200积分,但是我的积分不足,所以兑换按钮是灰色无法点击的状态。

正常用户是无法操作的,但是兑换其实是调后台的一个接口,如果绕过页面按钮的限制,直接调用后台接口兑换呢?是否可以兑换?预期当然是不能兑换的,因此积分这个数值限制就需要针对接口进行测试,并且非常重要。

其他约束条件类似:

时间约束:22:00之前;

数值约束:积分200,限量5个;

状态约束:登录手机管家等等约束条件类似。

常见问题和风险:

约束条件不足,导致用户可以通过特殊手段获取利益。

操作对象分析:

操作通常针对对象的,例如用户绑定电话号码,电话号码就是操作对象,而这个电话号码的话费、流量也是对象。

对象分析主要是针对合法和不合法对象进行操作。例如:

· 用户A查询电话P1话费

· 用户A查询电话P1流量

· 用户A查询电话P2话费

· 用户A查询电话的P2流量

后台的逻辑处理,如果一个电话已经被绑定过,从后台的角度是可以查询到该电话的话费和流量的,但是在用户侧,应该是A绑定了的电话,才能让A查询到该电话的话费,故类似对象的测试也是必不可少的。

常见的问题和风险:

用户可访问非权限内的其他用户信息、敏感信息,从而利用这些信息谋取利益。

状态转换分析

被测试逻辑可以抽象成状态机,各个状态之间根据功能逻辑从一个状态切换到另一个状态。如果我们打乱了这个次序,从一个状态切换到另一个不在它下一状态集中的状态,那么逻辑将会打乱,就会出现逻辑问题。

从某状态改变到新的状态,依赖于转换接口。而对于某转换接口,其输入状态是确定的,比如Fun23,这个函数只能把状态2转换为状态3,而不能将状态1转换为状态3,那么测试点就可以是:

·状态为2,调用接口,状态切换为23

· 状态为1,3等,调用接口,状态不可切换

那么可以这样设计:

正常的状态切换:未领取状态,领取任务后变为已领取状态;已领取满足任务条件提交后,变成已完成状态;完成后可以再次领取任务。

非正常的状态切换:未领取任务满足任务条件直接提交任务;已领取时再次领取任务等。

常见的问题和风险:

可通过特殊手段达到原本不能的状态,从而谋取利益。

时序分析:

在一些复杂的活动中,一个活动是由一系列动作按照指定顺序进行的,这些动作形成一个动作流,只有按照这个顺序依次执行,才能得到预期结果。

在正常的流程里,这些动作是根据程序调用依次进行的,并不会打乱,在接口测试时,需要考虑如果不按照时序进行,是否会出现问题。

例如:客户端数据同步是由客户端触发进行的,期间的同步用户无法干预。功能测试的时候可见的就是是否能正常进行同步,而进一步分析,同步流畅实现涉及了一组动作:

从时序图可以看出,后台又3个接口;登录获取用户ID,上报本地数据库,上报本地冲突。三个接口需要依次调用执行,才能完成同步。那么在接口测试就可以考虑打乱上诉接口的执行顺序去进行执行,会有怎样的接口,是否会出现异常。例如:获取用户ID后不上报本地数据而直接上报本地冲突。

常见问题和风险:

1)非顺序执行后,数据出现异常,可能还会出现程序其他异常。

2)通过打乱顺序获取利益。

3、针对输出结果设计

接口处理正确的结果可能只有一个,但是错误异常返回接口有很多情况很多值,如果知道返回结果有很多种,就可以针对不同结果设计用例。

例如:提交积分任务的时候我们通常能想到的是返回正确和错误,错误可能想到:无效任务、无效登录态,但是不一定能否完全覆盖所有错误码,而接口返回定义的返回码可以设计更多用例。

覆盖返回码也是用例设计的一种思路。

常见问题和风险:

1)错误前端处理不足,导致前端异常。

2)错误提示处理不当,导致用户看到晦涩的错误码。

3)错误提示不当,导致用户不知道哪里出了问题,如何解决。

接口超时情况:

接口正常情况下试有返回的,那么如果接口不返回呢,也就是接口超时后的处理也是测试需要考虑的部分,如果超时处理不当,可以会引出一下问题:

· 未进行超时处理,导致整个流程阻塞;

· 超时后又收到接口返回,导致逻辑出现错乱。

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在进行JMeter接口测试时,需要进行登录账号密码的加密写入到data文件中。为确保接口请求的安全性,需要对账号密码进行加密处理,以防止被恶意窃取。 首先,需要选择合适的加密算法进行加密。常见的加密算法有MD5、SHA-1、SHA-256等。根据具体需求和安全性要求,可以选择合适的加密算法进行处理。 接下来,可以在JMeter的data文件中添加相应的参数。可以使用HTTP Request中的参数化功能,将登录账号和密码设为变量,然后在data文件中定义这两个变量的值。 然后,在data文件中,对登录账号和密码的值进行加密处理。可以使用JMeter提供的函数,如__MD5、__SHA1等对相应的变量值进行加密处理。将加密后的值赋给对应的变量。 最后,将加密后的登录账号和密码作为参数传递给接口请求。使用JMeter的HTTP Request发送登录请求时,将data文件中加密后的账号和密码变量设置为相应的值。这样,在接口请求中,实际发送的是加密后的账号和密码。 通过以上步骤,就能够实现将加密后的登录账号和密码写入到JMeter的data文件中,并在接口测试中使用加密后的值进行请求。这样可以提高接口请求的安全性,保护用户的账号和密码不被泄露。同时,在测试过程中也能够模拟真实的登录场景,提高测试的准确性和可靠性。 ### 回答2: 在JMeter接口测试中,如果要将登录账号密码加密写到data中,可以采用以下步骤: 1. 打开JMeter,创建一个线程组,并在该线程组下添加一个HTTP请求。 2. 在HTTP请求中,填写登录接口的URL和请求方法(一般为POST)等基本信息。 3. 在HTTP请求的Body Data中,可以使用JMeter提供的函数或变量来加密账号密码,并将加密后的值写入data中。 4. 首先,需要使用JMeter的内置函数或JSR223 PreProcessor来加密账号密码。例如,可以使用MD5、SHA等加密算法对账号密码进行加密。 5. 在Body Data中,以键值对的方式填写账号密码参数。例如,账号参数名为username,密码参数名为password。 6. 使用变量将加密后的值赋给键值对中的value部分。例如,`${__MD5(${username},)}`将会对username进行MD5加密。 7. 在发送请求之前,可以使用JSR223 PreProcessor来在运行时计算并替换变量的值。例如,可以使用Groovy脚本来计算密码的加密值。 8. 在测试计划的配置元件中,可以设置全局或用户定义的变量,以便在测试过程中使用。 通过上述步骤,就可以将登录账号密码加密写入data中,实现对登录接口的安全测试。同时,由于账号密码的加密是在运行时进行的,可以提高测试用例的灵活性和安全性。 ### 回答3: 在JMeter中进行接口测试时,如果需要将登录账号密码进行加密并写入到data中,可以使用以下步骤: 1. 首先,在JMeter中创建一个线程组,用于模拟用户的行为。 2. 添加一个HTTP请求,默认情况下,JMeter会发送明文的登录账号密码。为了实现加密,需要进行下列配置。 3. 在HTTP请求中,选择“HTTP请求头管理器”。在请求头中添加一个新的Header,名称为“Content-Type”,值为“application/json”。 4. 添加一个“HTTP请求接口”来模拟登录请求。在这个接口中,选择“Body Data”标签,并在其中填写需要发送的请求数据,可以是JSON格式。例如,{"username": "加密的账号", "password": "加密的密码"}。 5. 在发送请求之前,需要对账号密码进行加密处理。可以使用Java代码,在JMeter中添加一个BeanShell预处理器来实现加密逻辑。在BeanShell预处理器中,编写加密算法,并将加密后的账号密码赋值给相应的变量。 6. 在“HTTP请求接口”中,填写BeanShell预处理器中的变量作为请求数据。这样,通过预处理器中的加密算法,加密后的数据会作为请求的正文发送给服务器。 7. 运行JMeter测试计划,观察结果。如果登录成功,则表示加密和发送账号密码的操作成功。 通过上述步骤,我们可以在JMeter中实现接口测试时将登录账号密码加密并写入到data中的功能。这样可以对传输的账号密码进行安全保护,避免敏感信息泄漏的风险

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值