接口测试基础-HTTP协议 与 服务器响应状态
接口测试是无界面的功能测试,依然测的是功能的逻辑正确性和用户使用场景。
黑盒测试用例的设计方法依然有效。
接口测试的原则
- 自动化:接口测试(最终)要做到非交互式的自动化执行,不需要人参与。
- 独立性:接口测试之间不应该相互依赖。
- 可重复:接口测试可重复执行(回归测试),不受环境影响或即使受影响也只需付出极小代价进行更改。
- ABCDE原则:保障接口测试的交付质量
- Analyze:接口的请求参数往往有很多,首先要分析出那些核心参数,然后进行用例设计和断言。
- Border: 接口参数的取值范围往往有边界值,如果有,则必须对2个边界上的值进行测试。
- Correct:正确的输入,正确的预期输出(正例)。
- Design:按照需求和开发提供的接口设计文档梳理逻辑和“上下文关系”,设计出最终的接口测试用例。
- Error:错误输入,预期输出(反例)。
- 覆盖性:原则上,接口测试需要覆盖接口文档里的所有接口,至少测试“正例情况”。
- 持续性:如接口变更,第一时间维护接口测试用例和脚本;如接口测试执行失败,维护缺陷后必须重测。
- 时间要求:理论上,接口测试应该在项目上线发布之前完成,不应该在项目上线发布之后补充。
HTTP协议
OSI七层网络协议:
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
HTTP协议:
- HTTP(Hyper Text Transfer Protocol)超文本传输协议,属于“应用层“协议,是万维网(www,即:world-wide web的缩写)进行数据通信的基础,例如:http://www.51testing.com/ 。
- HTTP协议基于TCP/IP协议是Internet互联网最基本的协议;严格意义上讲,TCP/IP不是一个协议,而是一个协议族的统称,包含:TCP协议 、IP协议、HTTP协议、FTP协议、POP3协议
- HTTP协议是标准化的,2015年5月正式发布了“HTTP/2版本”取代“HTTP/1.1版本”,成为最新行业标准;市面上,目前仍然有很多比较老的Web软件产品使用的是HTTP/1.1标准。
- 网络传输的“三次握手“与”四次挥手”。[详细可浏览][https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc]
- 🧨需要记住:HTTPS协议仅仅多了一个“s”的区别,但HTTPS在HTTP的基础上加入了SSL安全通道机制,通过传输加密和身份认证保障了传输过程的安全性,一般生产环境的URL网址都以HTTPS为首,例如:https://www.taobao.com
HTTP的工作原理
-
HTTP协议定义Web/APP客户端如何从web应用服务器请求web页面内容,以及服务器如何把web页面内容传送给客户端。
-
HTTP协议采用的是“request请求+response响应”的工作模式:客户端向服务器发送一个”请求报文“,请求报文含有请求的方法、URL、协议版本、请求头部信息和请求参数数据;服务器以”响应报文“的形式回答客户端,响应内容包括协议版本、成功或错误的服务器状态响应码、服务器的一些信息、响应头部的信息和响应数据。
-
HTTP请求和响应的过程
-
客户端连接到应用服务器:
一个客户端(web浏览器、手机APP等)与web应用服务器的http端口(默认为80)建立一个TCP套接字连接。
-
发送http请求:
通过TCP套接字,客户端向服务器发送一个文本格式的请求报文。一个请求报文由“headers请求头信息”和“body请求体内容”组成.
-
应用服务器接受请求并响应:
服务器接受客户端发出的请求并返回http响应。服务器解析请求并定位“请求资源”,然后服务器讲“资源复本”写入TCP套接字,形成响应报文,由客户端读取。一个响应报文由“headers响应头信息”和“body响应体内容”组成。
-
释放连接:
如果connection连接模式为close,则服务器主动关闭TCP套接字连接,客户端被动关闭连接,最终释放TCP连接;若connection连接模式为keep-alive,则该连接会保持一段时间,在该时间内可以继续接收请求,无需重新做一次客户端和服务器之间的连接工作。
-
客户端解析响应内容并展现在前端界面上:
客户端首先解析“响应状态”,检查请求是否成功;然后解析“响应头信息”,检查响应体(也可叫做“报文”)内容的长度(Content-Length)、文本格式(Content-Type)等;最后解析“响应体内容”,读取报文内容并根据不同的文本格式展现在前端页面上(即:软件用户看到的界面)。
-
常见的http请求方法
HTTP/1.1协议定义了8种请求方法:GET、POST、PUT、DELETE、HEAD、TRACE、OPTIONS、CONNECT。
接口测试的4种请求方法
-
GET(get):对应数据库种select语句
向服务器中指定的资源发出“显示”请求。
例如:在百度的搜索框中输入“51testing”并单击[百度一下],请求显示所有相关指定的内容。
使用GET方法应该只用于“读取数据”,而不应被用于产生“副作用”的操作中,因为其中一个重要原因是使用GET方法请求到的资源会被网络蜘蛛随意访问(爬虫技术的核心原理)。
-
POST(post):对应数据库中的insert语句(insert/update/delete语句)
向服务器中指定的资源“提交数据”,请求服务器进行处理,它会改变服务器现有的资源情况。
POST请求可能会“创建”新资源、“修改更新”现有资源或“删除”现有资源,这些动作都属于“提交数据”的范畴。
-
PUT(put):对应数据库中的update语句
向服务器中指定的资源上传并修改更新其更新内容。
-
DELETE(delete): 对应数据库中的delete语句。
请求服务器删除指定的资源。
GET与POST之间的区别?
1. POST请求方法比GET请求方法安全,因为GET方法的参数和值会直接显示在URL地址,所以不安全;而POST方法的参数和值是写在请求报文中然后上传服务器的,不会裸露在URL地址。
2. POST请求方法用于数据库“增删改”资源,而GET请求方法一般只用于数据资源的获取和查看。
3. POST请求方法“入参”(即:写参数和值)时的请求报文的文件大小几乎没有限制条件;而GET请求方法在入参时有一定的内容大小限制,一般时1MB。
HTTP请求于响应的内容格式
- HTTP协议分为客户端的“请求(request)”与服务器的“响应(response)”
- 无论是“请求”还是“响应”,都有“头信息(headers)”和“身体信息(body)”
- HTTP请求的内容格式(请求报文的构成)
- HTTP响应的内容格式(响应报文的构成)
Content-Type常见的格式
application
application/x-www-form-urlencoded
- 比较经典的调用“表单上传”功能接口时需要用到的内容编码格式,同时也是JMeter工具的默认Content-Type。
- 先将form表单数据封装到body请求体中,然后发送给server服务器,发送格式为:
username=test1&password=123456
,“&”:常用连接多个参数的符号。
application/json
-
以JSON数据格式上传请求内容,目前最常见和最主流的方式。
-
JSON(JavaScript Object Notation),JS对象表示法,是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言,比XML格式更小、更快、更易解析。
-
发送格式
// JSON文本也属于“text文本文档”的一种 // JSON字符串之“单行式”写法 {"username":"test1","password":"123456"} // JSON字符串之“多行式”写法(血缘正统的高富帅) { "username": "test1", "password": "123456" }
-
text系列
text/plain
- 将上传提交到服务器的内容格式设置为最为普通的纯文本形式。如果服务器接收数据时,没有指定要求(比如:JSON),那么可以正常接收请求数据;如果有指定要求,那么服务器因为识别不了内容(内容格式不对就等同于语言不通),会直接报错给发送请求的客户端
text/xml
- 服务器响应内容的常见Content-Type;常见于WebService接口服务(基于SOAP协议),但市面上基于这种接口服务的项目已经很少,这也是为何Soap UI这款强大的接口测试工具没落的原因。
multipart
- multipart/form-data
- 当某个接口的功能是文件内容上传时,需要指定成该编码格式。
服务器状态响应码
HTTP状态码(HTTP Status Code)是用以表示服务器超文本传输协议响应状态的3位数字代码。
200系列(成功):
200 OK(接口测试-重点)
- 中文对照:成功
- 服务器响应成功,传回客户端请求的资源数据。
- 但是,接口服务的处理逻辑代码很有可能写错,导致传回的资源数据不正确,做接口测试工作最核心的部分就是去验证接口(业务)处理逻辑和返回参数及其值的准确性,专业术语叫“断言”(切记!)
300系列(重定向):
301 Moved Permanently(网络数据抓包)
- 中文对照:永久移动(重定向)
- 重定向:重新定一个去向
- “301永久移动”表示旧的URL地址的资源已经被永久地删除了(该资源已经不可访问),全部搬家到了新的URL地址,像百度这种搜索引擎在爬取网页新内容时,也同时将旧地址更新为重定向之后的网址。
- 何时需要重定向,为何需要重定向?
- 何时需要重定向:
- 网络调整(比如:改变网页目录结构)
- 网页被移到一个新地址
- 网页扩展名改变(比如:web应用的后缀名从.php改成.html)
- 为何需要重定向:
- 如果不做重定向,那么用户的浏览器收藏夹或百度这样的搜索引擎数据库中保存的是旧地址,用户访问后会得到“404 页面错误”的无情反馈,大量丧失访问流量。
- 某些网站会注册多个分域名,必须做重定向来保证用户访问这些分域名会自动跳转到网站主站。
- 永定重定向的场景:
- 分域名到期不想续费。
- 发现了更适合的网站域名,想换个域名。
- 在百度这样的搜索引擎中,查询结果出现了不带www的域名,而带www的“主域名”却没被收录,此时,“该网站”的开发人员可以利用301重定向技术让“百度”也收录下带www的“主域名”。
- 何时需要重定向:
302 Move Temporarily (网络数据抓包)
- 中文对照:临时移动(重定向)
- “302临时移动”表示旧的URL地址的资源还在(仍然可以访问),目前只是暂时性地重定向到另一个URL地址。
- 当一个网站或某个网页只需要在24~48小时内临时移动到一个新的位置(URL地址)时利用302跳转。
- 百度这种搜索引擎会抓取网页新内容(临时部署在新的URL地址的页面),而继续保存旧的URL地址。
- 开发人员应该尽可能使用“301永久移动”的方式进行URL地址跳转。
400系列(请求错误):
400 Bad Request(接口测试-重点)
- 中文对照:错误的请求
- 要注意接口入参的参数名有没有错(不多、不少、必填项该填的填、参数先后顺序排列正确)。
- 要注意所入参数的值是否符合开发的接口需求规范,比如:某个注册的接口,有1个用户名参数username,长度必须是2~10位之间,那么入参时,
username=t
就是错误的请求。
401 Unauthorized(接口测试-重点)
- 中文对照:未授权
- 服务(器)没有授权给请求者访问网页或使用服务的权利,比如:调用“登录”接口时,使用未注册过的用户名入参(未授权你登录)、调用“支付宝支付”接口时,使用未开通过支付宝支付的账号入参(未授权你使用支付宝支付)。
403 Forbidden(接口测试-次重点)
- 中文对照:被禁止(访问)
- 在接口测试工作中,一般只有在调用“登录”接口时出现403错误,我们需要考虑设计这样的接口反例,比如:入参时设置一个已经注册成功的用户名但被加入服务器黑名单后,请求“登录”。
- 在很多项目中,开发人员会把401状态和403状态混为一谈,不做细分,该返回403的仍然返回401。
404 Not Found(接口测试-重点)
- 中文对照:未找到
- 全称:Page Not Found,页面未找到;所请求的“资源或服务的URL地址”不存在(或粗心写错地址),即:访问了服务器不存在的资源(或页面)。
- 被划为重点是因为初学者总是很粗心地把接口服务地址填写错误,比如:在所调用的接口的URL地址最后多了一个“空格”。
- 404错误和503错误有着极深的渊源。
405 Method Not Allowed(接口测试-次重点)
- 中文对照:不被允许的请求方法
- 所调用的接口不允许请求者使用当前的请求方法。
- 很好理解,某接口所允许的请求方法是POST,但使用接口测试工具时,错误地设置成了GET。
500系列 (服务器错误):
500 Internal Server Error(接口测试-重点)
- 中文对照:内部服务器错误
- 一般重启服务器“电脑”可以解决,或后台服务进程因为未知原因挂了(很常见的),需要重启进程。
- 所有的服务器错误的鼻祖都隶属于这个,有时候,开发偷懒就什么情况都报个500错误,比如:400明明是错误的请求,由于调用接口时入参填错了导致,但服务器在处理的时候偷个懒,不去区分、故意不识别各种不同的错误情况,反正只要是没有按照接口规范要求的,统一给你来个"500 Error"(内部服务错误)呗,”省事又省力“,但行为极度不负责任,实属ZhaNan行为。
503 Service Unavailable(服务不可用)
- 全称:Service Temporarily Unavailable,服务暂时不可用。
- 503 Error有两种情况:
- 指被调用的那个单接口”挂彩“了,但其它接口(服务)仍旧在正常工作。
- 指某个网站地址无法访问了,比如:服务器正在停机维护中。
- 503 Service Unavailable与404 Not Found其实属于同类型的网页状态的错误码,但有明显区分:
- 503是服务器不可访问时给客户端的一种临时状态,比如:通过谷歌浏览器客户端访问https://www.taobao.com这个网站服务器时,正好淘宝网在停机维护中,那么就必须报503错误,因为网站的停机维护只是一种暂时的状态,是临时关闭的,而不是这个网站主页没了
- 404是访问了不存在的资源或错误的网页页面(也有可能是你们不小心自己打错了URL地址,务必注意),比如:某个接口服务被从项目代码里删除了、某个网站永久关服了、某个网站的某个网页URL地址被永久删除了或者被永久转移了等等(网页永久转移比较好的处理方式是做一个文字提示,告知用户或者使用301状态码自动跳转到转移后的网页链接)
- 关于搜索引擎(比如:百度、Google)处理503状态码和404状态码的方式?
-
为什么网站服务器在临时停机维护的时候不可以随意和草率地返回404状态码?因为404会被百度这样的搜索引擎当做“死链接”后删除(这也就是为什么你通过百度搜索出的结果链接,你从没有遇到过点击链接后报404错误的原因),造成收录和流量的损失。
-
使用503状态码后,百度的爬虫抓取器一旦抓到503状态,会每隔一段时间自动地再次去访问该网站地址,一旦网站在维护完毕上线后,百度会重新把这个网站收录并重新索引(索引就是纳入百度搜索结果列表,但搜索结果有先后显示排序的一种行为)。
-
为什么网站服务器在临时停机维护的时候不可以随意和草率地返回404状态码?因为404会被百度这样的搜索引擎当做“死链接”后删除(这也就是为什么你通过百度搜索出的结果链接,你从没有遇到过点击链接后报404错误的原因),造成收录和流量的损失。
-
使用503状态码后,百度的爬虫抓取器一旦抓到503状态,会每隔一段时间自动地再次去访问该网站地址,一旦网站在维护完毕上线后,百度会重新把这个网站收录并重新索引(索引就是纳入百度搜索结果列表,但搜索结果有先后显示排序的一种行为)。
-