Python接口自动化学习
接口自动化
基于代码的接口自动化,持续整理中
需要了解掌握的技能如下:
Pytho+Requests+Yaml+Pytest+-Allure+Logging+热加载+Jenkins持续集成接口自动化
Requests模块
用于发送Http请求以及接口http响应的python的第三方库
安装命令如下: pip install requests
解析requests底层原理:
requests一般常见使用方法如下:
def get(url, params=None,**kwargs ): def post(url, data=None,json=None,**kwargs ): def put(url,data=None,**kwargs ): def delete(url,**kwargs ): def request(method,url,**kwargs): 是get,post,put,delete统一调用的方法 def session():会话,登陆和退出就是一个会话 session对象的request方法 session对象能够自动关联Cookie
具体解析def 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): 参数具体如下: method 请求方式 url 请求路径 params=None get请求传参 data=None post或put请求传参 json=None post请求传参 headers=None 请求头 cookies=None Cookie信息 files=None 文件上传 auth=None 鉴权 timeout=None 超时处理 allow_redirects=True 是否允许重定向 proxies=None 代理 hooks=None 钩子 stream=None 文件下载 verify=None 证书验证 cert=None CA证书
调用request()方法后,输出结果有如下几类:
rep = requests.request() print(rep.text) #返回字符串的数据 print(rep.content) #返回字节格式的数据 print (rep.json) #返回字典格式的数据 print(rep.status_code) #状态码 print(rep.reason) #返回状态信息 print( rep.cookies) #返回cookie信息 print(rep.encoding) #返回编码格式 print(rep.headers) #返回响应头信息
以下代码举例简单应用:
import pytest import requests class TestApi: access_token = "" #类变量,也可理解类似为全局变量 def test_get_token(self): #获取鉴权码 url = "请求地址" datas = {"请求数据"} res=requests.get(url=url,params=datas) #get请求 result = res.json() TestApi.access_token = result[ "access_token"] #此处获取access_token方便后面调用 print(res.json()) def test_edit_flag(self): url="请求地址" + TestApi.access_token #此处需要用到access_token,因此需调用类变量access_token = "" 数据 datas = {"请求数据"} res = requests.post(url=url,json=datas) #post请求 print (res.json()) def test_file_upload(self): #文件上传 url="请求地址"+TestApi.access_token datas ={"media" : open("文件路径" , mode="rb")} res = requests.post(url=url,files=datas) print(res.json()) if __name__ == '__main__': pytest.main([ '-vs']) #入口,执行所有用例,并打印
Pytest模块
pytest是一个非常成熟的python用例测试框架(单元测试框架),它可以和很多的工具或框架,selenlum,requests,applum实现多种自动化测试。
它可以和allure结合生成美观的报告以及和jenkins实现持续集成.
默认测试用例的规则:
1.模块名(py文件)必须以test_开头或_test结尾。
2类名必须Test开头
3.用例名必须以test_开头
json是字典的字符串的格式,两种可以相互转换
作用:
1.发现用例:根据每个框架默认的规则去发现并且加载测试用例
2.执行用例:将测试用例按照一定的顺序和条件执行,并生成结果
3.判断结果:通过断言来判断实际结果和预期结果是否相同
4.生成报告:统计测试进度,耗时,通过率,生成报告。
1.插件安装
pytest最重要的是它有很多插件:
pytest pytest-html 生成html测试报告 pytest-xdist 多线程运行 pytest-ordering 改变测试用例的执行顺序 pytest-rerunfailures 失败用例重跑 pytest-base-url 管理基础路径 allure-pytest 生成allure测试报告
一般实际项目开发当中都会使用requrements.txt文件保存插件名称,并通过: pip install -r requrements.txt安装所有插件
2.测试用例前后置-fixture固件
@pytest.fixtrue()一般会和conftest.py文件一起使用,conftest.py名称是固定的,功能很强大
1.conftest.py文件是单独存放@pytest.fixtrue()的方法。用处是可以在多个py文件之间共享前置配置
2.conftest.py里面的方法在调用时不需要导入,可以直接使用
3.conftest.py可以有多个。也可以有多个不同层级
装饰器: @pytest.fixture(scope="",params=""autouse="",ids="",name="") scope:作用域 function(函数。用例,默认) class 类 module 模块 package/session 会话 params: 数据驱动 autouse:自动作用还是手动作用 ids:当数据驱动时更改参数名 name:fixture的别名 scope表示的是被@pytest.fixture标记的方法的作用域。function(默认),class,module,package/session 如果生效范围:scope=“session”,那么,在该目录下的所有的测试用例只会执行一次 如果生效范围:scope=“module”那么,在该目录下的每个py文件会执行一次 如果生效范围:scope=“class”那么,在该目录下的每个类会执行一次 如果生效范围:scope=“function”那么,在该目录下的每个测试函数会执行一次
案例
import pytest @pytest.fixture(scope="function" ,autouse=True) #可将部分用例前置,那个需要前置就放那个函数中 def assert_exe(): print('测试用例执行前') yield print('测试用例执行后') @pytest.fixture(scope="session",autouse=True) #用于会话 def clear_yaml(): YamlUtil().clear_extract_yaml()
3.Yaml模块
yaml简介
yaml是一种数据类型,它可以和json之间灵活的切换,支持:注释,换行,字符串,裸字符串等
用途:
1.配置文件
2.编写测试用例数据结构:
1.Map对象 (dict) (键:(空格)值) 如: name: 3
⒉.数组(Ilist) 用一组横线"-" 开头来表示如:
- name1: 哈哈
- name2: 嘿嘿
- name3: 呵呵
3.1yaml文件动态参数
在接口自动化中,也可以使用 YAML 文件的动态参数来实现变量化配置。具体实现方法如下:
1. 在 YAML 文件中定义动态参数。如config.yaml中动态参数如下
# 定义动态参数 base_url: ${BASE_URL} username: ${USERNAME} password: ${PASSWORD}
2. 在代码中读取 YAML 文件并解析动态参数。
import yaml # 读取 YAML 文件 with open('config.yaml', 'r') as f: config = yaml.safe_load(f) # 解析动态参数 base_url = config['base_url'].format(BASE_URL=input_base_url) username = config['username'].format(USERNAME=input_username) password = config['password'].format(PASSWORD=input_password) #其中,`input_base_url`、`input_username` 和 `input_password` 是根据实际情况设置的变量,代表要请求的基础 URL、用户名和密码。
3. 在测试用例中使用解析后的参数。在测试用例test.py中举例如下
import requests # 发送请求 response = requests.post( url=base_url + '/login', data={ 'username': username, 'password': password } ) # 断言响应结果 assert response.status_code == 200 assert '登录成功' in response.text
通过上述方法,就可以方便地在接口自动化中使用 YAML 文件的动态参数来进行变量化配置。这样可以让测试用例更加灵活、可维护。
Pytest框架封装
举一个案例说明:
Ⅰ一个测试案例用Test开头,如截图中的TestYhzx
Ⅱ一个案例中用如下文件搭配结合组成一个框架,框架中的内容介绍如下:
api: 这是一个package,用来各个接口的类封装,按照你的业务可以将其分为多个package
common: 这是一个package,用来封装底层公共方法,比如requests库封装、文件操作封
装、加解密封装、redis封装、数据库封装、随机数据封装、日志封装
testcases: 这是一个package,用来编写封装我们的测试用例
confifig: 这是一个目录,用来存放基本的配置信息,比如数据库、redis、各个服务域名、各个
环境的配置
data:这是一个目录,用来存放测试用例数据
logs: 这是一个目录,用来存放收集到的日志文件
report: 这是一个目录,用来存放测试结果数据以及生成的测试报告
conftest.py: 用来重写pytest自带的一些钩子函数以及自定义的fifixture
pytest.ini: pytest的基本配置文件
run.py: 框架整体的统一执行入口