【文章末尾给大家留下了大量的福利】
前言:
本文是根据软件测试面试葵花宝典面试题全套的其中一部分,全套宝典已经给你们准备好了,全部放在文章末尾了。
- 什么时候要做接口测试?
公司有接口测试需求,接收到接口测试任务。
- 为什么要做接口测试?
- 开发代码初期,UI 和 web 页面设计还没到位,提前介入测试更早发现问题,否则底层的一个 bug 可能会引起外部多个 bug
- 处于接口安全层面考虑,前端进行限制容易绕过,需要同样测试后端的限制;另外 测试接口验证数据的加密传输,例如用户密码
- 接口测试原理?(jmeter 等工具/写代码)
模拟客户端向服务器发送请求,服务器接收请求后对相应的请求做处理并向客户端返回相应结果,客户端接收结果的一个过程。
- 后端接口测试一遍,前端也测试一遍,是不是重复测试了?没有前端界面, 已经测试后端接口了,前端出来,还要做测试么?
前后端对接 OK(跑正常功能)、前端基本校验
- 接口测试属于测试执行那一阶段?
集成测试
- 什么时候会用到使用 Fiddler?
- 做安全测试,检测敏感信息是否加密,拦截篡改数据;
- 当测试时发现缺陷,用 fiddler 抓包,定位该问题是前端还是后台的问题;
- 模拟弱网环境;
- 统计单个功能的响应时间。
- 用 fiddler 如何定位是前端还是后台的问题?
如果接口响应的数据不正确,那就很可能是后端的问题,如果请求参数不正确或者接口响应数据正确但是页面上显示不对,就是前端的问题
- Fiddler 怎么拦截篡改数据?
- 就拿充值来说吧,点击充值之前,先启动 Fiddler,按 F11 打断点,将请求拦截下来,
- 然后在 fiddler 中,对拦截下来的请求,修改其中的数据,比如将充值的金额进行修改
- 修改完成后,关闭拦截,继续请求的发送即可。
- Fiddler 怎么模拟弱网测试?
- 点击规则-->自定义规则,打开 fiddler 的脚本编辑器,找到 simulateModem
- 设置上传和下载的延时速度
- 点击规则-->性能,选模拟带宽
- fiddler 如何模拟 2g/3G 的网络?
- 2G 一般上行/下行速率约为:2.7、9.6kbs,模拟设置为:uploaded 约 2962 ms, downloaded 约 833 ms;(弱网一般指 2G 网络)
- 3G 一般上行/下行速率约为:384、2560kbs,设置为:uploaded 约 2.6 ms, downloaded 约 0.39 ms;
模拟网速:
1、启动Fiddler,打开菜单栏Rules---Performances---Simulate Modem Speeds这里打开了模拟调节速度
2、启动fiddler找到Rules---Customize Rules点击打开
弹出来了Fiddler Script页面,找到以下代码进行修改 if (m_SimulateModem) { // Delay sends by 300ms per KB uploaded. oSession["request-trickle-delay"] = "300"; # 每上传lKB 数据,延时0 3 秒 // Delay receives by 150ms per KB downloaded. oSession["response-trickle-delay"] = "150"; # 每下载lKB 数据,延时0.15 秒
3、计算2G和3G上下行速率
时间单位对应为毫秒,为每上传、下载 1KB 所需耗时
1KB=8kb
2G网络:
上行:2.7K 下行:9.6K 上行:[1/(2.7/8)]X1000=2962ms 下行:[1/(9.6/8)]X1000=833ms
3G网络:
电信:上行:1.8M 1.8x1024 下行:3.1M 3.1x1024 上行:{1/[(1.8x1024)/8]}x1000=4.34ms 下行:{1/[(3.1x1024)/8]}x1000=2.52ms
移动:上行:384k 下行:2.8M 上行:[1/(384/8)]x1000=20.8ms 下行:{1/[(2.8x1024)/8]}x1000=2.79ms
联通:上行:5.76M 下行:7.2M 上行:{1/[(5.76x1024)/8]}x1000=1.35ms 下行:{1/[(7.2x1024)/8]}x1000=1ms
4、相应的修改下图中对应的数值就可以模拟2G和3G进行弱网测试了
- Fiddler 怎么抓 HTTPS 的包?
- 安装安全证书;
- 点击 fiddler 的 Tools-->options-->https
- 勾选上所有选项,更换证书,重启 fiddler
- Fiddler 怎么抓手机 app 的包?
- 手机与 fiddler 所的电脑连接到同一网络;
- 在 fiddler 设置监听端口,并允许远程终端连接;
- 在手机上填写代理服务器的地址和端口。
- fiddle 抓包后怎么分析的?
- 比方说怎么判断前后端 bug
- fiddler 在没有设置过滤器的时候,没有抓到任何请求信息(可能是前端页面元素没有绑定事件,或者绑定事件的元素弄错了,或者前端发生 js 错误等)
- 若抓取到的请求的返回 http code 为 500,说明服务器发生了内部错误
- 若抓取到的请求的返回 http code 为 404,说明可能是服务器根本没有这个地址的服务,也有可能是因为前台 js 提交请求的时候弄错了提交地址
- 你们是怎么进行接口测试的?
先对开发提供的接口文档做好需求分析,进行用例编写及评审,然后我们选择 jemter 做接口测试,我的习惯是把主要的接口串在一起做一个自动化批量测试,确保接口功能是正 常的,然后进行详细的测试。比如测试一个接口,添加线程组添加 http 请求,填写接口信息;如果接口与接口之间有依赖就需要添加 cookie 管理器,jdbc requests,正则表达式等元件,然后添加结果树和断言,关注响应结果是否跟预期一致,同步关注数据库字段,如果
报错查看日志定位,大致就是这样
- 常见状态码
在 HTTP 请求的返回数据包中,响应状态码分为以下 5 种。
- 1xx:消息。一般是告诉客户端,请求已经收到了,正在处理,别急……
- 2xx:处理成功。一般表示请求收悉、我明白你要的、请求已受理、已经处理完成等信息。
- 3xx:重定向到其他地方。它让客户端再发起一个请求,以完成整个处理过程。
- 4xx:处理发生错误,错误来自客户端。例如,客户端请求的是一个不存在的资源、客户端未被授权、禁止访问等。
- 5xx:处理发生错误,错误来自服务器端。例如,服务器端抛出异常、路由出错、HTTP
版本不支持等。
- http 中四种发送请求方式
HTTP 中有四种发送请求的方式:GET、POST、PUT 和 DELETE。
- GET:向特定的资源发出请求。
- POST:向指定资源提交“数据进行处理”请求(例如,提交表单或者上传文件),数据 被包含在请求体中。POST 请求可能导致新的资源的创建,以及(也可能是“或”)已有资源的修改。
- PUT:向指定资源位置上传其最新内容。
- DELETE:请求服务器执行删除操作。
在实际应用中常用的是 GET 和 POST。其他的请求方式都可以通过这两种方式间接地实现。
- get 方式和 post 方式的区别
HTTP 发送请求最主要的两个方式是 GET 和 POST,这两者有哪些区别呢?
区别一:对请求参数的处理方式不同(直观的区别)
- GET 请求:请求的数据会附加在 URL 之后,以“?”分隔 URL 和传输数据,如有多个参数则用“&”连接。URL 采用的是 ASCII 编码格式,而不是 Unicode 编码格式,即所有的非 ASCII 字符都要在编码之后再传输。
- POST 请求:POST 请求会把请求的数据放置在 HTTP 请求包的 Body 数据中,数据包的形式可以是“参数名 1=参数值 1&参数名 2=参数值 2”,也可以是 JSON 格式(键值对)。当然,JSON 格式是一种通用的方式。
Body 数据:{"time":"1499933825","sign":"deb697c7fffcca828a7a03a218b2cda5"}
区别二:传输数据的大小不同
HTTP 没有对传输数据的大小进行限制,也没有对 URL 的长度进行限制。而在实际的程序开发中,存在以下限制。
- GET:特定浏览器和服务器对 URL 的长度有限制。例如,IE 对 URL 长度的限制是 2083Byte
(2×1024Byte+35Byte)。其他浏览器(如 Netscape、FireFox 等)在理论上没有长度的限制,其限制取决于操作系统的支持。因此,在采用 GET 方式提交数据时,传输数据会受到URL 长度的限制。
- POST:由于不是通过 URL 传值,在理论上数据的大小不受限制。但实际上,各个 Web
服务器会对采用 POST 方式提交的数据的大小进行限制,例如,Apache、IIS6 都有各自的配置。
区别三:安全性不同
POST 方式的安全性比 GET 方式的安全性高。使用 GET 方式时,在地址栏里可以直接看到请求数据,采用这种方式可能受到 Cross-site request forgery 攻击。
POST 方式需要抓包才能获取到数据,变相地提高了安全性。
- 接口测试怎么测试的。
- 当我们拿到接口文档后,会先进行熟悉需求文档,了解每个接口的功能、服务器地址、 端口、请求方式、请求参数、参数的约束条件有哪些还有一些响应的字段和响应的状态码
- 之后就会开始编写测用例的,跟功能测试一样,考虑到正常异常的请求参数,还要考虑 到与之对应响应报文是否正确
- 最后就开始使用 Jmeter 执行用例了,先建立一个线程组,再添加 http 请求,填写好请求地址,端口,和请求参数,设置参数化,添加断言等,最后添加查看结果树再运行。运行完后,检查接口是否通过,如果不通过,先定位下原因,如果是请求的参数有问题, 修改后再进行测试,如果是接口本身存在 bug,就把服务器上的日志取下来,提单给开发修改,一直到接口没问题了,就放到我们搭建好的 Jmeter+Jenkins 框架上做持续集成测试。
- 这就是我们接口测试的大概流程。
- 举例说一下你的接口测试是怎么做的?
我以充值这个接口说下吧:充值这个接口用的是 http 协议,使用 post 请求方式,发送给服务器的参数有手机号,充值额度,这些参数都是必传的参数。我们是使用 Jmeter 来做接口测试的,首先,要新建一个线程组,在线程组下面添加一个 http 的请求,然后填写好服务器地址,接口路径,请求方式,请求参数。由于充值的接口依赖于登录,所以我们会先调用登录接口,从中获取 cookies 值,在充值接口中使用${参数名}的方式引用,接下来还要对其他参数进行参数化,构造各种正常和异常的数据,我们先在本地创建一个 txt 文档, 把参数填写到文档里面,在 Jmeter 中添加一个 csv 文件设置,填写好 txt 文档的路径,然后在请求参数中使用正则提取器把 cookies 值关联出来,然后在充值接口中使用${参数名} 的方式引用;接下来添加断言,检查服务器返回的结果和预期结果是不是一致的。最后,添加查看结果树查看测试结果。
- JMeter 测试环境怎么搭建
- 因为 JMeter 是 JAVA 程序开发的,所以要先安装 JDK;
- 配置 JAVA 环境变量,包括:JAVA_HOME,PATH,CLASSPATH;
- 双击 jmeter 的 bin 目录里面的 jmeter.bat 文件,就可以启动 Jmeter。
- 什么时候会用到使用 Fiddler
- 做安全测试,检测敏感信息是否加密,拦截篡改数据;
- 当测试时发现缺陷,用 fiddler 抓包,定位该问题是前端还是后台的问题;
- 模拟弱网环境;
- 统计单个功能的响应时间。
- Fiddler 的抓包原理
在客户端和服务器之间建立一个代理,通过监听端口(默认是 8888),监听本机发出的请求和服务器返回的响应结果。
- 用 jmeter 做接口可以通过,但在手机上用到这接口时用不了,什么原因:
抓包,查看从手机发出去的数据有没有问题。
- 接口测试的关注点(怎么验证接口是通过的)
- 发送给服务器的请求数据是否正确;
- 服务器返回给客户端的信息是否和预期结果一致;
- 进入数据库,检查接口是否实现的相应的功能;
- 接口的响应时间是否符合需求。
- 在进行接口的自动化测试,如果遇到 token 校验,你是怎么处理的?
- 先进行登录
- 登录成功后
- 获取 token
- 把获取的 token 当作下一个接口的请求参数
- 有一个接口 A,发送给服务器的数据需要从接口 B 中获取,怎样对 A 接口进行测试?
- 在 A 接口前面添加接口 B,在 B 接口中添加正则提取器,把 A 接口需要用到的数据关联出来,保存到参数中;
- 在 A 接口中使用${参数名}的方式进行引用。
- Jmeter 的断言怎么做?
选中需要断言的请求,右键,选择响应断言,在响应断言输入框中添加要断言的值;如果这个接口有多个请求数据,针对每个请求数据服务器返回数据都不一样的,这时候,我们 就要把断言的值进行参数化,步骤是:现在本地添加一个 txt 文档,把参数化的值写入文档里面,然后再在 jmeter 选中需要断言的请求,右键,添加 CSV 文件设置,把刚才编辑好的txt 文档添加进来,在响应断言输入框中使用${字段名}的方式来引用参数的值。
- 接口自动化做了多久呢
每个版本都会做接口测试,开发写好接口,我们拿到接口文档之后,我们就开始做着。
- jenkins 怎么做接口自动化?
设置定时任务去跑脚本
- 接口返回的数据格式有哪些?
JSON 格式 和 文本格式,常用的是 JSON 格式
- 什么样的接口,是个好的接口
功能准确无误,响应速度快,支持多用户并发操作,安全性好
- 接口出错了怎么办?
首先,我会先检查一下请求参数啊,还有其他的填入的数据是否有问题,如果这些都没问题,我会 ping 一下网络,看网络通不通,如果网络也没问题的话,我会去看看系统服务器有没有启动,如果服务器也没问题的话,那可能就要发给开发定位一下了。
- 你一个项目做过哪些接口?
每个版本都会新增一些功能,对应的接口也要进行测试,一个项目的所有接口都要进行测试,比如,充值,提现,登陆,修改信息等等,开发写好一个接口后,给到我们接口文档 我们就会去测试。
- 接口测试用例怎么写?
我们每个版本都会有四五个接口需求,有的是新增的接口,有的是原来的接口做了一些调整,我们会查看这些接口有哪些参数,每个参数有什么约束条件,加密方式是什么,正常和异常的响应信息有哪些,然后编写测试用例来覆盖这些需求,一个版本下来大概有五六十 条接口测试用例。
- 接口有哪些参数?
充值接口,会有手机号,充值额度;投标接口,会有用户名 id,密码,标 id,投标金额这些参数;我们项目的接口有五六十个,每个接口实现的功能不一样,参数是不一样的。
- 接口的状态码有哪些
接口不一样,返回的状态码也不一样,我们接口的状态码是由开发统一定义的,比如, 我们 xxx 这个项目,修改昵称这个接口,成功修改的状态码是 0,30001 表示 token 无效, 30002 表示用户不存在,还有 30003 等一些其他的状态码,具体意思记不太清楚了。
- 接口是一个一个做,还是系统做?
我们是将这个系统的所有接口,都放在 Jmeter 的一个线程组下一起执行。
- 接口测试遇到过什么问题,当时是怎么操作然后出现的问题,后来又是怎么分析处理的?
就比如我们公司的片 p2p 项目,生成回款计划这个接口,当标 id 的值为,接口报错了原因是开发没有设定当库存量为空时,自动给一个 0 的默认值,导致后台接收不到数据。
- 你支付功能,付款的接口是怎么测试的呢?
付款的接口一般是由开发直接调试的,像支付宝、微信这些第三方支付,开发会直接调试好。
- 能说一下第三方支付接口的流程吗
付款的接口一般是由开发直接调试的,像支付宝、微信这些第三方支付,开发会直接调试好。
- 为什么要做接口测试 / 接口测试的目的
- 尽早介入测试,早发现 bug,降低修复成本
- UI 界面测试无法发现底层问题
- 接口的加密如何处理
一般来说的话加密都是开发那边会给到加密的文档或者脚本给到我们,我们将参数进行加密后,然后再在 Jmeter 中填写
- Jmeter 的脚本怎么在 Jenkins 上运行的.(run_Jmeter.py)
当时我们老大写了一个 run_jmeter 的 Python 脚本用来执行,我们需要在里面设置好一些路径,比如 Jmeter 的路径,Jmeter 的脚本和测试报告的路径。