一、接口测试用例
1、设计用例内容
- 名字
- 标记(可选)
- 步骤:
- 请求接口: GET https://www.baidu.com
- 响应断言; status_code == 200
- 提取变量: json()['code']
2、YAML表示用例
name: 登录成功的用例
steps:
- request:
method: POST
url: http://127.0.0.1:5000/login
params:
json:{
"username":"admin",
"password":"admin123"
}
- response:
status_code: 200
json:
code: 0
msg: 登录成功
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 requests
url = "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 == 200
assert 'admin' in r.text
assert 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 jsonpath
def 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 extract
var = extract(r,'json','$..username')
print(var)
4、框架落地封装
import requests
import responses_validator
from commons.extract_utils import extract
import logging
logger = 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 allure
from commons.extract_utils import extract
from commons.runner_utils import runner
def 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 os
pytest.main()
#执行命令
os.system("allure generate ./allure-results -o ./allure-report --clean")
name: 登录成功的用例
steps:
- request:
method: POST
url: http://127.0.0.1:5000/login
params:
json:{
"username":"admin",
"password":"admin123"
}
- response:
status_code: 200
json:
code: 0
msg: 登录成功
data:
login_time:
username: admin
- extract:
token: [json,$.data.token]
[pytest]
addopts = --alluredir=./allure-results --clean-alluredir -m web --driver chrome -vs
markers =
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