一、接口测试简介
1.1 接口的定义及分类
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等
接口分类 | 说明 |
---|---|
系统内部接口 | 模块间的相互调用(灰盒测试) |
系统外部接口 | 1. 软件接口: ➢ 服务器接口 浏览器与服务器的接口,通过http协议来实现浏览器和服务器间的数据传递 ➢ 外部接口 常见的典型例子就是第三方登录、第三方支付等,通过调用第三方接口并返回当前系统 2. 硬件接口 |
目前比较流行的接口测试是软件接口测试
1.2 接口测试
- 接口测试属于黑盒测试
接口测试 | 说明 |
---|---|
原理 | 通过测试程序模拟客户端向服务器发送请求,服务器收到请求后做出相应的处理并将响应信息发送给客户端,客户端接收响应数据的过程 |
本质 | 本质是基于某种协议,发送一个Request请求给服务器,然后服务器返回一个Response响应数据,然后对响应数据进行分析,判断是否与我们的预期是否一致,从而验证功能是否正确,这就是接口测试 |
1.2.1 网站架构的设计风格
随着互联网的不断发展,网站设计风格逐渐统一于RESTFUL架构风格,HTTP就是该风格的典型应用
REST(表现层状态转化)最大特点:
- ➢ 资源
网络上的一个实体或者说是网络上的一个信息,它可以是一段文本、一张图片、一种服务等
资源总是通过某种载体反应其内容,文本可以用txt格式表现,也可以用HTML格式、XML格式、二进制格式等
JSON是现在最常用的资源表示格式 - ➢ 统一接口(地址)
RESTFUL风格规定,数据的元操作,即CRUD(create、read、update、delete)即数据的增删改查操作,分别对应于HTTP方法,就统一了数据操作的接口
HTTP方法 | 类似于 | 说明 |
---|---|---|
GET | SELECT | 用来获取资源(一项或多项) |
POST | UPDATE | 用来新建资源,也可以用来更新资源 |
PUT | CREATE | 用来更新资源 |
DELETE | DELETE | 用来删除资源 |
- ➢ URI
统一资源标识符,URL是URI的子集
可以用一个URI指向资源,即每一个URI都对应一个特定的资源;要想获取这个资源,访问它的URI就可以 - ➢ 无状态
所有的资源都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变
综上所述:
- 在RESTFUL中一切都认为是资源,每个资源都有对应的URI标识
- 客户端通过GET、POST、PUT、DELETE等http方法对资源进行操纵,即客户端通过http协议与服务器通信,并获取资源信息
二、HTTP协议
超文本传输协议
HTTP是一个属于应用层的面向对象的协议
HTTP特点 | 说明 |
---|---|
支持C/S的模式 | |
简单快速 | 客户向服务器请求服务时,只需传送请求方法和路径 请求方法常用的有GET、HEAD、POST 每种方法规定了客户与服务器联系的类型不同 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快 |
灵活 | HTTP允许传输任意类型的数据对象 正在传输的类型由Content-Type加以标记 |
无连接 | 无连接的含义是限制每次连接只处理一个请求 服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间 |
无状态 | HTTP协议是无状态协议 无状态是指协议对于事务处理没有记忆能力 缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快 |
2.1 URL
格式:http://host[:port][abc_path]
2.2 请求与响应
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成
请求消息和响应消息都是由
- 开始行
对于请求消息——请求行,对于响应消息——状态行 - 消息报头(可选)
也称请求头
对于请求消息——请求报头,对于响应消息——响应报头 - 消息正文(可选)
也称请求实体或响应实体
对于请求消息——请求正文,对于响应消息——响应正文 - 空行(只有CRLF的行)
2.2.1 消息内容说明
名称 | 说明 |
---|---|
请求消息 请求行 |
1. 请求方法 2. 请求地址 3. 协议/协议版本CRLF eg: GET https://www.fiddler2.com/UpdateCheck.aspx?isBeta=False HTTP/1.1
|
响应消息 状态行 |
1. 协议/协议版本 2. 状态码 3. 状态原因 eg: HTTP/1.1 200 OK
|
消息报头 | 每一个报头域都是由【名字+:+空格+值】组成,消息报头域的名字是大小写无关的 |
响应消息 请求正文 |
服务器返回的资源的内容 |
- 请求正文与消息报头由空行隔开
- 响应正文与消息报头由空行隔开
- GET没有请求正文信息
提示:
- CRLF 回车换行(\r\n)
参阅:
2.2.2 响应消息状态代码
三位数字组成,第一个数字定义了响应的类别,且有五种可能取
响应的状态码类型 | 说明 |
---|---|
1xx | 指示信息–表示请求已接收,继续处理 |
2xx | 成功,表示请求已被成功接收、理解、接受 |
3xx | 重定向,要完成请求必须进行更进一步的操作 |
4xx | 客户端错误–请求有语法错误或请求无法实现 |
5xx | 服务器端错误–服务器未能实现合法的请求 |
常见状态代码 | 状态描述 | 说明 |
---|---|---|
200 | OK |
客户端请求成功 |
400 | Bad Request |
客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized |
请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 |
403 | Forbidden |
服务器收到请求,但是拒绝提供服务 |
404 | Not Found |
请求资源不存在,eg:输入了错误的URL |
500 | Internal Server Error |
服务器发生不可预期的错误 |
503 | Server Unavailable |
服务器当前不能处理客户端的请求,一段时间后可能恢复正常 |
eg:
HTTP/1.1 200 OK (CRLF)
2.2.3 消息报头
HTTP消息报头包括普通报头、请求报头、响应报头、实体报头
三、开展接口测试
3.1 获取接口文档
跟开发要接口文档
eg:
应包括异常处理数据
提示:
3.2 构造测试数据,编写测试用例
- 编号
- 测试标题
- 输入
- 与其输出
3.3 正式开展测试
- 安装第三方库
pip3 install requests
- 演示代码
- 构造接口地址
- 构造请求参数
- 发送get/post请求
- 获取响应数据
# 导包
import requests
from jsonpath_rw import jsonpath, parse
if __name__ == '__main__':
# 构造接口地址
qgtq_url = "http://v.juhe.cn/weather/index"
# 构造请求参数
para1 = {"cityname": "苏州", "key": "6156dedaef9f2"}
# 发送get请求
r = requests.get(qgtq_url, para1)
print("状态码:", r.status_code)
# 获取响应数据(该接口中默认JSON)
res = r.json()
print(res, "\n")
# 利用jsonpath_rw处理JSON数据,获取其中的today的数据
jsonpath_expr = parse('result[*].today[*]')
mes = [match.value for match in jsonpath_expr.find(res)][0]
for i in mes.items():
print(i[0], ":", i[1])
# print("\n", res["result"])
# print("\n", res["result"]["today"])
# print("\n", res["result"]["today"]["weather"])
3.4 实战
3.4.1 配置WebTours网站
平台 | 下载地址 |
---|---|
官网 |
https://marketplace.microfocus.com/appdelivery/content/web-tours-sample-application |
Strawberry Perl | 1. http://strawberryperl.com/releases.html 2. https://www.lanzous.com/i62w99i 云
|
WebTours |
https://www.lanzous.com/i62wehg云
|
参阅:
3.4.2 WebTours
有属于参数关联的接口
- 导包
- 构造接口地址
- 构造请求参数
- 发送接口请求
s = requests.session()
s.请求方法(url,params)
- 使用正则表达式匹配接口响应数据的内容
re.findall()
- 构造接口地址
- 构造请求参数
- 发送接口请求
s.请求方法(url,params)
- 打印结果
更新中......