1、测试时接口调不通,如何去排查?
1)、首先检查测试环境配置是否有问题(端口占用、防火墙没有关闭、开发没有在后台加路由)、测试数据是否有问题(不要使用旧的数据)
2)、通过fiddler抓包,分析请求和响应的数据是否有问题
3)、查看应用服务器是否启动
4)、进去数据库查看数据是否有错误
先检查接口 ip 是否正确,可以通过在本机 ping 接口的 ip,检查网络是否通畅
再检查接口的端口号是否正确,可以通过在本机 telnet 接口的 ip 和端口号,检查端口是否能连通
检查项目是否启动或者部署成功,可以找研发确认,或者自己登录到服务器上,通过 ps 命令检查项目的进程是否存在,然后用 tail 命令查看部署日志
检查服务器防火墙是否关闭,如果因为安全或者权限问题不能关闭,需要找运维进行策略配置,开放对应的 ip 和端口号
检查你的客户端(浏览器/测试工具),是否设置了网络代理,网络代理可能会造成请求失败
检查操作系统的 host 文件,是否绑定了一个错误的 ip 映射
接口有响应但是返回了错误的状态码
有些时候接口会返回一些错误的 HTTP 状态码,需要根据不同的状态码来确定具体的原因。
排查思路
400:客户端请求错误,比如请求参数格式错误(如 json 字符串不合法)
401:未授权,比如在请求 header 里,缺乏必要的信息头(如 token、auth 等字段)
403:禁止,常见的原因是用户的账号没有对应的 url 权限,还有就是项目所用的中间件,不允许远程访问(比如 Apache)
404:资源未找到,导致这种情况的原因很多,比如:url 写错了url 后有空格 项目没有启动成功 请求协议不对,如 http/https
405:方法不允许,常见的原因是请求方式不正确,比如 GET 类型接口,使用 POST 方式去请求
415:不支持的媒体类型,常见原因是请求数据的类型和服务端支持的类型不匹配,比如 json 接口,需要添加一个信息头 Content-type:application/json
500:服务器内部错误,出现这种情况,说明服务端内部报错了,需要登录到服务器上,检查错误日志,根据具体的提示信息再进行排查
502/503/504(Bad Gateway/错误的网关、Service Unavailable/服务无法获得、Gateway Timeout/网关超时)
如果单次调用接口就报该错误,说明是后端服务器配置有问题,或者服务不可用,挂掉了
如果并发压测时出现此错误,说明是后端压力太大,出现异常,此问题一般是后端出现了响应时间过长或者无响应造成的
2、同步接口与异步接口区别?
1)同步接口:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;
2)异步接口:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待,立即返回,
实际任务并没有真正完成,异步接口有个回调地址,发送完请求,服务器处理完成,服务器会调用回调地址
3)异步关注点:关注服务器对请求处理是不是正确
请求处理完,回调结果是不是正确
4)异步 接口 通常发生在一些比较慢的操作上,比如数据库 I/O、消息队列 I/O 等,此时测试往往需要去验证数据库中的值、消息队列中的值
3、常见的HTTP请求方式有哪些?
GET
:发送一个请求来获取服务器上的某一资源,多用于查询数据(如列表查询);
POST
:将数据添加到服务器中的现有文件或资源(如提交表单或者上传文件),POST 请求可能会导致新的资源的建立或已有资源的修改;
HEAD
:响应与GET请求相同,但没有响应正文;
PUT
:替换服务器中的现有文件或资源,多用于向指定资源位置上传最新内容(如修改评价或笔记);
DELETE
:从服务器中删除数据(如取消收藏或删除评价);
PATCH
:是对 PUT 方法的补充,用于对资源进行局部更新;
OPTIONS
:用于描述目标资源的通信选项;
CONNECT
:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器;
TRACE
:回显服务器收到的请求,主要用于测试或诊断;
2.GET请求与POST请求的区别?
1.提交数据的形式
:
• GET方法一般是指获取服务器上的数据,通过地址栏传输,请求参数(query string查询字符串)直接跟着URL后,以?分割URL和传输数据,参数之间以&相连(?name=coco&pwd=123)的形式,直接可以放到浏览器地址栏里,如登录就是采用GET方法(name=coco&password=123&verify=%E4%BD%A0%E5 %A5%BD)。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4 %BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
• POST方法是指客户端给服务器上提交表单数据,通过报文传输,会把数据放到请求数据字段中以&分隔各个字段,请求行不包含数据参数,地址栏也不会额外附带参数,所以POST是通过表单提交的,请求参数放在body中,如网页上的新用户的注册、调查问卷和答题就是采用POST方法。
2.提交数据的大小/长度
:
• GET是直接在浏览器地址栏输入,直接影响到了URL的长度,但HTTP协议规范中其实是没有对URL限制长度的,限制URL长度的是客户端或服务器的支持的不同所影响:比如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。由于浏览器有限制,一般整个URL的长度可以很长,但是不能超过2049KB的大小限制,而POST没有大小限制。
• POST方式HTTP协议规范中也没有限定,起限制作用的是服务器的处理程序的处理能力。所以大小的限制还是得受各个web服务器配置的不同而影响。
3.提交数据的安全性
:
• 由于GET的参数是在浏览器地址栏URL直接拼接,用户名和密码将明文出现在URL上,暴露在互联网中,安全性差,不能用来传递敏感信息。
• POST请求参数放在Body里,是通过表单数据提交,POST比GET方式的安全性要高;
4.编码方式
:
• GET的参数只能支持ASCII;
• POST没有限制,也允许二进制数据;
5.请求方式
:
• GET是获取指定的资源 ;
• POST是向指定的资源提交要被处理的数据 ;
6.请求体
:
• GET没有请求体;
• POST有请求体;
7.效率方面
:
• GET产生一个TCP数据包;
• POST产生两个TCP数据包,POST需要两步,时间上消耗要多一点,GET比POST更有效;
8.请求过程
:
• 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
• POST方式的请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok;
3.HTTP请求特点?
1.基于请求/响应,支持客户端/服务器模式
:客户端发送请求,服务器端响应数据。客户端向服务器请求服务时,只需要传送请求的方法和路径即可。常用的请求方法有GET(查)、POST(增),除此之外还有PUT(改)、DELETE(删)等,每种方法规定的客户端与服务器联系的方式不同,日常工作中见到的最多的是GET和POST两种。
2.基于TCP/IP协议之上的应用层协议,简单灵活
:HTTP简单,服务器的程序规模小,通信速度快;HTTP使用TCP作为它的支撑运输协议,HTTP客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器(客户机)和服务器进程就可以通过套接字接口访问TCP,HTTP运行传输任意类型的数据对象。
3.无状态
:协议对于事务处理没有记忆能力,客户端第一次与服务器建立连接发送请求时需要进行一系列的安全认证匹配等,因此增加页面等待时间,当客户端向服务器端发送请求,服务器端响应完毕后,两者断开连接,也不保存连接状态(一刀两断,恩断义绝,从此路人),下一次客户端向同样的服务器发送请求时,由于他们之前已经遗忘了彼此,所以需要重新建立连接。
4.无连接
:限制每次连接,使其只处理一个请求。服务器处理完客户端的请求并收到客户端的应答后,即断开连接,这种方式可以节省传输时间。
4.Cookie和Session的区别?
1.存储位置不同
:Cookie是将用户数据通过加密的方式保存在客户端,大多数情况Cookie存储在浏览器;Session是用于控制客户端和服务端的连接,Session存储在服务器;
2.存储容量不同
:单个Cookie保存的数据不得超过4kb,一个站点最多20个Cookie,Session一般情况下没有上限,不过建议不要存放太多东西,否则影响性能;
3.存取方式不同
:Cookie只能用ASCII字符串,通过编码方式获取Unicode字符或者二进制数据,不好存储复杂的信息,而Session能存储任何类型的数据;
4.隐私策略/安全性不同
:Cookie放在客户端,可以进行Cookie欺骗,所以不安全,Session放在服务端,更加安全;
5.有效期不同
:Cookie可以设置属性达到长期有效,Session依赖于JSESSIONID的Cookie,Cookie JSESSIONID的过期时间默认为-1,只需要关闭窗口Session就会失效,就算不依赖Cookie,用UrL重写也不能完成,如果Session超时时间过长,容易导致内存溢出;
6.服务器压力不同
:Cookie保存在本地,不存在服务端压力,Session保存在服务端,每个用户产生一个Session,当访问增多,会比较占用服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用Cookie;
7.浏览器支持不同
:如果浏览器禁用Cookie,那么Cookie直接失效,Session比较好点,可以用URL重写;
8.Cookie和Session应用的场景
:Cookie一般用于记住用户的登录状态,如记录用户的习惯,购物车;而Session用于登录验证。
5.HTTP和HTTPS的区别?
HTTP
协议传输的数据是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,SSL(SecureSocketsLayer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS
协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要如下:
-
HTTPS协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
-
HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的ssl加密传输协议。
-
HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
-
HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
6.你所知道的HTTP状态码?
• 1xx
:指示信息/参考信息(Info)——表示服务器收到请求,需要请求者继续执行操作;
• 2xx
:成功(Successful)——表示请求已被成功接收、理解、接受;
• 3xx
:重定向(Redirection)——要完成请求必须进行更进一步的操作;
• 4xx
:客户端错误(Client Error)——表示请求可能有语法错误或请求无法实现,妨碍了服务器的处理;
• 5xx
:服务器端错误(Server Error)——表示服务器在处理请求的过程中发生了内部错误,未能实现合法的请求;
常见状态码:
• 200:成功(OK )——服务器已成功处理了请求;
• 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
• 202 Aceepted - []:表示一个请求已经进入后台排队(异步任务)
• 204 NO CONTENT - [DELETE]:用户删除数据成功
• 301:永久移动(Moved Permanently)——请求永久重定向,请求的页面已永久移动到新位置;
• 302:临时移动(Found )——请求临时重定向, 服务器目前从不同位置的网页响应请求,资源只是临时被移动,但请求者应继续使用原有URL来进行以后的请求;
• 304 :未修改(Not Modified)——文件未修改,可以直接使用缓存的文件;
• 400 :错误请求(Bad Request )——由于客户端请求有语法错误,不能被服务器所理解;
• 401 :未授权(Unauthorized)——请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用;
• 403:禁止(Forbidden)——服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因;
• 404:未找到(Not Found )——请求的资源不存在,例如,输入了错误的URL;
• 500 :服务器内部错误( Internal Server Error )——服务器发生不可预期的错误,导致无法完成客户端的请求;
• 502:服务器作为网关或代理,从上游服务器收到了无效的响应
• 503 : 服务不可用(Service Unavailable )——服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常;
7.你所知道的常见接口类型有哪些?
-
HTTP接口
:基于超文本传输协议(HyperText Transfer Protocol HTTP)开发的接口,是应用最广泛的网络协议之一,但并不排除没有使用其他协议。基于浏览器/服务器(Brower/Server)的软件系统大多数为HTTP接口 -
Web Service接口
:系统对外的接口,根据提供的方法引用提供的接口,从而获取数据; -
RESTful接口
:简称REST,描述了一个架构式的网络系统;
8.常见的HTTP Header及其作用?
-
Accept:用于告诉服务器,客户机支持的数据类型 (例如:Accept:text/html,image/、image/webp,/*);
-
Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式;
-
Accept-Language:客户机语言环境;
-
Accept-Charset:用于告诉服务器,客户机采用的编码格式;
-
Connection:告诉服务器,请求完成后,是否保持连接;
-
Cookie:客户机通过这个头,将Cookie信息带给服务器;
-
Host:客户机通过这个服务器,想访问的主机名;
-
Referer:客户机通过这个头告诉服务器,它(客户端)是从哪个资源来访问服务器的(防盗链);
-
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间;
-
User-Agent:客户机通过这个头告诉服务器,客户机的软件环境(操作系统,浏览器型号和版本等);
-
Date:告诉服务器,当前请求的时间;
9.列举API测试中使用的一些常用协议?
-
Thrift、HTTP、REST、SOAP、JMS、UDDI、Dubbo
10.你所知道的较常用的API文档模板?
-
Swagger、FlatDoc、RestDoc、API blueprint、Slate、Miredo
11、请问你们公司是如何做接口测试的?
接口测试实际跟一般功能测试不同就是测试用例的设计部分。接口测试步骤可概括如下:
- 获取接口文档。
- 设计接口测试功能用例(主要从用户角度出发看接口能否实现业务需求,用例设计就是黑盒用例那一套)。
- 各种入参验证(正常情况,异常情况包括输入参数个数不对,类型不对,可选/必选,还有考虑参数有互斥或关联的情况)。
- 接口返回值各种验证(符合接口文档需求)。
- 了解接口实现逻辑,实现逻辑覆盖(语句/条件/分支/判定/…)。
- 接口能并发执行吗、安全吗,性能满足要求吗?
- 采用工具或者自写代码来验证。
- 发现问题跟功能测试一样,该报 bug 报 bug,该跟踪状态的跟踪状态。
12、你平常做接口测试的过程中发现过哪些 bug?
接口测试中发现的 bug 类型有如下几种:
- 常规错误,接口没实现,没按约定返回结果,边界值处理出错等。输入异常值(空值、特殊字符、null、nana、超过约定长度等),接口抛错,没做封装处理;输入错误的参数、多输入、少输入参数;
- 接口可能出现的错误,安全性问题,如明文传输、返回结果含有敏感信息,没对用户身份信息做校验,没做恶意请 求拦截等;
- 性能问题,如接口并发插入多条相同操作,响应时间过长,接口压测出现瓶颈等。
13、接口测试怎么测?
接口测试可从以下几个方面入手:
- 通过性验证:首先肯定要保证这个接口功能是好使的,也就是正常的通过性测试,按照接口文档上的参数,正常传入,是否可以返回正确的结果。
- 参数组合:
1)现在有一个操作商品的接口,有个字段 type,传 1 的时候代表修改商品,商品 id、商品名称、价格有一个是必传的,type 传 2 的时候是删除商品,
2)商品 id 是必传的,这样的,就要测参数组合了,type 传 1 的时候,只传商品名称能不能修改成功,id、名称、价格都传的时候能不能修改成功。
- 接口安全:
1)绕过验证,比如说购买了一个商品,它的价格是 300 元,那我在提交订单时候,我把这个商品的价格改成 3 元,后端有没有做验证,更狠点,我把钱改成-3,是不是我的余额还要增加?
2)绕过身份授权,比如说修改商品信息接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,我传一个其他的卖家能不能修改成功
3)参数是否加密,比如说我登陆的接口,用户名和密码是不是加密,如果不加密的话,别人拦截到你的请求,就能获取到你的信息了,加密规则是否容易破解。
4)密码安全规则,密码的复杂程度校验。
- 异常验证:
所谓异常验证,也就是我不按照你接口文档上的要求输入参数,来验证接口对异常情况的校验。比如说必填的参数不填,输入整数类型的,传入字符串类型,长度是 10 的,传 11,总之就是你说怎么来,我就不怎么来,其实也就这三种,必传非必传、参数类型、入参长度。
- 性能测试:
接口并发情况,如上面提到的:一个账号,同时(大于 2 个请求)对最后一个商品下单,或不同账号,对最后一个商品下单。
接口响应时间,响应时间太长了,肯定需要优化,一般都是毫秒级别。
14、测试的数据你放在哪?
测试的数据是不能写死到代码里面的,这个是原则问题,也是写代码的大忌(你要是回答写在代码里面,估计就是回去等通知)。
测试数据放到.py 的开头。(这种其实很方便,对于少量的,固定不变的数据其实是可以放的,但是面试时候,千万不能这样说,面试官喜欢装逼的方法。)
测试数据存放总结:
对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写的配置文件里(如 ini);
对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成;
对于一个接口有多组测试的参数,可以参数化,数据放 yaml,text,json,excel 都可以;
对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理;
对于邮箱配置的一些参数,可以用 ini 配置文件;
对于全部是独立的接口项目,可以用数据驱动方式,用 excel/csv 管理测试的接口数据;
对于少量的静态数据,比如一个接口的测试数据,也就 2-3 组,可以写到 py 脚本的开头,十年八年都不会变更的;
总之不同的测试数据,可以用不同的文件管理。
15、没有接口文档,如果做接口测试?
一个公司的开发流程里面,如果接口文档都没有,是无法展开接口测试的,当然,你肯定不能回答面试官不测。可以这样回答:
- 没有接口文档,那就需要先跟开发沟通,然后整理接口文档(本来是开发写的,没办法,为了唬住面试官,先说自己整理了);
- 没有接口文档,可以抓包看接口请求参数,如果有不懂的及时跟开发沟通;
- 还有一些接口请求会保存在数据库中,可以请开发协助