Pytest +requests+ Allure
这个框架基于python的的 Pytest 进行测试执行,并结合 Allure插件 生成测试报告的测试框架。采用 关键字驱动 方式,使测试用例更加清晰、模块化,同时支持 YAML 文件来管理测试用例,方便维护和扩展。
测试用例:YAML 文件
主要包含测试用例的步骤、调用的函数、函数所需的参数。
分层结构
- config 层:全局配置(
base_url
、公共变量)。 - steps 层:测试步骤(请求 -> 提取 -> 断言)。
模板引擎
- 支持
{{}}
变量插值语法。 - 支持环境变量注入(
${ENV_VAR}
)。
示例:登录失败测试用例(用户名为空)
desc: 登录失败测试用例--用户名为空
steps:
- 发送Post请求:
关键字: request_post_form_data
URL: "{{url}}"
PARAMS:
s: /api/user/login
application: app
DATA:
accounts: ''
pwd: 123456
type: username
- 通过JSONPATH提取数据-MSG:
关键字: ex_jsonData
EXVALUE: $..msg
INDEX: 0
VARNAME: msg_success
- 断言-文本断言-等于:
关键字: assert_text_comparators
VALUE: "{{msg_success}}"
EXPECTED: 登录账号不能为空
OP_STR: ==
关键字驱动模式(封装 Keywords 函数)
Keywords
类封装了 YAML 文件中定义的请求关键字,并在执行步骤时,将有用的信息(如 token
、response
)存入全局字典 gc
,同时,每个方法都使用 @allure.step
装饰器,以生成测试报告的步骤。
关键字实现示例
class Keywords:
@allure.step('发送POST请求')
def request_post(self, **kwargs):
response = requests.post(**kwargs)
gc.set_dict('current_response', response)
return response
@allure.step('发送GET请求')
def request_get(self, **kwargs):
response = requests.get(**kwargs)
gc.set_dict('current_response', response)
return response
@allure.step('发送PUT请求')
def request_put(self, **kwargs):
response = requests.put(**kwargs)
gc.set_dict('current_response', response)
return response
@allure.step('发送POST请求--form_data表单的请求')
def request_post_form_data(self, **kwargs):
url = kwargs.get('URL', None)
params = kwargs.get('PARAMS', None)
data = kwargs.get('DATA', None)
headers = kwargs.get('HEADERS', None)
request_data = {'url': url, 'params': params, 'data': data, 'headers': headers}
response = self.request_post(**request_data)
return response
Pytest 框架入口
import os
import pytest
pytest_args = [
'-v', '-s', '--capture=sys', '--clean-alluredir', '--alluredir=allure-results',
'--type=yaml', '--cases=./data/yaml_testcase', './core/ApiTestRunner.py'
]
pytest.main(pytest_args)
使用 pytest.main
函数,同时指定运行参数,包括 Allure
测试报告数据目录和运行的 py
脚本。
用例运行脚本
class TestRunner:
def test_case_execute(self, get_dict_token, caseinfo):
try:
allure.dynamic.title(caseinfo['_case_name']) # 自定义用例标题
local_context = caseinfo.get('context', {})
kw = Keywords()
# 解析测试用例步骤
steps = caseinfo.get('steps', None)
for step in steps:
step_name = list(step.keys())[0]
step_value = list(step.values())[0]
context = copy.deepcopy(g_context().show_dic())
context.update(local_context)
step_value = eval(ReFresh(step_value, context))
with allure.step(step_name):
key = step_value['关键字']
try:
key_func = kw.__getattribute__(key)
except Exception as e:
print(e)
key_func(**step_value)
except Exception as e:
assert False, f"核心执行器或是核心执行器调用的关键字有错误: {e}"
finally:
print('---执行用例完成---')
此运行脚本的功能:
- 读取 YAML 测试用例 (
caseinfo
变量)。 - 逐步运行测试用例步骤 (
steps
)。 - 使用
Keywords
类中的函数执行测试操作。 - 通过 Python 反射机制动态获取
Keywords
类中的方法并执行。
测试用例执行全流程
- 测试用例按照 YAML 规范编写,指定每一步测试步骤。
- 运行脚本读取 YAML 文件。
- 逐步执行 YAML 中定义的步骤,并调用
Keywords
类中的方法。
技术要点
- YAML 文件管理测试用例。
- 采用关键字驱动模式 设计测试用例执行框架,使用例执行更加清晰。
- 使用全局字典管理数据,处理测试用例之间的关联情况。
- 集成 Allure 生成测试报告,提供详细的测试结果。