接口自动化详细介绍
一、requets库详细介绍
接口的四要素:url、请求方式、请求参数、响应结果。
接口测试的方法:构造参数、发送请求、解析响应、判断数据、接口关联、数据驱动。
1.1、常用的请求方法
1.1.1、get()请求
def get(url, params=None, **kwargs)
url:接口地址。
params:参数。
**kwargs:可变长度的字典。
1.1.2、post请求
def post(url, data=None, json=None, **kwargs)
url:接口地址。
data:参数(表单,x-www-form-urlencoded)。
json:参数(JSON,application/json)。
**kwargs:可变长度的字典。
postman传参与之对应的request()方法的参数
| postman传参 | request参数 |
| form-data(表单、文件) | files |
| x-www-form-urlencoded(表单) | data |
| raw(application/json,传json格式参数) | json |
| binary(application/octrent-stream,二进制文件) | data |
1.1.3、put请求
def put(url, data=None, **kwargs)
1.1.4、delete()请求
def delete(url, **kwargs)
1.1.5、请求底层逻辑
上面的get()、post()、put()、delete()等四个方法底层都是调用request()方法。

request()方法的底层调用的是session.request()方法。

request()和session.request()的区别:
(1)requests.request():每个请求都是独立的。
(2)requests.session.request():会自动关联每个请求的cookie信息。
1.1.6、requests请求方法分析
安全性:不改变服务器的状态(只读)。
幂等性:单次请求和多次请求,效果一致。
可缓存性:响应结果可供重复使用,省去重复请求。
| 方法名 | 安全性 | 幂等性 | 可缓存性 | 应用场景 |
| GET | √ | √ | √ | 获取数据,下载资源 |
| HEAD | √ | √ | √ | 与GET相同,但是没有正文 |
| POST | × | × | × | 提交数据,创建资源 |
| PUT | × | √ | × | 修改数据,覆盖资源 |
| PATCH | × | √ | × | 部分修改数据 |
| DELETE | × | √ | × | 删除数据、删除资源 |
| CONNECT | × | × | × | 创建代理隧道 |
| OPTIONS | √ | √ | × | 显示通信选项 |
1.1.7、post和get关于安全的定义
为什么在接口自动化里面post不安全、get安全,但是在http请求中post安全、get不安全?
核心结论是:两者的“安全”定义完全不同,
(1)接口自动化中的“安全”是业务层面无副作用;
(2)HTTP协议中的“安全”是数据传输层面隐蔽性;
所以才会出现看似矛盾的判断。
HTTP 协议:POST 比 GET 相对安全的原因
GET请求:参数直接拼接在URL中(如 xxx.com/login?user=123&pwd=456)
会被浏览器历史、服务器日志、代理服务器完整记录,敏感数据(密码、token)极易泄露,所以说 “不安全”。POST请求:参数放在请求体(Body)中,URL 中看不到
虽然未加密时仍能被抓包获取,但不会被常规日志记录,泄露风险更低,所以说“相对安全”。
| 场景 | “安全”的定义 | GET | POST |
| HTTP协议 | 数据传输是否隐蔽、防泄露 | 不安全(参数在 URL) | 相对安全(参数在 Body) |
| 接口自动化 | 业务层面无副作用、可重复执行 | 安全(仅查询,无修改) | 不安全(修改数据,有副作用) |
1.2、request()方法参数介绍
def request(self, method, url, params=None, data=None, headers=None, cookies=None, files=None, auth=None, timeout=None, allow_redirects=True, proxies=None, hooks=None, stream=None, verify=None, cert=None, json=None)
| request()参数 | 对应HTTP请求部分 | 介绍 |
| method | 请求方式 | |
| url | 请求行 | 请求路径 |
| params=None | 请求行 | GET 请求传参 传递 URL 查询参数(问号后) 字典、列表、元组(如{"id":1,"page":2}) |
| data=None | 请求体 | 传递请求体数据 表单提交(Content-Type: application/x-www-form-urlencoded) 非 JSON 格式(如 XML、文本) |
| headers=None | 请求头 | 传递请求头信息 放置公共参数 设置 token、Content-Type、用户代理(User-Agent)等 |
| cookies=None | 请求头 | 传递cookies信息 |
| files=None | 请求体 | 文件上传 |
| auth=None | 鉴权 | |
| timeout=None | 设置请求超时时间 | |
| allow_redirects=True | 重定向 | |
| proxies=None | 设置代理 | |
| hooks=None | 钩子 | |
| stream=None | 文件下载 | |
| cert=None | CA证书 | |
| json=None | 请求体 | 传递 JSON 格式请求体 JSON 格式接口(Content-Type: application/json) 如创建订单、提交复杂数据 |
1.3、requests响应部分
res = requests.post(url, data=None, json=None, **kwargs)
| 属性 | 介绍 |
| res.text | 返回字符串形式的结果 |
| res.json() | 返回字典形式的结果 |
| res.content() | 返回字节类型的结果 |
| res.status_code | 返回状态码 |
| res.resaon | 返回状态信息 |
| res.cookie | 返回cookie信息 |
| res.encoding | 返回编码格式 |
| res.headers | 返回响应头 |
二、提取变量的方式
2.1、jsonpath提取
2.1.1、使用方式
jsonpath.jsonpath(obj, expr)
# obj传入json表达式,expr传入jsonpath表达式规则
2.1.2、匹配条件
| 符号 | 介绍 |
| $ | 表示根节点,也是所有jsonpath表达式的开始 |
| . | 表示获取子节点 |
| .. | 表示获取所有符合条件的内容 |
| * | 代表所有的元素节点 |
| [ ] | 表示迭代器的标识(可以以用于处理下标等情况) |
| [, ,] | 表示多个结果的选择 |
| ?() | 表示过滤操作 |
| @ | 表示当前结点 |
2.1.3、案例
res:是返回请求的参数。
$..token:是jsonpath表达式,目的是查询所有key等于token的value值。

2.2、正则表达式提取
这篇文章介绍了正则表达式,可以前去观看:
正则表达式详细介绍
三、实现接口关联
3.1、通过中间变量保存
定义一个类变量,通过jsonpath或正则表达式提取关键信息,然后保存到类变量中。
3.2、通过文件的形式保存
通过jsonpath或正则表达式提取关键信息,然后保存到yaml或excel中。
还没写完,会继续更新.......
