为什么要做接口测试?
如下图一个提现功能
比如这个输入框,平常拿到这个web页面,会对输入框做用例设计:
- 输入一个负数(如:-100),点提交
- 输入金额为0(如:0),点提交
- 输入金额为0-100的数(如:20),点提交
- 输入金额为100(如:100),点提交
- 输入金额大于100(如:108),点提交
- 输入1位小数(如:10.1),点提交
- 输入2位小数(如:10.12),点提交
- 输入3位小数(如:10.123),点提交
按照这个等价类,边界值用例测完,页面上不能输入负数和大于3位数小数点,然后就可以上线了。
然而。。。突然有一天数据库里面插入了一个提现金额为负数(-100),于是整个部门炸锅了,首先找到测试(背锅)去复现问题,测试在页面上反复输入负数,无法提交,认为没问题啊!
首先前端开发对输入框是做了限制的,前端的web开发肯定没问题,这个锅前端开发MM不背。那么如果别人用户不通过你的web页面,直接发请求提交了呢?
纳尼!!!不通过页面也能提交。。。这就是我们接下来要提到的接口测试了。
接口测试能发现哪些问题
面试题1:你平常做接口测试的过程中发现过哪些bug?
这个问题其实回到起来很简单,只要做过接口测试的,总能发现几个BUG吧,把你平常发现的bug说2-3个就可以了。
面试官出这个题,主要是想知道你是不是真的做过接口测试,毕竟现在很多小伙伴简历都是写的假的(你要不写估计面试机会都没有,没办法,为了生存,能理解)
比如上面说的,提现输入框,在页面上输入负数,肯定是无法提交过去(前端页面会判断金额),如果我不走前端,直接用接口工具发请求,输入一个负数过去。
(假设服务端没做提现金额数据判断)
余额=当前余额(100)-提现金额(-100),那么提现-100,余额就变成200了,也就是越提现,余额越大了
可以用接口工具去直接请求接口,也可以fiddler抓包,抓到接口后修改金额为负数
所以,接口测试的必要性就体现出来了:
1.可以发现很多在页面上操作发现不了的bug
2.检查系统的异常处理能力
3.检查系统的安全性、稳定性
4.前端随便变,接口测好了,后端不用变
5.可以测试并发情况,一个账号,同时(大于2个请求)对最后一个商品下单,或不同账号,对最后一个商品下单
6.可以修改请求参数,突破前端页面输入限制(如金额)
面试题2:平常你是怎么测试接口的?
通过性验证:
首先肯定要保证这个接口功能是好使的,也就是正常的通过性测试,按照接口文档上的参数,正常传入,是否可以返回正确的结果。
参数组合:
现在有一个操作商品的接口,有个字段type,传1的时候代表修改商品,商品id、商品名称、价格有一个是必传的,type传2的时候是删除商品,商品id是必传的,这样的,就要测参数组合了,type传1的时候,只传商品名称能不能修改成功,id、名称、价格都传的时候能不能修改成功。
接口安全:
1、绕过验证,比如说购买了一个商品,它的价格是300元,那我在提交订单时候,我把这个商品的价格改成3元,后端有没有做验证,更狠点,我把钱改成-3,是不是我的余额还要增加?
2、绕过身份授权,比如说修改商品信息接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,我传一个其他的卖家能不能修改成功
3、参数是否加密,比如说我登陆的接口,用户名和密码是不是加密,如果不加密的话,别人拦截到你的请求,就能获取到你的信息了,加密规则是否容易破解。
4、密码安全规则,密码的复杂程度校验
异常验证:
所谓异常验证,也就是我不按照你接口文档上的要求输入参数,来验证接口对异常情况的校验。比如说必填的参数不填,输入整数类型的,传入字符串类型,长度是10的,传11,总之就是你说怎么来,我就不怎么来,其实也就这三种,必传非必传、参数类型、入参长度。
性能测试
接口并发情况,如上面提到的:一个账号,同时(大于2个请求)对最后一个商品下单,或不同账号,对最后一个商品下单接口响应时间,响应时间太长了,肯定需要优化,一般都是毫秒级别
面试题3:平常用什么工具测接口的
接口测试工具很多
1、postman
2、jmeter
3、apipost
面试题4:webService接口是如何测试的
webService接口用SoapUI
面试题5:没有接口文档,如果做接口测试?(这是个送命题)
没有接口文档,那还能咋办,瞎测呗!一个公司的开发流程里面,如果接口文档都没有,是无法展开接口测试的,你都不知道这个接口干什么的,也不知道具体每个字段代表什么意思,那还测啥呢?
当然,你肯定不能回答面试官不测(心理mmp,脸上笑嘻嘻),接下来就是扯犊子时间
1.没有接口文档,那就需要先跟开发沟通,然后整理接口文档(本来是开发写的,没办法,为了唬住面试官,先说自己整理了)
2.没有接口文档,可以抓包看接口请求参数,然后不懂的跟开发沟通
本题主要靠情商,通俗来说就是忽悠能力,先唬住面试官了再说,进去了也是瞎测测,随时做好背锅的准备
面试题6:在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?
1、手工测试中,用postman使用Tests中的set a global variable生成全局变量或者set an environment variable生成系统变量,后续直接引用这个变量值;用jmeter则使用后置处理器的正则表达式提取器、边界值提取器、json提取器提取,后续引用该变量值。
2、自动化测试中,通常会把接口响应的数据提取出来赋值给一个变量,后续直接调取该变量的值就可以使用。
用一个全局变量来处理依赖的数据,比如登录后返回token,其它接口都需要这个token,那就用全局变量来传token参数
面试题7:依赖于第三方数据的接口如何进行测试?
这个标准答案是:mock
接着面试官会问你,如果mock的,然后你就顺着坑继续挖,搭建mock服务,参考这篇【https://www.cnblogs.com/lc-blogs/p/17027617.html】
面试题8:当一个接口出现异常时候,你是如何分析异常的?
1.抓包,用fiddler工具抓包,或者浏览器上f12,app上的话,那就用fiddler设置代理,去看请求报文和返回报文了
2.查看后端日志,xhell连上服务器,查看日志
面试题9:如何模拟弱网测试
fiddler和charles都可以模拟弱网测试,平常说的模拟丢包,也是模拟弱网测试
分析bug是前端还是后端的
面试题10:如何分析一个bug是前端还是后端的?
平常提bug的时候,前端开发和后端开发总是扯皮,不承认是对方的bug
这种情况很容易判断,先抓包看请求报文,对着接口文档,看请求报文有没问题,有问题就是前端发的数据不对
请求报文没问题,那就看返回报文,返回的数据不对,那就是后端开发的问题咯
面试题11:GET与POST的区别?
(1)GET请求资源数据,POST向服务器传递需要处理的数据
(2)GET传递数据大小不超过2083字节(2K+35),POST没有限制(Tomcat默认2M)
(3)GET请求的参数会在Url上暴露显示,POST请求参数在Requestbody里,所以相对GET来说,POST安全性较高
(4)GET 请求的静态资源会被浏览器缓存,POST不会被缓存
(5)GET传递的数据类型是文本,POST是文本或者二进制
(6)GET请求被回退时是无害的,POST请求被回退是会被重新再执行一次
GET和POST的使用场景:
(1)在传递一些机密信息时必须要使用POST
(2)只是查询获取数据时可以用GET
(3)POST请求速率会比GET慢,因为GET请求产生一个TCP数据包;POST请求产生两个TCP数据包
面试题12:说说接口测试的流程和接口自动化流程,介绍一下request有哪些内容?
(1)流程:获取接口文档,依据文档设计接口参数,获取响应,解析响应,校验结果,判断测试是否通过。
(2)request 内容:
1,封装了get、post等;
2、以关键字参数的方式,封装了各类请求参数,params、data、headers、token、
cookie等;
3,封装了响应内容,status_code、json()、cookies、url等;
session会话对象,可以跨请求;
面试题13:接口测试用例的编写要点有哪些?
1)必填字段:请求参数必填项、可选项
2)合法性:输入输出合法、非法参数
3)边界:请求参数边界值等
4)容错能力:大容量数据、频繁请求、重复请求(如:订单)、异常网络等的处理
5)响应数据校验:断言、数据提取传递到下一级接口…
6)逻辑校验:如两个请求的接口有严格的先后顺序,需要测试调转顺序的情况
7)性能:对接口模拟并发测试,逐步加压,分析瓶颈点
8)安全性:构造恶意的字符请求,如:SQL注入、XSS、敏感信息、业务逻辑
(如:跳过某些关键步骤;未经验证操纵敏感数据)
面试题14:postman的使用方式?高级用法?
1,基础使用:入参出参校验返回;
2,Environment:配置不同的环境参数,Globals:设置全局变量,Pre-request Script:配置使用环境变量或进行前置脚本处理;
3,团队可以更好地并行工作,前后端人员只需要定义好接口文档就可以开始并行工作,互不影响,只在最后的联调阶段往来密切;
面试题15:jmeter上一个接口参数返回值做为下一个接口入参的实现方式有几种,举例?
(1)正则表达式处理器
(2)JSON Path Extractor
(3)边界值提取器
面试题16:接口自动化中,遇到签名、鉴权加密等,如何处理的,用到哪些方法?
比如MD5加密–hashlib内置库,看怎么回答怎么具体问:开放性。
面试题17:不可逆的操作,如何处理,比如删除一个订单这种接口如何测试?
此题考的是造数据的能力,接口的请求数据,很多都是需要依赖前面一个状态的
比如工作流这种,流向不同的人状态不一样,操作权限不一样,测试的时候,每种状态都要测到,就需要自己会造数据了。
平常手工测试造数据,直接在数据库改字段状态。那么自动化也是一样,造数据可以用python连数据库了,做增删改查的操作
测试用例前置操作,setUp做数据准备
后置操作,tearDown做数据清理
面试题18:你之前自动化测试的数据放哪?怎么使用?公共变量的管理方式?
1.对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写的配置文件里(如ini)
2.对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成
3.对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,excel都可以
4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理
5.对于邮箱配置的一些参数,可以用ini配置文件
6.对于全部是独立的接口项目,可以用数据驱动方式,用excel/csv管理测试的接口数据
7.对于少量的静态数据,比如一个接口的测试数据,也就2-3组,可以写到py脚本的开头,十年八年都不会变更的。