测试学习之——Pytest Day5
一、接口测试用例
1、设计用例内容
- 名字
- 标记(可选)
- 步骤:
- 请求接口: GET https://www.baidu.com
- 响应断言; status_code == 200
- 提取变量: json()['code']
2、YAML表示用例
name: 登录成功的用例
steps:- request:method: POSTurl: http://127.0.0.1:5000/loginparams:json:{"username":"admin","password":"admin123"}- response:status_code: 200json:code: 0msg: 登录成功data:login_time:username: admin- extract:token: [json,$.data.token]
二、封装接口自动化框架
1、请求接口
外部工具请求接口:requests
HTTP协议抓包,请求组成由三部分组成:
- 行:方法+地址(必填)
- 头:请求头(键值对)
- 体:参数内容
import requests
### 1、方法
url = "http://127.0.0.1:5000/login"
#GET方法
requests.get(url)
#POST方法
requests.post(url)
#任意方法
requests.requests(''MOV',url)
头:
import requests
###2、头
url = "http://127.0.0.1:5000/login"
method = "POST"def test_login():r = requests.request(method,url,headers={#字符串字典"1":"a","2":"b"}
)print(r.status_code)print(r.text)
参数:
import requestsurl = "http://127.0.0.1:5000/login"
method = "POST"requests.requests(method,url,json ={"a":1,"b":[1,2,3],"c":{}}
)
2、断言响应
- 响应包含什么
- 行:状态码
- 头:响应头(键值对)
- 体:响应内容
- 响应如何断言
import requests
#断言全部内容
from responses_validator import validator### 1、方法
url = "http://127.0.0.1:5000/login"json = {"username": "admin","password": "admin123"
}
method = "POST"def test_login():r = requests.request(method,url,json = json)# 断言单个内容是否正确assert r.status_code == 200assert 'admin' in r.textassert r.json()['data']["username"]=="admin"#断言全部内容validator(r,status_code=200,text='*admin*',json={"data": {"username": "admin"}})print(r.status_code)print(r.text)print(r.headers)print(r.json())
3、变量提取
基本原则:
- JSON:JSONPATH
- HTML:XPATH
- 字符串:RE(兜底)
import jsonpathdef extract(resp,name,exp):try:resp.json = resp.json()except:resp.json = {}attr = getattr(resp, name)res = jsonpath.jsonpath(attr,exp)return res
from extract_utils import extractvar = extract(r,'json','$..username')print(var)
4、框架落地封装
import requests
import responses_validator
from commons.extract_utils import extractimport logginglogger = logging.getLogger("hejie")
def runner(k,v,my_var):match k:case 'requests':logger.info('1.正在发送请求。。。')logger.info(f'{v}')my_var['resp'] = requests.request(**v)#字典使用 **case 'response':logger.info('2.正在验证响应。。。')logger.info(f'{v}')responses_validator.validator(my_var['resp'] ,**v)case 'extract':logger.info('3.正在提取变量。。。')for var_name,var_exp in v.items():value = extract(my_var['resp'] ,*var_exp) #列表使用 *logger.info(f'{var_name} = {value}')
import allurefrom commons.extract_utils import extractfrom commons.runner_utils import runnerdef test_yaml():my_var = {}data = extract("/Users/user/python/tmp_1112/tests/test_api_1.yaml")allure.title(data['name'])for step in data['steps']:for k ,v in step.items():runner(k,v,my_var)
import pytest
import ospytest.main()#执行命令
os.system("allure generate ./allure-results -o ./allure-report --clean")
name: 登录成功的用例
steps:- request:method: POSTurl: http://127.0.0.1:5000/loginparams:json:{"username":"admin","password":"admin123"}- response:status_code: 200json:code: 0msg: 登录成功data:login_time:username: admin- extract:token: [json,$.data.token]
[pytest]addopts = --alluredir=./allure-results --clean-alluredir -m web --driver chrome -vsmarkers =
api:接口测试
web:UI测试
ut:单元测试
login:登录相关
pay:支付相关
ddt:数据驱动测试log_file= ./logs/pytest.log
log_file_level= info
log_file_format= %(levelname)-8s %(asctime)s [%(name)s:%(lineno)s] : %(message)s
log_file_date_format= %Y-%m-%d %H:%M:%S
;记录用例执行结果
result_log_enable=1
;记录用例分割线
result_log_separator=1
;分割线等级
result_log_level_separator= warning
;异常信息等级
result_log_level_verbose= info