2W字诚意满满的新活:常见接口测试69道面试题,附带答案

释放双眼,带上耳机,听听看~!

最近发现面试题热度 挺好的,不过大家博客都只有面试题,从来都不带答案,顺手就码了点收集到的博客问题的答案

共69道,2W字,耗时两天(疯狂暗示)在这里插入图片描述欢迎催更吹水,来一个人就是一份催更动力

1. 按你的理解,软件接口是什么?

答:
就是指程序中具体负责在不同模块之间传输或接受数据的并做处理的类或者函数。

2.HTTP 和 HTTPS 协议区别?

答:
https 协议需要到 CA(Certificate Authority,证书颁发机构)申请证书,一般免费证书
较少,因而需要一定费用;
http 是超文本传输协议,信息是明文传输,Https 协议是由 SSL+Http 协议构建的可进行加
密传输、身份认证的网络协议,比 http 协议安全;
http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443;

3.HTTPS 在哪一层?

以前我面试很喜欢提网络协议的问题,有朋友说我装 X,不实用。稍有点研究网络知识,实
际就不难回答
答:HTTPS 在应用层。

4.get 和 post 区别是什么?

答:POST 和 GET 都是向服务器提交数据,并且都会从服务器获取数据。
区别:
1)传送方式:get 通过地址栏传输,post 通过报文传输
2)传送长度:get 参数有长度限制(受限于 url 长度),而 post 无限制
3)GET 产生一个 TCP 数据包(对于 GET 方式的请求,浏览器会把 http header 和 data 一并
发送出去,服务器响应 200 返回数据),POST 产生两个 TCP 数据包(对于 POST,浏览器先
发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok 返回数
据)
4)get 请求参数会被完整保留在浏览历史记录里,而 post 中的参数不会被保留
5)在做数据查询时,建议用 GET 方式;而在做数据添加、修改或删除时,建议用 post 方式

5.常见的 POST 提交数据方式

答:
主要有四种方式:application/x-www-form-urlencoded、multipart/form-data、 application/json、text/xml 等。

6.什么是 Http 协议无状态协议?怎么解决 HTTP 协议无状态协议

答:
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。
即我们给服 务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会 记录任何信息。
HTTP 是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive 没能 改变这个结果。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导 致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP 协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成 不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。
客户端与服务器进行动态 交互的 Web 应用程序出现之后,HTTP 无状态的特性严重阻碍了这些应用程序的实现,毕竟
交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。
于是, 两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是Session。

7.cookie 和 session 的区别

答:
cookie 数据存放在客户的浏览器上,session 数据放在服务器上 cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全 应当使用 session

session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑 到减轻服务器性能方面应当使用 cookie

单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie 可以将登陆信息等重要信息存放为 session;其他信息需要保存,可以放在 cookie

8.请求接口中常见的返回状态码

答:1xx – 信息提示(表示临时的响应。客户端在收到常规响应之前,准备接收一个或多个 1xx
响应)
2xx – 成功(表明服务器成功地接受了客户端请求)
3xx – 重定向(客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请
求服务器上的不同的页面,或通过代理服务器重复该请求)
4xx – 客户端错误(发送错误,客户端有问题。例如,客户端请求不存在的页面,客户端
未提供有效的身份证验证信息)
5xx – 服务器错误(服务器由于遇到错误而不能完成该请求)
常见的返回码有:
200 OK - [GET]:服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功
202 Aceepted - []:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行 新建或修改数据的操作
401 Unauthorized -[
] :表示用户没有权限(令牌、用户名、密码错误)
403 Forbidden -[] :表示用户得到授权(与 401 错误相对),但是访问被禁止
404 NOT FOUND -[
]:用户发出的请求针对得到是不存在的记录,服务器没有进行操作, 该操作是幂等的
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求 JSON 格式,但 是只有 XML 格式)
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是

9.什么是 DNS?

答:DNS 是域名系统 (Domain Name System),DNS 是用来做域名解析的,它会在你上网输入
网址后,把它转换成 IP,然后去访问对方服务器;没有它,你想上百度就要记住百度的 IP,
但有了 DNS 的处理,你只需要记住对应网站的域名,即网址就可以了。

10.请问你们公司是如何做接口测试的?

答:
接口测试实际跟一般测试不同就是测试用例的设计部分。
①获取接口规范。
②设计接口测试功能用例(主要从用户角度出发看接口能否实现业务需求,用例设计就是黑
盒用例那一套)。
③各种入参验证(正常情况,异常情况包括输入参数个数不对,类型不对,可选/必选,还 有考虑参数有互斥或关联的情况)。
④接口返回值各种验证(符合接口文档需求)
⑤了解接口实现逻辑,实现逻辑覆盖(语句/条件/分支/判定/…)
⑥接口能并发执行吗、安全吗,性能满足要求吗?
⑦采用工具或者自写代码来验证。
⑧发现问题跟功能测试一样,该报 bug 报 bug,该跟踪状态的跟踪状态。

11.怎么设计接口测试用例?

答:
通常,设计接口测试用例需要考虑以下几个方面:
①是否满足前提条件
有些接口需要满足前提,才可成功获取数据。常见的,需要登录 Token
逆向用例:针对是否满足前置条件(假设为 n 个条件),设计 0~n 条用例
②是否携带默认值参数
正向用例:带默认值的参数都不填写、不传参,必填参数都填写正确且存在的“常规”值,
其他不填写,设计 1 条用例
③业务规则、功能需求
这里根据时间情况,结合接口参数说明,可能需要设计 N 条正向用例和逆向用例
④参数是否必填
逆向用例:针对每个必填参数,都设计 1 条参数值为空的逆向用例
⑤参数之间是否存在关联
有些参数彼此之间存在相互制约的关系
⑥参数数据类型限制
逆向用例:针对每个参数都设计 1 条参数值类型不符的逆向用例
⑦参数数据类型自身的数据范围值限制
正向用例:针对所有参数,设计 1 条每个参数的参数值在数据范围内为最大值的正向用例

12.你做接口测试,测什么?

答:
可用性测试
根据约定的协议、方法、格式内容,传输数据到接口经处理后返回期望的结果:
接口功能是否正确实现;
返回值测试 - 返回值除了内容要正确,类型也要正确,保证调用方能够正确地解析;
参数值边界值、等价类测试;
错误和异常处理测试
输入异常值(空值、特殊字符、超过约定长度等),接口能正确处理,且按预期响应;
输入错误的参数,接口能正确处理,并按预期响应;
多输入、少输入参数,接口能正确处理,且按预期响应;
错误传输数据格式(如 json 格式写成 form 格式)测试;
安全性测试,主要指传输数据的安全性:
敏感数据(如密码、秘钥)等是否加密传输;
返回数据是否含有敏感数据,如用户密码、完整的用户银行账号信息等;
接口是否对传入的数据做安全校验,如身份 ID 加 token 类似校验;
接口是否防止恶意请求(如大量伪造请求接口致使服务器崩溃);
性能测试,如接口的响应时间、并发处理能力、压测处理情况:
并发请求相同的接口(特别为 POST 请求),接口的处理情况(如插入了相同的记录导致 数据出错,引发系统故障);

接口响应时长在用户可忍受的范围内;
对于请求量大的接口做压测,确定最大的瓶颈点是否满足当前业务需要;

13.平常用什么工具测接口的?

答:常用 http 协议接口测试工具,如:postman、fiddler、jmeter;webService 接口用 SoapUI、
jmeter 等。

14.没有接口文档,如果做接口测试?

本题主要考情商,通俗来说就是忽悠能力,先唬住面试官了再说,进去了也是瞎测测,随时 做好背锅的准备,当然,你肯定不能回答面试官不测(心理 mmp,脸上笑嘻嘻),接下来就是 扯犊子时间
答:用抓包工具把接口抓取处理,然后针对性进行测试;接口中字段信息不清楚的,找时间
集中寻求开发解答。(常用抓包工具 Fiddler、Charles 等)

15.在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?

答:用一个全局变量来处理依赖的数据,比如登录后返回 token,其它接口都需要这个 token,
那就用全局变量来传 token 参数。

16.依赖于第三方数据的接口如何进行测试?

答:mock
接着面试官会问你,如果 mock 的,然后你就顺着坑继续挖,搭建 mock 服务,参考这篇
http://www.51ste.com/share/det-485.html

17.接口测试中,依赖登录状态的接口如何测试?

答:依赖登录状态的接口的本质上是在每次发送请求时需要带上 session 或者 cookie 才能
发送成功,在构建 POST 请求时添加必要的 session 或者 cookie

18.如何模拟弱网做测试?

答:Fiddler 和 charles 都可以模拟弱网测试,平常说的模拟丢包,也是模拟弱网测试。具
体可以看《几种弱网模拟方法,总有一种适合你》

19.你平常做接口测试的过程中发现过哪些 bug?

面试官出这个题,主要是想知道你是不是真的做过接口测试,毕竟现在很多小伙伴简历经过 包装(不包装连面试机会都没有,没办法,为了生存,能理解)
答:
常规错误,接口没实现,没按约定返回结果,边界值处理出错等。
输入异常值(空值、特殊字符、超过约定长度等),接口抛错,没做封装处理;
输入错误的参数、多输入、少输入参数,接口可能出现的错误;
安全性问题,如明文传输、返回结果含有敏感信息,没对用户身份信息做校验,没做恶意请 求拦截等;
性能问题,如接口并发插入多条相同操作,响应时间过长,接口压测出现瓶颈等;

20.当一个接口出现异常时候,你是如何分析异常的?

答:
先抓包,用 fiddler(charles)工具抓包,或者浏览器上 F12 调试工具;APP 上的话,那就 用 Fiddler 做代理,通过手机设置代理去看请求和返回报文;
查看后端日志,如 Linux 系统通过 xhell 连上服务器,查看接口日志,查看是否有报错信息 (命令:tail -f 日志文件);

21.如何分析一个 bug 是前端还是后端的?

答:
平常提 bug 的时候,前端开发和后端开发总是扯皮,不承认是对方的 bug。
这种情况很容易判断,先抓包看请求报文,对着接口文档,看请求报文有没问题,有问题就 是前端发的数据不对;
请求报文没问题,那就看返回报文,返回的数据不对,那就是后端开发的问题咯。

22.你们做接口测试自动化吗?

答:现在针对大量应用,普遍推崇做接口测试自动化,维护成本低、收益高。常用的工具有 许多,如 Jmeter、Robot Framework、pytest 等。

23.列出几个 JMeter 监听器?

一些 JMeter 监听器是:
集合报告
汇总报告
查看结果树
用表格查看结果
图形结果
BeanShell Listener
摘要报告等

24.在 python 中进行数据驱动测试

在 unittest 中,没有自带的数据驱动,我们得借助 ddt 来实现,首先,我们得在 python 运行环境中安装 ddt,用下列命令安装 pip install ddt 另 外 一 个 测 试 框 架 pytest , 它自带数据驱动实现,是通过@pytest.mark.parametrize(argnames,argvalues) 来实现参数化的。
也可以根据自己需求用 python 实现数据的读取和驱动。

25.接口自动化中的关联怎么处理?

把上一个请求返回的结果传入到下一个请求的参数中,将请求的结果反射到一个类属性(使 用 setattr()函数),下一个请求去调用这个类属性

26.自动化测试怎么校验结果?

断言 ,预期结果与实际结果对比
数据库校验,根据测试场景来查询数据库里的数据和请求之前的数据进行比对

27.自动化使用的测试框架是什么?简述自动化框架的设计、维护

测试框架:python+unittest+requests+ddt+openpyxl+pymysql+logging
python:入门简单,语法简洁
unittest :定义一个测试用例类,具体的方法来维护测试用例的生命周期,测试场景行为,
测试用例 前置场景,行为,期望结果,实际结果,断言方法,Setup teardown 方法
requests:接口调用 ,支持 http 请求的库,API 简洁,提供不同的 http 请求方法,支持 session,cookies,
ddt :数据驱动,ddt 类装饰器,data 测试方法装饰器 unpack 解包可迭代的数据类型 普通用户,数据库,配置文件—(基础数据)
openpyxl: 数据管理 excel 管理数据,使用 openpyxl 模块来进行 excel 数据的读和写 (excle,csv, json, yaml, txt 都可以管理测试数据)
pymysql:数据库交互,数据校验
eval,json:数据格式的转换 Eval 将 python 支持的格式转换成对应的格式
logging:日志处理, 统一日志输出格式,渠道,级别,执行结果的记录,便于定位问题
jenkins:持续集成
2/框架设计思路:数据驱动+结构分层(可读性,可维护性,可扩展性)
数据驱动:将维护数据与代码分离,接口调用行为一致,针对不同的参数组合驱动不同的测 试场景,减少代码冗余
结构分层:数据层+用例层+逻辑层
数据层:测试数据的支撑 data.xls
用例层:用例的执行 test_register.py test_recharge.py
逻辑层:公用的方法的封装与提取 doexcle.py do_mysql.py http_requests.py logger.py 等模块
3/框架设计步骤:
准备测试数据: EXCEL 表准备测试用例—excel 数据的读取—参数值的替换
发起请求:请求方法(get/post 方法进行封装—URL 的拼接(不同—参数转化为字典 拿到请求的返回值:解析返回值 code,status,msg 信息)
断言
好处:
1、自动化测试用例和手工测试用例的完美结合,减少重复工作
2、配置灵活,可以自主切换测试环境,执行测试用例
3、常用功能进行封装,逻辑清晰,易于维护
4、统一执行入口,管理测试用例集:
run.py 模块通过模糊查找来选择需要执行的测试用例
5、持续集成,定时构建,快速反馈

28.具体的在这个项目中自动化怎么应用到实际的,您对自动化结果的分析

完成所有的自动化测试框架的设计和实现后,进行接口测试,然后集成到 jenkins,配置定时执行,生成 html 报表,查看测试通过率,查看接口的功能
每次发版时,进行回归测试,新功能开发未提测前

29.什么是 HTTP 请求,HTTP 请求方式有哪些

答:HTTP,即超文本传输协议,是 HyperText Transfer Protocol 的缩写。
浏览网页时在浏览器地址栏中输入的 URL 前面都是以"http://"开始的。HTTP 定 义了信息如何被格式化、如何被传输,以及在各种命令下服务器和浏览器所采取 的响应。
HTTP 请求方式:GET、POST、PUT、HEAD、DELETE、OPTIONS、 TRACE、CONNECT

30.常用工具的使用,postman,jmeter,Fiddler

(此处常用工具的使用是检查一名测试人员基本技能的基础,也是项目组最为关
注的点,这里只简单介绍操作步骤,候选人若能答出流程即可)
Postman:postman 是一个开源的接口测试工具,无论是做单个接口的测试
还是整套测试脚本的拨测都非常方便。
1)get 请求:Get 请求是最简单的请求方式,输入 URL 就能完成。第一步:新建一个 tab 页面
第二步:输入 URL ,选择请求方式为 GET
第三步:点击“send”按钮
第四步:查看返回码是否异常。
2)post 请求: Post 请求跟 Get 的区别除了请求方式不同之外, 还需要添加请求体,请求体内容多半为 Json 格式。
第一步:新建一个 tab 页面
第二步:输入 URL ,选择请求方式为 POST
第三步:输入请求体内容
第四步:点击“send”按钮
第五步:查看返回码,返回信息等
3)带 cookie 的请求: 该请求需要在 Heards 里面添加 Cookie
第一步:新建一个 tab 页面
第二步:输入 URL ,选择请求方式为 POST
第三步:输入请求体内容
第四步:在 Heard 里面添加 Cookie 信息
第五步:点击“send”按钮
第六步:查看返回码,返回信息等
4)带 Header 的请求:该请求需要在 Heards 里面添加 Cookie。
第一步:新建一个 tab 页面
第二步:输入 URL ,选择请求方式为 POST
第三步:输入请求体内容第四步:在 Heard 里面对应的内容
第五步:点击“send”按钮
第六步:查看返回码,返回信息等
5)文件上传的请求:发送请求前需要先上传文件。
第一步:新建一个 tab 页面
第二步:输入 URL ,选择请求方式为 POST
第三步:输入请求体内容,文件内容选择 file, 选择本地的文件上传
第四步:点击“send”按钮
第五步:查看返回码,返回信息等
Jmeter:Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用 于对软件做压力测试,它最初被设计用于 Web 应用测试,但后来扩展到其 他测试领域。它可以用于测试静态和动态资源,例如静态文件、Java 小服务 程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。
操作步骤如下:
在这里插入图片描述

首先,添加线程组,单击右键->添加->Threads(Users)->线程组

右键“线程组” -> “添加” -> “取样器” -> “HTTP 请求”, 输入“服务器名称或 IP”,对应的端口号,http 默认端口号 80,可以不写。
以下请求为 POST, 所有“方法”那选择“POST”,输入对应的路径,添加 参数及值。
在这里插入图片描述

右键“线程组” -> “添加” -> “监听器” -> “察看结果数”, 添加“察
看结果数”,以察看运行后的结果,如图所示。
在这里插入图片描述

数据补充完整后可点击菜单栏目中“启动”按钮以启动测试
简单来说,jmeter 操作过程就是:
1、新建一个线程组
2、输入 HTTP 请求
3、设置一个或者多个断言,增加监听器
4、运行后查看结果树

31.你对http请求跟webservice请求的了解

1、webService接口:是走soap协议通过http传输,请求报文和返回报文都是xml格式的,我们在测试的时候都用通过工具才能进行调用,测试。可以使用的工具有SoapUI、jmeter、loadrunner等;

2、http api接口:是走http协议,通过路径来区分调用的方法,请求报文都是key-value形式的,返回报文一般都是json串,有get和post等方法,这也是最常用的两种请求方式。可以使用的工具有postman、RESTClient、jmeter、loadrunner等

32.接口测试为你什么要参数化

举个例子,例如购物车接口请求数据需要登录接口里面返回的token值,这个存在接口之间依赖关系的时候,我们需要把依赖字段值进行参数化
再比如接口中会有一些公共参数,每个接口里面都存在,如果值是固定的,那我们可以把这些进行参数化记录,减少在每个接口里面书写出错的问题
再比如手机号,我传131开头的、133开头的、135开头的,如果不会参数化,就要写三个http请求,分别传这三种参数,学会了参数化,只写一个http请求就够了,以此来减少重复的工作

33描述一下Http协议

http协议又叫做超文本传输协议,在做网络请求的时候,我们基本上是使用http协议。
http协议包括请求和响应。
请求中包括:请求地址,请求方式,请求方式包括get请求和post请求,get和post的区别是get请求是在地址栏后边跟随请求参数,但是请求参数大小是有限制,不同浏览器是不同的。一般是4KB。post请求主要用于向服务器提交请求参数。post请求的参数是放到请求实体内容中的,相对get请求较为安全一些。

另外,请求中会有各种请求头信息,比如支持的数据类型,请求的来源位置,以及Cookie头等相关头信息。

响应,主要包含响应的状态码,像200(),404(),500(),304(),307()
还有各种响应头信息,比如设置缓存的响应头,Content-Type内容类型,设置cookie头信息。

35.请详细阐述接口测试和UI测试在测试活动中是如何协同测试的?

接口测试和UI测试这两块其实是有一部分是重叠的,UI测试是通过前端写的界面,来调用接口,而接口测试是直接调接口。所以排除前端的处理的逻辑和调用的正确性,在理论上接口测试是可以覆盖所有的UI测试。但实际过程中,如果只是在接口层覆盖所有的业务流,在UI上只测试前端的逻辑,最终的结果可能会是忽视很多原有的功能点,导致了UI测试的不充分。所以存在多人分工且时间充分的时候可以尝试接口去做业务流的全覆盖,否则不要轻易尝试。

36.系统间的接口联调测试

例如:两个系统之间的部分数据是相互读取的

  1. 在一个甲系统增加,修改A数据后,乙系统也会相应的呈现这个改动的数据;在乙系统增加,修改B数据后,甲系统也会相应的呈现这个改动的数据;
    即A部分的数据,是由甲系统来维护的,乙系统读入数据并同步;B部分的数据,是由乙系统来维护的,甲系统读取数据并同步;
  2. 在具体的操作过程中,在甲系统增加,修改A数据后,然后在乙系统查看对应的数据是否同步一致;反之亦然;
    在乙系统查看对应的数据是否同步一致?分为三个层面;

(1)甲系统传输过来的数据和乙系统接收到的数据是否一致;
(2)乙系统接收到数据后,会存入到自己的数据库,这个存储过程是否成功?(主要是考虑到甲系统传过来的数据格式是否和乙系统的格式一致)且数据存储成功与否乙系统会返回一条信息(例如:返回1,表示数据正确传输并存储到数据库了;返回0及错误信息表示数据传输或存储出了问题)
(3)然后在乙系统的界面查看,新增或修改的数据是否和接收到的数据一致;

37.参数化具体用在哪些路径上?

凡是请求,基本都要带参数,带参数,就有可能进行参数化。
购物车:带参数,买的什么商品,买了几个。
搜索,关键词,排序方式,类别,热度,价格区间
分类:参数信息参数化

38.你们公司接口中常见的错误码及含义,及返回信息参数有哪些等,举例说明

名称 说明 编码
1 操作成功
2 操作失败
33 参数解析失败 一般指json格式错误
44 订单重复提交 (会返回提交成功时的承运信息)
401 身份安全验证失败
500 系统错误
999 需要登录

返回值为json格式,如下:

{
    "status": 1,
"message": "处理成功",    
    "result": "请求结果",
    "totalRow": 100,
"totalPage": 5
}

status 1表示成功,
message 提示信息 (必有,字符串型)
result 详细结果 (可选,类型各接口不同,相见接口内定义)
totalRow 总记录条数,用于分页使用 (可选,整型)
totalPage 总页数 (可选,整型)

39. 常见接口:

http api接口:是走http协议,通过路径来区分调用的方法,请求报文都是key-value形式的,返回报文一般都是json串,有get和post等方法,这也是最常用的两种请求方式。可以使用的工具有postman、RESTClient、jmeter、loadrunner等;

40.接口组成

接口都有那些部分组成呢?
首先,接口文档应该包含以下内容:
1、接口说明
2、调用url
3、请求方法(get\post)
4、请求参数、参数类型、请求参数说明
5、返回参数说明
由接口文档可知,接口至少应有请求地址、请求方法、请求参数(入参和出参)组成,部分接口有请求头header。
标头 (header):是服务器以HTTP协议传HTML资料到浏览器前所送出的字串,在标头与 HTML 文件之间尚需空一行分隔,一般存放cookie、token等信息
有同学问我header和入参有什么关系?它们不都是发送到服务器的参数吗?
首先,它们确实都是发送到服务器里的参数,但它们是有区别的,header里存放的参数一般存放的是一些校验信息,比如cookie,它是为了校验这个请求是否有权限请求服务器,如果有,它才能请求服务器,然后把请求地址连同入参一起发送到服务器,然后服务器会根据地址和入参来返回出参。也就是说,服务器是先接受header信息进行判断该请求是否有权限请求,判断有权限后,才会接受请求地址和入参的。

41.为什么要做接口测试:

大家都知道,接口其实就是前端页面或APP等调用与后端做交互用的,所以好多人都会问,我功能测试都测好了,为什么还要测接口呢?OK,在回答这个问题之前,先举个栗子:
比如测试用户注册功能,规定用户名为6~18个字符,包含字母(区分大小写)、数字、下划线。首先功能测试时肯定会对用户名规则进行测试时,比如输入20个字符、输入特殊字符等,但这些可能只是在前端做了校验,后端可能没做校验,如果有人通过抓包绕过前端校验直接发送到后端怎么办呢?试想一下,如果用户名和密码未在后端做校验,而有人又绕过前端校验的话,那用户名和密码不就可以随便输了吗?如果是登录可能会通过SQL注入等手段来随意登录,甚至可以获取管理员权限,那这样不是很恐怖?
所以,接口测试的必要性就体现出来了:
①、可以发现很多在页面上操作发现不了的bug
②、检查系统的异常处理能力
③、检查系统的安全性、稳定性
④、前端随便变,接口测好了,后端不用变

42.GET请求和POST请求的区别:

1、GET使用URL或Cookie传参。而POST将数据放在BODY中。
2、GET的URL会有长度上的限制,则POST的数据则可以非常大。
3、POST比GET安全,因为数据在地址栏上不可见。
4、一般get请求用来获取数据,post请求用来发送数据。
其实上面这几点,只有最后一点说的是比较靠谱的,第一点post请求也可以把数据放到url里面,get请求其实也没长度限制,post请求看起来参数是隐式的,稍微安全那么一些些,但是那只是对于小白用户来说的,就算post请求,你通过抓包也是可以抓到参数的。所以上面这些面试的时候你说出来就行了。

43.常见状态码:

每发出一个http请求之后,都会有一个响应,http本身会有一个状态码,来标示这个请求是否成功,常见的状态码有以下几种:
1、2XX 2开头的都表示这个请求发送成功,最常见的就是200,就代表这个请求是ok的,服务器也返回了。
2、3XX 3开头的代表重定向,最常见的是302,把这个请求重定向到别的地方了,
3、4XX 400代表客户端发送的请求有语法错误,401代表访问的页面没有授权,403表示没有权限访问这个页面,404代表没有这个页面
4、5xx: 代表服务器有异常,500代表服务器内部异常;503服务器当前不能处理客户端的请求,一段时间后可能恢复正常;504代表服务器端超时,没返回结果。

44.通用接口用例设计

①、通过性验证:首先肯定要保证这个接口功能是好使的,也就是正常的通过性测试,按照接口文档上的参数,正常传入,是否可以返回正确的结果。
②、参数组合:现在有一个操作商品的接口,有个字段type,传1的时候代表修改商品,商品id、商品名称、价格有一个是必传的,type传2的时候是删除商品,商品id是必传的,这样就要测参数组合了,type传1的时候,只传商品名称能不能修改成功,id、名称、价格都传的时候能不能修改成功。
③、接口安全:
1、绕过验证,比如说购买了一个商品,它的价格是300元,那我在提交订单时候,我把这个商品的价格改成3元,后端有没有做验证,更狠点,我把钱改成-3,是不是我的余额还要增加?
2、绕过身份授权,比如说修改商品信息接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,我传一个其他的卖家能不能修改成功
3、参数是否加密,比如说我登陆的接口,用户名和密码是不是加密,如果不加密的话,别人拦截到你的请求,就能获取到你的信息了,加密规则是否容易破解。
4、密码安全规则,密码的复杂程度校验
④、异常验证:
所谓异常验证,也就是我不按照你接口文档上的要求输入参数,来验证接口对异常情况的校验。比如说必填的参数不填,输入整数类型的,传入字符串类型,长度是10的,传11,总之就是你说怎么来,我就不怎么来,其实也就这三种,必传非必传、参数类型、入参长度。

45.根据业务逻辑来设计用例

根据业务逻辑来设计的话,就是根据自己系统的业务来设计用例,这个每个公司的业务不一样,就得具体的看自己公司的业务了,其实这也和功能测试设计用例是  一样的。
举个例子,拿bbs来说,bbs的需求是这样的:
1、登录失败5次,就需要等待15分钟之后再登录
2、新注册的用户需要过了实习期才能发帖
3、删除帖子扣除积分
4、…
像这样的你就要把这些测试点列出来,然后再去造数据测试对应的测试点。

46.用什么工具测

接口测试的工具很多,比如 postman、RESTClient、jmeter、loadrunner、SoapUI等,本人首推的测试工具是postman和jmeter

47.接口测试用例模板 (可根据项目实际情况设计增减)

1、项目 测试针对哪个项目
2、模块 哪个功能模块
3、用例id
4、接口名称
5、用例标题 测试用途概括
6、请求方式 GET/POST
7、请求url URL地址
8、请求参数
9、前置条件 执行当前请求依赖的条件,不满足就不能正确执行
10、结果验证 预期结果
11、请求报文 可以不写
12、返回报文  一定要写,这里应该是你请求返回的真实结果
13、测试结果 通过/失败
14、测试人员

48.接口测试注意事项

测试的时候这几个方面:
改变请求参数,看响应结果是否和接口文档一致
查看参数是否有敏感信息(比如个人账户信息,资金信息)
查看是否对关键参数进行加密处理(密码信息)
所有列表页接口必须考虑排序值
接口返回的图片地址能否打开,图片尺寸是否符合需求;
接口有翻页时,页码与页数的异常值测试;
当输出参数有联动性时,需要校验返回两参数的实际结果是否都符合需求
每个接口入参的默认值、异常类型、非空校验
入参支持多个值时,要考虑传的值的个数多的情况下,接口会不会报错

49.浏览器输入 url 按回车背后经历了哪些?

在 PC 浏览器的地址栏输入一串 URL,然后按 Enter 键这个页面渲染出来,这
个过程中都发生了什么事?
1、首先,在浏览器地址栏中输入 url,先解析 url,检测 url 地址是否合法
2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在
屏幕中显示页面内容。若没有,则跳到第三步操作。
浏览器缓存:浏览器会记录 DNS 一段时间,因此,只是第一个地方解析 DNS 请求;
操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,
获取操作系统的记录(保存最近的 DNS 查询缓存);
路由器缓存:如果上述两个步骤均不能成功获取 DNS 记录,继续搜索路由器缓存;
ISP 缓存:若上述均失败,继续向 ISP 搜索。
3、在发送 http 请求前,需要域名解析(DNS 解析),解析获取相应的 IP 地址。
4、浏览器向服务器发起 tcp 连接,与浏览器建立 tcp 三次握手。
5、握手成功后,浏览器向服务器发送 http 请求,请求数据包。
6、服务器处理收到的请求,将数据返回至浏览器
7、浏览器收到 HTTP 响应
8、浏览器解码响应,如果响应可以缓存,则存入缓存。
9、 浏览器发送请求获取嵌入在 HTML 中的资源(html,css,javascript,图片,
音乐······),对于未知类型,会弹出对话框。
10、 浏览器发送异步请求。
11、页面全部渲染结束。

50.cookies 机制和 session 机制的区别

cookies 机制和 session 机制的区别,这个也是经常会问的
cookies 数据保存在客户端,session 数据保存在服务器端;
cookies 可以减轻服务器压力,但是不安全,容易进行 cookies 欺骗;
session 较安全,但占用服务器资源

51.http 协议请求方式

http 协议有哪几种请求方式?
GET, POST 和 HEAD 方、OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

52.报文格式

HTTP 请求报文与响应报文格式
请求报文包含三部分:
a、请求行:包含请求方法、URI、HTTP 版本信息
b、请求头部(headers)字段
c、请求内容实体(body)
响应报文包含三部分:
a、状态行:包含 HTTP 版本、状态码、状态码的原因短语
b、响应头部(headers)字段
c、响应内容(body)实体

53.什么是 DNS?

域名解析服务。将主机名转换为 IP 地址。如将 http://www.cnblogs.com/主机
名转换为 IP 地址:211.137.51.78

54.什么是 Http 协议无状态协议?怎么解决 Http 协议无状态协议?

(1)、无状态协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需
要前面的信息
(2)、无状态协议解决办法: 通过 1、Cookie 2、通过 Session 会话保存。

55.webService 接口是如何测试的

webService 接口用 SoapUI
在这里插入图片描述

56.在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?

用一个全局变量来处理依赖的数据,比如登录后返回 token,其它接口都需要这
个 token,那就用全局变量来传 token 参数
依赖第三方

57.json 和字典 dict 的区别?

现在自动化培训烂大街,是个人都能说的上几个框架,面试如果问框架相关问题,
求职者只需一瓶 82 年的雪碧,会吹的让你怀疑人生!
所以面试官为了更清楚的知道你是停留在表面上的花拳绣腿还是有扎实的基础,
就不会问框架这种东西了。基本上问几个数据类型的基础就知道有没货了。
那么 json 和字典到底有什么区别呢?初学者连 python 的基础数据类型都没搞清
楚,直接撸框架,有的人学了几个月可能都迷迷糊糊的,以为 json 就是字典。
这个是肯定不对的。
首先 python 里面的基础数据类型有:int、str、 float、list、bool、tuple、
dict、set 这几种类型,里面没 json 这种数据类型。
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格
式。它基于 ECMAScript (欧洲计算机协会制定的 js 规范)的一个子集,采用完
全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得
JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生
成,并有效地提升网络传输效率。
由于你的代码是 python 写的(也有可能是 php,java,c,ruby 等语言),但是后
端接口是 java 写的(也有可能是其它语言),不同的 语言数据类型是不一样的
(就好比中国的语言和美国的语言数据类型也不一样,中国的一般说一只羊,一
头牛,美国都是 a /an 这种单位),所以就导致你提交的数据,别的开发语言
无法识别,这就需要规范传输的数据(传输的数据都是一个字符串),大家都遵
循一个规范,按一个标 准的格式去传输,于是就有就 json 这种国际化规范的数
据类型。
json 本质上还是字符串,只是按 key:value 这种键值对的格式来的字符串

import json 
# a 是字典 dict 
a = {"a": 1, "b": 2, "c": True} 
# b 是 json 
b = '{"a": 1, "b": 2, "c": true}' 
print(type(a)) 
print(json.dumps(a)) # a 转 json 
运行结果 
<class 'dict'> 
{"a": 1, "b": 2, "c": true} 
<class 'str'> 
{'a': 1, 'b': 2, 'c': True} 

58.测试的数据你放在哪?

测试数据到底该怎么放,这个是面试官最喜欢问的一个题了,似乎仁者见仁智者
见智,没有标准的答案,有的人说放 excel,也有的说放.py 脚本,也有的说放
ini 配置文件,
还有放到 json,yaml 文件,txt 文件,甚至有的放数据库,五花八门,一百个
做自动化的小伙伴有 100 个放的地方。
这里总结下测试的数据到底该怎么放?
首先测试的数据是分很多种的,有登录的账户数据,也有注册的账户数据,还有
接口的参数,还有邮箱配置的数据等等等等,所以这个题不能一概而论给答死了。
要不然就是给自己挖坑。
以下两个大忌不能回答:

  • 测试的数据是不能写死到代码里面的,这个是原则问题,也是写代码的大 忌(你要是回答写在代码里面,估计就是回去等通知了)
  • 测试数据放到.py 的开头,这种其实很方便,对于少量的,固定不变的数 据其实是可以放的,但是面试时候,千万不能这样说,面试官喜欢装逼的 方法

测试数据存放总结:
1.对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写的配 置文件里(如 ini)
2.对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函 数生成
3.对于一个接口有多组测试的参数,可以参数化,数据放 yaml,text,json,excel 都可以
4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到 数据库,每次数据初始化,用完后再清理
5.对于邮箱配置的一些参数,可以用 ini 配置文件
6.对于全部是独立的接口项目,可以用数据驱动方式,用 excel/csv 管理测试的 接口数据
7.对于少量的静态数据,比如一个接口的测试数据,也就 2-3 组,可以写到 py 脚本的开头,十年八年都不会变更的
总之不同的测试数据,可以用不同的文件管理

59.什么是数据驱动,如何参数化?

参数化和数据驱动的概念这个肯定要知道的,参数化的思想是代码用例写好了后,
不需要改代码,只需维护测试数据就可以了,并且根据不同的测试数据生成多个
用例
python 里面用 unittest 框架
import unittest
import ddt

测试数据

datas = [ {"user": "admin", "psw": "123", "result": "true"}, 
{"user": "admin1", "psw": "1234", "result": "true"}, 
{"user": "admin2", "psw": "1234", "result": "true"}, 
{"user": "admin3", "psw": "1234", "result": "true"}, 
{"user": "admin4", "psw": "1234", "result": "true"}, 
{"user": "admin5", "psw": "1234", "result": "true"}, 
{"user": "admin6", "psw": "1234", "result": "true"}, 
{"user": "admin7", "psw": "1234", "result": "true"}, 
{"user": "admin8", "psw": "1234", "result": "true"}, 
{"user": "admin9", "psw": "1234", "result": "true"}, 
{"user": "admin10", "psw": "1234", "result": "true"}, 
{"user": "admin11", "psw": "1234", "result": "true"}] 
@ddt.ddt 
class Test(unittest.TestCase): 
@ddt.data(*datas) 
def test_(self, d): 
"""测码学院:{0}""" 
print("测试数据:%s" % d) 
if __name__ == "__main__": 
unittest.main() 
unittest 框架还有一个 paramunittest 也可以实现 
import unittest 
import paramunittest 
import time 
# python3.6 
# 作者:测码学院
@paramunittest.parametrized( 
{"user": "admin", "psw": "123", "result": "true"}, 
{"user": "admin1", "psw": "1234", "result": "true"}, 
{"user": "admin2", "psw": "1234", "result": "true"}, 
{"user": "admin3", "psw": "1234", "result": "true"}, 
{"user": "admin4", "psw": "1234", "result": "true"}, 
{"user": "admin5", "psw": "1234", "result": "true"}, 
{"user": "admin6", "psw": "1234", "result": "true"}, 
{"user": "admin7", "psw": "1234", "result": "true"}, 
{"user": "admin8", "psw": "1234", "result": "true"}, 
{"user": "admin9", "psw": "1234", "result": "true"}, 
{"user": "admin10", "psw": "1234", "result": "true"}, 
{"user": "admin11", "psw": "1234", "result": "true"}, 
) 
class TestDemo(unittest.TestCase): 
def setParameters(self, user, psw, result): 
'''这里注意了,user, psw, result 三个参数和前面定义的字典一一 
对应''' 
self.user = user 
self.user = psw 
self.result = result 
def testcase(self): 
print("开始执行用例:--------------") 
time.sleep(0.5) 
print("输入用户名:%s" % self.user) 
print("输入密码:%s" % self.user) 
print("期望结果:%s " % self.result) 
time.sleep(0.5) 
self.assertTrue(self.result == "true") 
if __name__ == "__main__": 
unittest.main(verbosity=2) 
如果用的是 pytest 框架,也能实现参数化 
# content of test_canshu1.py 
# coding:utf-8 
import pytest 
@pytest.mark.parametrize("test_input,expected", 
[ ("3+5", 8), 
("2+4", 6), 
("6 * 9", 42), 
]) 
def test_eval(test_input, expected): 
assert eval(test_input) == expected 
if __name__ == "__main__": 
pytest.main(["-s", "test_canshu1.py"]) 

pytest 里面还有一个更加强大的功能,获得多个参数化参数的所有组合,可以 堆叠参数化装饰器

import pytest 
@pytest.mark.parametrize("x", [0, 1]) 
@pytest.mark.parametrize("y", [2, 3]) 
def test_foo(x, y): 
print("测试数据组合:x->%s, y->%s" % (x, y)) 
if __name__ == "__main__": 
pytest.main(["-s", "test_canshu1.py"]) 

60.下个接口请求参数依赖上个接口的返回数据

这个很容易,不同的接口封装成不同的函数或方法,需要的数据 return 出来, 用一个中间变量 a 去接受,后面的接口传 a 就可以了

61.依赖于登录的接口如何处理

登录接口依赖 token 的,可以先登录后,token 存到一个 yaml 或者 json,或者 ini 的配置文件里面,后面所有的请求去拿这个数据就可以全局使用了
如果是 cookies 的参数,可以用 session 自动关联 s=requests.session()
后面请求用 s.get()和 s.post()就可以自动关联 cookies 了

62.依赖第三方的接口如何处理

这个需要自己去搭建一个 mock 服务,模拟接口返回数据,
moco 是一个开源的框架,在 github 上可以下载到
https://github.com/dreamhead/moco
moco 服务搭建需要自己能够熟练掌握,面试会问你具体如何搭建 ,如何模拟返 回的数据,是用的什么格式,如何请求的

63.不可逆的操作,如何处理,比如删除一个订单这种接口如何测试

此题考的是造数据的能力,接口的请求数据,很多都是需要依赖前面一个状态的 比如工作流这种,流向不同的人状态不一样,操作权限不一样,测试的时候,每 种状态都要测到,就需要自己会造数据了。
平常手工测试造数据,直接在数据库改字段状态。那么自动化也是一样,造数据 可以用 python 连数据库了,做增删改查的操作 测试用例前置操作,setUp 做数据准备 后置操作,tearDown 做数据清理

64.接口产生的垃圾数据如何清理

跟上面一样,造数据和数据清理,需用 python 连数据库了,做增删改查的操作 测试用例前置操作,setUp 做数据准备
后置操作,tearDown 做数据清理

65.一个订单的几种状态如何全部测到?

如:未处理,处理中,处理失败,处理成功
跟上面一样,也是考察造数据,修改数据的状态

66.python 如何连接数据库操作?

这个就是详细的考察你是如何用 python 连数据库的,并且最好能现场写代码那 种(有的笔试题就是 python 连数据库)
具体问你用到哪个模块,查询的数据是什么类型?如何删除数据?如何新增数据? 如何修改数据?
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2 中 则使用 mysqldb。

#!/usr/bin/python3 
# 查询 EMPLOYEE 表中 salary(工资)字段大于 1000 的所有数据: 
import pymysql 
# 打开数据库连接 
db = pymysql.connect("localhost","testuser","test123","TESTDB" ) 
# 使用 cursor()方法获取操作游标 
cursor = db.cursor() 
# SQL 查询语句 
sql = "SELECT * FROM EMPLOYEE \ 
WHERE INCOME > %s" % (1000) 
try: 
# 执行 SQL 语句 
cursor.execute(sql) 
# 获取所有记录列表 
results = cursor.fetchall() 
for row in results: 
fname = row[0] 
lname = row[1] 
age = row[2] 
sex = row[3] 
income = row[4] 
# 打印结果 
print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \ 
(fname, lname, age, sex, income )) 
except: 
print ("Error: unable to fetch data") 
# 关闭数据库连接 
db.close() 

其它的就是运行出报告、代码管理(git)、运行策略和持续集成 jenkins 相关 了,这个所以的自动化但是一样的,后面会单独讲一篇 jenkins 持续集成相关

67.如果模块请求 http 改为了 https,测试方案应该如何制定、修改?

分别用 http 还有 https 登录试试。如果用 https 可以正常登录,地址栏显示一把锁头,那么这个网站是
有部署 SSL 的。如果 http 和 https 都能够正常登录,进一步说明该网站没有设置强制 https 登录,或者说没
有设置 http 链接自动跳转 https 链接;相反如果用 http 登录,结果跳转到 https 页面,说明网站部署了 SSL,
而且设置了 http 自动跳转 https。

68.常用 HTTP 协议调试代理工具有什么?详细说明抓取 HTTPS 协议的 设置过程?

Fiddler 是一个 http 协议调试代理工具
打开 Fiddler,进入 Tools-Options-HTTPS,配置允许抓取 HTTPS 连接和解析 HTTPS 流量然后选择要
解释的来源,设置是否忽略服务证书错误(这些操作做完之后,在浏览器方位 IP:8888,安装证书就可以在
浏览器抓取 HTTPS 协议了)

进入 Tools-Options-Connections,保证打开启抓取 HTTPS 连接,然后默认端口按需求是或否需要修改, 然后点选允许远程计算机连接选项
在这里插入图片描述

69.描述 TCP/IP 协议的层次结构,以及每一层中重要协议

在这里插入图片描述

人已赞赏
Python

一个爬虫的故事:这是人干的事儿?

2020-11-24 11:24:23

Python

Python爬虫系列之多多买菜小程序数据爬取

2020-11-24 16:20:56

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索