[TOC]
Requests库
Requests的请求部分:
def get(url, params=None, **kwargs):
url:接口地址
params:参数 在get请求的url后面传的参数
**kwargs: 可变长度的字典
def post(url, data=None, json=None, **kwargs):
url:接口地址
data: 参数(表单---x-www-form-urlencoded)
json:参数(JSON---application/json)
Apifox四种传参方式:
1.form-data(既有表单也有文件上传) files
2.x-www-form-urlencoded(纯表单) data
3.raw(json:application/json)(传json格式的参数) json
4.binary(application/octrent-stream):(二进制文件) data
**kwargs: 可变长度的字典
def put(url, data=None, **kwargs):
url:接口地址
params:参数
def delete(url, **kwargs):
url:接口地址
--------------------------------------------
底层为调用的request方法
requests.request("get", url, params=params, **kwargs)
--------------------------------------------
requests.request()调用的是session.request方法
session.request(method=method, url=url, **kwargs)
def request(
self,
method, 请求方式
url, 请求路径
params=None, params参数
data=None, data参数
headers=None, 请求头
cookies=None, cookies信息
files=None, 文件上传
auth=None, 鉴权
timeout=None, 超时
allow_redirects=True, 重定向
proxies=None, 设置代理
hooks=None, 钩子
stream=None, 文件下载
verify=None, 证书验证
cert=None, CA证书
json=None, json参数
):
requests.request()和session.request()的区别:前者的每个请求都是独立的,后者会自动的关联所以请求的cookie信息
Request的响应部分:
res.text 返回字符串形式的结果
res.json() 返回字典形式的结果
res.content() 返回字节类型的结果
res,status_code 返回状态码
res.reason 返回状态信息
res.cookie 返回cookie信息
res.encoding 返回编码格式
res.headers 返回响应体
res.request.xxx 得到请求数据
接口关联
三个层次
- 通过类变量保存中间变量实现接口关联
- 通过单独的文件保存中间变量实现接口关联
- 极限封装成零代码的方式实现接口关联
两种方式
正则提供实现接口关联
re.search()通过正则匹配一个值,通过下标[1]取值,没有匹配到返回None
re.findall()通过正则匹配多个值,返回List,通过下标取值,没有匹配到返回None
JsonPath提取实现接口关联
jsonpath.jsonpath() 返回一个列表,通过下标取值,没有找到返回None
框架
框架的封装(统一请求封装)
去重很多重复的,冗余的代码
实现统一的异常处理以及日志监控
引入用例管理框架pytest
python : pytest 和 unittest
java : testng 和 unit
作用:
发现用例:默认发现用例的规则
模块名必须以test_开头或者 _test结尾
测试类必须以Test开头
测试方法必须以test_开头
执行用例
判断结果
生成报告
Pytest用例管理框架详细介绍
结合selenium,requests,appium实现web,接口,app自动化
结合Allure生成报告以及和jenkins实现持续集成
插件:
pytest 本身
pytest-html 生成html报告
pytest-xdist 多线程执行
pytest-ordering 控制用例的执行顺序
pytest-rerunfailures 失败用例重跑
pytest-base-url 基础路径
allure-pytest 生成allure报告
可以放在requirements.txt中,再执行
pip install -r requirements.txt
Pytest用例关联框架执行
- 命令行
- 主函数
import pytest
if __name__ == '__main__':
pytest.main()
3.通过配置文件pytest.ini来改变以及执行用例
不管是命令行还是主函数,都会读取pytest.ini配置文件来执行
Pytest用例管理框架的前后置(固件,夹具)
def setup(self):
print("测试用例之前")
def teardown(self):
print("测试用例之后")
def setup_class(self):
print("每个类之前")
def teardown_class(self):
print("每个类之后")
fixture固件
装饰器:
@pytest.fixture(scope=“作用域”,params=”参数化”,autouse=”自动执行”,ids=”参数别名”,name=”别名”)
scope: function, class, module, session
autouse: True和False
params: 参数化[“mysql”,”redis”]
需要使用:request参数和yield request.param
ids:参数别名
name: 夹具别名:用了夹具别名,那么原来的全名就失效了
接口关联封装(基于一个独立YAML的文件)
YAML
数组组成:
- map对象(字典dict) 键:(空格)值
- 数组对象(列表list) 用一组”-“开头
用例基本架构
-
feature: 模块
story: 接口
title: 用例标题
request:
method: 请求方式
url:
headers: 请求头
params:
"grant_type" : ""
"appid": ""
"secret":""
vilidate: 断言