引言
上篇文章《Pytest-BDD实现接口自动化测试,并附全部代码》我们介绍了怎么使用Pytest-BDD实现接口自动化测试,本篇文章主要介绍怎么去做流程性接口测试和自定义测试报告相关内容。
流程性接口测试
流程性接口测试,指的是一个业务流需要多个接口完成,比如查询商品,然后根据查询接口返回的商品ID,去购买商品。实现的方式为,调用查询接口后,将接口返回的商品ID保存,然后购买商品时,使用保存的商品ID去调用购买接口。
feature文件
Feature: 购买商品接口测试
Scenario: 查询商品接口
Given 初始化
Given 登录
When 调用 "/search" 接口
When 使用 "post" 请求
When 参数类型 "json"
When 请求头 "{'Content-Type': 'application/json'}"
When 参数 "{'key_word': '茶叶'}"
When 校验类型 "包含校验"
When 校验文本 "成功"
When 保存接口返回字段 "id"
Scenario: 购买商品接口
Given 登录
When 调用 "/buy" 接口
When 使用 "post" 请求
When 参数类型 "json"
When 请求头 "{'Content-Type': 'application/json'}"
When 参数 "{'Id': '$id'}" 使用保存参数 "id"
When 校验类型 "包含校验"
When 校验文本 "成功"
Then 调用成功
python文件
创建一个save_key字典,将步骤中要保存的参数存到字典中,然后在请求接口时,将$修饰的字符串替换成要使用的参数。其他行为的实现代码,参考上一篇文章。
@when(parsers.parse('保存接口返回字段 "{save_data}"'))
def save_data(api_tool, save_data):
test_data = {'test_result': {'text': api_tool.result_text, 'type': api_tool.test_result_type,
'result_type': api_tool.result_type, 'key': api_tool.result_key}}
test_body = {'URL': api_tool.api, 'method': api_tool.methods, 'data_type': api_tool.data_type,
'headers': api_tool.headers, 'params': api_tool.params, 'file': api_tool.file}
response = api_tool.call_api(test_body)
logging.info('接口返回:' + str(response.text))
keys = analysis_dict(response.text, save_data)
save_key[save_data] = keys
if api_tool.is_logout:
do_logout(api_tool.headers['ticket'])
if api_tool.test_result_type is not None:
assert_tool(response, test_data)
@when(parsers.parse('参数 "{re_params}" 使用保存参数 "{save_params}"'))
def use_save_data(api_tool, re_params: str, save_params):
str_params = re_params.replace('$' + save_params, save_key[save_params])
api_tool.params = ast.literal_eval(str_params)
@then('调用成功')
def asserts(api_tool):
test_data = {'test_result': {'text': api_tool.result_text, 'type': api_tool.test_result_type, 'result_type': api_tool.result_type, 'key': api_tool.result_key}}
test_body = {'URL': api_tool.api, 'method': api_tool.methods, 'data_type': api_tool.data_type, 'headers': api_tool.headers, 'params': api_tool.params, 'file': api_tool.file}
response = api_tool.call_api(test_body)
logging.info('接口返回:' + str(response.text))
if api_tool.is_logout:
do_logout(api_tool.headers['ticket'])
if api_tool.test_result_type is not None:
assert_tool(response, test_data)
测试报告
使用pytest-html和junitxml生成报告
pytest框架中,可以使用pytest执行命令,指定生成junit格式的测试报告,使用方法:
pytest --junitxml=junit.xml test.py
如果想用生成html格式的测试报告,可以使用pytest-html插件,使用方法:
首先安装pytest-html
pip install pytest-html
然后通过pytest命令,执行测试的时候指定生成报告,–self-contained-html这个选项的作用是将 CSS、JavaScript、图片等资源都嵌入到生成的 HTML 文件中,使得测试报告可以独立于外部资源而展示,无需担心样式或脚本文件因路径问题而加载失败。
pytest --html=report.html --self-contained-html test.py
自定义测试报告
在项目根目录下,创建conftest.py文件,使用pytest的钩子函数来实现。没执行一次用例,钩子函数会获取执行结果,根据执行结果来封装自己的测试报告。
import pytest
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
# 执行默认的钩子
outcome = yield
report = outcome.get_result()
返回的report中,包含了测试结果信息