接口自动化
一、基础篇
1、requests常用方法及Response对象属性和方法详解
requests第三方库,主要用于发送http请求,做接口自动化
#请求方法如下:
requests.get(url=,params=)# 发送get请求
requests.post(url=,data=,json=)# 发送post请求
requests.delete()# 发送delete请求
requests.put()# 发送put请求
requests.request()# 最核心的方法:无论是说明请求,最后都是调用request方法
#响应信息的内容处理如下:
response = requests.request()
#返回字符串的数据
print(response.text)
#返回字节格式的数据
print(response.content)
#返回字典格式的数据
print(response.json())
#返回状态码
print(response.status_code)
#返回状态信息
print(response.reason)
#返回cookie信息
print(response.cookies)
#返回编码格式
print(response.encoding)
#返回响应头信息
print(response.headers)
2、get、post方法传参注意点
get请求通过params传递参数。
post请求通过json或者data传参。它们的区别是什么?
- data传参:
- 数据报文:dict字典类型,那么默认情况下请求头为:application/x-www-form-urlencoded,表示以form表单的方式传参,格式:a=1&b=2&c=3
- 数据报文:str类型,那么默认情况下为:text/plain,表示以文本方式传参(如果参数是dict格式需要转换成str格式传参)
- json传参:
- 数据报文:不管是dict还是str类型,默认都是application/json,表示以json的方式传参,格式:{“a”:1,“b”:2,“c”:3}
json.dumps(data)# 序列化:把dict格式的数据转换成str格式
json.loads(data)# 反序列化:把str格式的数据转换成dict格式
总结:
- data传参只能传简单的只有键值对的dict格式或者是str格式,json传参一般只能传dict格式(简单的和嵌套的都可以)
files传参——用于上传文件
涉及文件上传的接口,上传文件之前需要open文件,才能上传成功
#用open()方法找到文件,"rb"表示用二进制的方式打开
data={
"media":open(r"E:\shu.png","rb")
}
response = requests.post(url=url,files=data)#使用files上传文件
3、requests对于cookie鉴权以及session鉴权的处理
需要带请求头的接口以及需要cookie关联的接口如何测试
#通过正则表达式获取信息 从response.text数据中获取包含字段为'name="csrf_token"的第一个value值
csrf_token = re.search('name="csrf_token" value="(.*?)"',response.text)[1]
#请求需要带请求头的接口
headers={
"Accept":"",
"X-Requested-With":"XMLHttpRequest"
}
response = requests.post(url=rul,data=data,headers=headers,cookies=cookies)
cookie鉴权:网页的接口基本上都要做cookie鉴权
通过session实现cookie鉴权,这种常用
requests.session()
二、升华篇
pytest用例管理框架
pytest默认规则
- py文件必须要以test_开头或者 _test结尾
- 类名必须以Test开头
- 测试用例(方法名)必须以test_开头
pytest用例管理框架的作用
- 发现测试用例:从多个py文件中通过默认的规则去找测试用例
- 执行测试用例:顺序和条件
- 判断测试结果:断言
- 生成测试报告:html、allure
用例管理框架有哪些?
python:unittest、pytest
java:junit、testng
pytest全局观
- 它可以和所有的自动化测试工具selenium、requests、appium结合实现web自动化,接口自动化以及app自动化
- 可以跳过用例以及失败用例重跑
- 结合allure生成美观的测试报告
- 和jenkins持续集成
- 拥有强大的插件库:
- pytest-html——生成html测试报告
- pytest-xdist——多线程运行
- pytest-ordering——改变测试用例的执行顺序
- pytest-rerunfailures——失败用例重跑
- allure-pytest——生成allure测试报告
pytest运行方式
1、主函数运行(命令行的方式运行)
-v 输出更加详细的运行信息
-s 输出调试信息
-n 多线程运行
–reruns 失败用例重跑
–html 生成html测试报告
-m “分组名” 执行对应分组的用例
#运行pytest用例
if__name__ == '__main__':
pytest.main(['-vs','-n=2','--reruns=2','--html=./report.html'])#输出详细运行、调试信息,以2个线程运行,失败用例最多重跑2次,生成名为report.html的测试报告
2、实际工作中使用pytest.ini的配置文件来配置运行
pytest.ini如下:
[pytest]
addopts = -vs#addopts 用于配置执行命令
testpaths = ./testcase# testpaths 用于配置用例位置
python_files= Test_*.py #用于改变文件名的默认规则
python_classes = Test* #用于改变类名的默认规则
python_functions = test_* #用于改变用例名的默认规则
markers = ababa:maoyan #对用例进行分组 配合标记@pytest.mark.ababa 使用
前后置夹具,conftest.py
setup/teardown 在每个用例之前和之后执行一次
setup_class/teardown_class 在每个类之前和之后执行一次
实现部分前置:
@pytest.fixtrue
@pytest.fixtrue(scope=“作用域”,params=“数据驱动”,autouse=“自动执行”,ids=“自定义参数名”,name=“重命名”)
作用域:function、class、module、package/session
yield前为前置,yield后为后置
@pytest.fixtrue()通常和conftest.py文件一起使用
conftest.py名称是固定的,功能如下:
- conftest.py文件能够单独存放@pytest.fixtrue()的一些方法,用处是可以在多个py文件之间共享前置后置
- conftest.py里面的方法在调用时不需要导入,可以直接使用
- conftest.py可以有多个,也可以有多个不同层级
接口自动化框架封装
-
统一请求方式——使用request()方法统一代替post、get等方法
-
接口关联的封装——通过一个关联的yaml文件(.yml)来实现
-
在根目录下新建extract.yml
-
在common文件夹下新建yaml_util.py,见下:
-
import os class YamlUtil: #读取extract.yml文件 def read_exxtract_yaml(self,key): with open(os.getcwd()+"/extract.yml",mode='r',encoding='uft-8') as f: value = yaml.load(strean=f,Loader=yaml.FullLoader) return value[key] #写入extract.yml文件 def write_extract_yaml(self,data): with open(os.getcwd()+"/extract.yml",mode='a',encoding='uft-8') as f: yaml.dump(data=data,stream=f,allow_unicode=True) #写入extract.yml文件 def clear_extract_yaml(self): with open(os.getcwd()+"/extract.yml",mode='a',encoding='uft-8') as f: f.truncate()
-
pytest接口断言——assert
-
pytest结合allure-pytest生成allure测试报告
- 官网下载allure——放到没有中文的路径下,然后把bin目录配置到环境变量的path里面
- 重启pycharm——通过allure --version验证是否能够正常使用
- 执行命令
- 在temp文件夹下生成son格式的临时文件报告—— --alluredir ./temp
- 通过临时的json格式文件在reports文件夹下生成allure报告——os.system(“allure generate temp -o reports --clean”)
- allure报告的定制化
-
三、集成篇
接口自动化测试框架YAML数据驱动的封装
@pytest.mark.parametrize(args_name,args_value)
args_name:参数名
args_value:参数值(可以是list、tuple、字典列表、字典元组等)在数据中有多少个值,那么接口用例就会执行多少次
import pytest
class TestApi:
#基础用法
@pytest.mark.parametrize('args',['baili','xuance','ali'])
def test_api1(self,args):
print(args)
#解包用法
@pytest.mark.parametrize('name,age',[['baili',13],['xuance',12],['ali',14]])
def test_api2(self,name,age):
print(name,age)
if __name__ == '__main__':
pytest.main(['test_api.py'])
YAML详解
YAML也是一种数据格式,主要作用如下:
- 用于全局配置文件:环境、数据库信息、账号信息、日志格式、报告名称
- 用于接口自动化里面的多一些复杂的多接口串联
- 用于编写接口测试用例
YAML语法规则:
- 区分大小写
- 和python一样也是通过缩进的方式表示层级关系(不同的是不能使用tab缩进,只能使用空格)
- 和缩进多少层无关,只和左边是否对齐有关系
- #表示注释
数据组成方式:
-
map对象:键值对
name: xie
-
列表,用-开头的格式
- name1: xie - name2: yang - name3: yi
-
二者结合
- name:获得统一的鉴权码token request: method:get url:https:// data: grant_type:client_credential appid:wx21321321 secret:e339adk234123 validate:None
统一接口请求封装
将get、post方法等全部封装成同一方法,由传参决定请求方法
多种断言方式
多接口的场景串联
日志监控
包括日志文件生成 、控制台调试日志、邮件日志