💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] <details> <summary>一、为什么要做接口测试?</summary> <br /> 到底什么是接口测试,我们为什么要做接口测试?这是很多初入行的小伙伴的一个疑问,讲理论的你可能看不进去,接下来讲个实际案例,如下图一个提现功能 ![](https://box.kancloud.cn/f5521d47d7f95cd18b6df1eaab4e5edc_358x225.png) 比如这个输入框,平常拿到这个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页面,直接发请求提交了呢? 纳尼!!!不通过页面也能提交。。。这就是我们接下来要提到的接口测试了。 </details> <br /> <details> <summary>二、你平常做接口测试的过程中发现过哪些bug?</summary> <br /> 这个问题其实回到起来很简单,只要做过接口测试的,总能发现几个BUG吧,把你平常发现的bug说2-3个就可以了。 面试官出这个题,主要是想知道你是不是真的做过接口测试,毕竟现在很多小伙伴简历都是写的假的(你要不写估计面试机会都没有,没办法,为了生存,能理解) 比如上面说的,提现输入框,在页面上输入负数,肯定是无法提交过去(前端页面会判断金额),如果我不走前端,直接用接口工具发请求,输入一个负数过去。 (假设服务端没做提现金额数据判断) 余额=当前余额(100)-提现金额(-100),那么提现-100,余额就变成200了,也就是越提现,余额越大了 **可以用接口工具去直接请求接口,也可以fiddler抓包,抓到接口后修改金额为负数** 所以,接口测试的必要性就体现出来了: 1.可以发现很多在页面上操作发现不了的bug 2.检查系统的异常处理能力 3.检查系统的安全性、稳定性 4.前端随便变,接口测好了,后端不用变 5.可以测试并发情况,一个账号,同时(大于2个请求)对最后一个商品下单,或不同账号,对最后一个商品下单 6.可以修改请求参数,突破前端页面输入限制(如金额) </details> <br /> <details> <summary>三、平常你是怎么测试接口的?</summary> <br /> **通过性验证:** 首先肯定要保证这个接口功能是好使的,也就是正常的通过性测试,按照接口文档上的参数,正常传入,是否可以返回正确的结果。 **参数组合:** 现在有一个操作商品的接口,有个字段type,传1的时候代表修改商品,商品id、商品名称、价格有一个是必传的,type传2的时候是删除商品, 商品id是必传的,这样的,就要测参数组合了,type传1的时候,只传商品名称能不能修改成功,id、名称、价格都传的时候能不能修改成功。 **接口安全:** 1、绕过验证,比如说购买了一个商品,它的价格是300元,那我在提交订单时候,我把这个商品的价格改成3元,后端有没有做验证,更狠点,我把钱改成-3,是不是我的余额还要增加? 2、绕过身份授权,比如说修改商品信息接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,我传一个其他的卖家能不能修改成功 3、参数是否加密,比如说我登陆的接口,用户名和密码是不是加密,如果不加密的话,别人拦截到你的请求,就能获取到你的信息了,加密规则是否容易破解。 4、密码安全规则,密码的复杂程度校验 **异常验证:** 所谓异常验证,也就是我不按照你接口文档上的要求输入参数,来验证接口对异常情况的校验。比如说必填的参数不填,输入整数类型的,传入字符串类型,长度是10的,传11,总之就是你说怎么来,我就不怎么来,其实也就这三种,必传非必传、参数类型、入参长度。 **性能测试:** 接口并发情况,如上面提到的:一个账号,同时(大于2个请求)对最后一个商品下单,或不同账号,对最后一个商品下单 接口响应时间,响应时间太长了,肯定需要优化,一般都是毫秒级别 ![](https://img.kancloud.cn/7a/2d/7a2d746eb19823ec70acba6305173d17_808x883.png) </details> <br /> <details> <summary>四、平常用什么工具测接口的</summary> <br /> **接口测试工具很多,首先postman** ![](https://img.kancloud.cn/5c/8a/5c8a249272c1b118f7b9533587a515f8_899x284.png) **其次用jmeter** ![](https://img.kancloud.cn/17/26/17269da26cbf0a89a0ce6c620ae42e3d_904x400.png) ![](https://img.kancloud.cn/45/e6/45e63c8f8393fd3363b01e396c7348de_907x203.png) </details> <br /> <details> <summary>五、webService接口是如何测试的</summary> <br /> **webService接口用SoapUI** ![](https://img.kancloud.cn/89/1d/891d85a4826b111638573f083fdccf9f_905x491.png) </details> <br /> <details> <summary>六、没有接口文档,如果做接口测试?</summary> asdsadasd </details> <br /> <details> <summary>七、在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?</summary> <br /> 没有接口文档,那还能咋办,瞎测呗!一个公司的开发流程里面,如果接口文档都没有,是无法展开接口测试的,你都不知道这个接口干什么的,也不知道具体每个字段代表什么意思,那还测啥呢? --当然,你肯定不能回答面试官不测(心理mmp,脸上笑嘻嘻),接下来就是扯犊子时间 **1.没有接口文档,那就需要先跟开发沟通,然后整理接口文档(本来是开发写的,没办法,为了唬住面试官,先说自己整理了) 2.没有接口文档,可以抓包看接口请求参数,然后不懂的跟开发沟通** 本题主要靠情商,通俗来说就是忽悠能力,先唬住面试官了再说,进去了也是瞎测测,随时做好背锅的准备 </details> <br /> <details> <summary>八、在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?</summary> ``` 用一个全局变量来处理依赖的数据,比如登录后返回token,其它接口都需要这个token, 那就用全局变量来传token参数 ``` </details> <br /> <details> <summary>九、依赖于第三方数据的接口如何进行测试?</summary> <br /> 这个标准答案是:mock 接着面试官会问你,如果mock的,然后你就顺着坑继续挖,搭建mock服务,参考下面这篇【 mock-server之moco】\[【[https://www.cnblogs.com/yoyoketang/p/9348552.html】](https://www.cnblogs.com/yoyoketang/p/9348552.html%E3%80%91)\] * * * **前言** mock除了用在单元测试过程中,还有一个用途,当前端开发在开发页面的时候,需要服务端提供API接口 此时服务端没开发完成,或者说没搭建测试环境,这个时候前端开发会自己mock一个api服务端,自己给自己提供调用接口的返回数据 mock-server用途就是开发在开发的过程中,需要依赖一部分的接口,但是对方没有提供或者环境等等情况 **环境准备** * 1.moco-runner-0.12.0-standalone.jar * 2.java 版本1.8.0\_20 **Moco环境搭建** 1.moco是一个开源的框架,在github上可以下载到,[github源码地址](https://github.com/dreamhead/moco) 目前最新版是moco-runner-0.12.0-standalone.jar,[【点这里下载】](http://central.maven.org/maven2/com/github/dreamhead/moco-runner/0.12.0/moco-runner-0.12.0-standalone.jar) 2.下载完成后,保存到电脑本地的一个目录,然后在同一目录下新建一个yoyo.json文件,里面写入如下内容: ![](https://images2018.cnblogs.com/blog/1070438/201807/1070438-20180722214156818-1965096606.png) ~~~ [ { "response" : { "text" : "Hello World! yoyoketang" } } ] ~~~ 3.接下来启动moco服务,打开moco-runner-0.12.0-standalone.jar所在的文件夹目录(E:\\moco),地址栏左上角输入cmd,回车打开cmd窗口 > java -jar moco-runner-0.12.0-standalone.jar http -p 6666 -c yoyo.json ![](https://images2018.cnblogs.com/blog/1070438/201807/1070438-20180722214502559-744357518.png) 出现如下结果就是启动成功了 ~~~ E:\moco>java -jar moco-runner-0.12.0-standalone.jar http -p 6666 -c yoyo.json 22 七月 2018 21:44:36 [main] INFO Server is started at 6666 22 七月 2018 21:44:37 [main] INFO Shutdown port is 62459 ~~~ 4.打开火狐浏览器(谷歌浏览器貌似打不开)地址栏输入:[http://localhost:6666/](http://localhost:6666/)看到如下界面,说明mock-server环境搭建成功 ![](https://images2018.cnblogs.com/blog/1070438/201807/1070438-20180722215306573-938017371.png) **遇到的问题** 1.刚开始jdk版本是1.6的,启动一直报错,报错信息如下:Unsupported major.minor version 51.0 ![](https://images2018.cnblogs.com/blog/1070438/201807/1070438-20180722215359540-424925543.png) 2.百度搜了下,找到问题原因了,jdk版本和jar包不匹配导致。比如本机的JDK为1.6,但是项目编译时用的JDK为1.7那么就会出现这个异常, 因为本机JDK版本较低不能执行编译版本为高版本的Class文件,各JDK版本对应的错误编号如下: J2SE 8 = 52, J2SE 7 = 51, J2SE 6.0 = 50, J2SE 5.0 = 49, JDK 1.4 = 48, JDK 1.3 = 47, JDK 1.2 = 46, JDK 1.1 = 45 **官方文档** 1.更多参考资料,查阅官方文档,[【点这里查看官方文档】](https://github.com/dreamhead/moco) ![](https://img.kancloud.cn/f8/a6/f8a60d8d9c63c232ad1f949689f2e4ca_1068x574.png) </details> <br /> <details> <summary>十、当一个接口出现异常时候,你是如何分析异常的?</summary> <br /> 1.抓包,用fiddler工具抓包,或者浏览器上f12,app上的话,那就用fiddler设置代理,去看请求报文和返回报文了 2.查看后端日志,xhell连上服务器,查看日志 </details> <br /> <details> <summary>十一、如何模拟弱网测试</summary> <br /> fiddler和charles都可以模拟弱网测试,平常说的模拟丢包,也是模拟弱网测试 </details> <br /> <details> <summary>十二、如何分析一个bug是前端还是后端的?</summary> <br /> 平常提bug的时候,前端开发和后端开发总是扯皮,不承认是对方的bug 这种情况很容易判断,先抓包看请求报文,对着接口文档,看请求报文有没问题,有问题就是前端发的数据不对 请求报文没问题,那就看返回报文,返回的数据不对,那就是后端开发的问题咯 </details> <br />