转测试开发之 “api自动化测试” 急速版
环境搭建
python
allure 用来生成测试报告 分为客户端和 python依赖 都需要安装
Jenkins 如果需要自动化目前我只了解到用它可以实现
pytest 测试框架
requests 第三方 HTTP 客户端库
执行测试命令 python demo.py 或者 pytest -m api
知识点
@pytest.xxx 都是装饰器
assert 断言,这一个重要的知识点之前的其他文章都漏写了
脚本编写
dem.py
import os
import sys
import subprocess
import requests
import pandas as pd
import pytest
import jsonpath
import logging
import allure
# 确保项目根目录在 sys.path 中,方便导入 config 包
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if PROJECT_ROOT not in sys.path:
sys.path.insert(0, PROJECT_ROOT)
from config.api_config import BASE_URL
from utils.globals import g_var
df = pd.read_excel("files/2026-01-06.xlsx")
print(df.head()["接口URL"])
def load_cases_from_excel(path):
df = pd.read_excel(path)
df = df.fillna("")
cases = df.to_dict(orient="records")
return cases
cases = load_cases_from_excel("files/2026-01-06.xlsx")
@pytest.mark.parametrize("case_info", cases)
@pytest.mark.api
def test_api(case_info):
# 替换接口URL中的变量
url = BASE_URL + case_info["接口URL"]
dic = g_var().get_all_dict()
log = logging.getLogger(__name__)
if '$' in case_info["URL参数"]:
url = url + Template(url).substitute(dic)
if case_info["需要参数"] != "":
print(case_info["需要参数"], "---------------")
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer " + dic[case_info["需要参数"]]
}
else:
print(case_info["提取参数"], "没有需要参数")
headers = {
"Content-Type": "application/json"
}
# 替换请求头中的变量
method = case_info["请求方式"]
data = case_info["JSON参数"]
response = requests.request(method, url, headers=headers, data=data)
# 如果需要提取参数
if case_info["提取参数"] != "":
g_var().set_dict(case_info["提取参数"], jsonpath.jsonpath(response.json(), '$..accessToken')[0])
log.info("响应json: %s", response.json())
log.info("提取参数: %s", jsonpath.jsonpath(response.json(), '$..accessToken')[0]) # 如果是 JSON,也可以用 response.json()
log.info("保存参数: %s", dic)
# 记录日志
log.info("请求地址: %s", url)
log.info("请求方式: %s", method)
log.info("请求头: %s", headers)
log.info("请求体: %s", data)
log.info("响应状态码: %s", response.status_code)
log.info("响应文本: %s", response.text)
# 使用 allure 的 attachment 功能,在报告中附加详细信息
allure.attach(
f"请求地址: {url}\n请求方式: {method}\n请求头: {headers}\n请求体: {data}",
name="请求信息",
attachment_type=allure.attachment_type.TEXT
)
allure.attach(
f"响应状态码: {response.status_code}\n响应头: {dict(response.headers)}\n响应内容: {response.text}",
name="响应信息",
attachment_type=allure.attachment_type.TEXT
)
json_data = response.json()
assert json_data["code"] == 0
if __name__ == "__main__":
allure_results_dir = "allure-results"
allure_report_dir = "allure-report"
os.makedirs(allure_results_dir, exist_ok=True)
# 运行测试(加上日志收集参数,让 allure 能捕获日志)
exit_code = pytest.main([
"-vs",
"-m", "api",
"--alluredir", allure_results_dir,
"--log-cli-level=INFO", # 收集 INFO 级别及以上的日志
"--log-cli-format=%(asctime)s [%(levelname)s] %(message)s", # 日志格式
"--log-cli-date-format=%Y-%m-%d %H:%M:%S" # 时间格式
])
# 测试完成后,生成并打开 allure 报告
try:
# 生成 HTML 报告
subprocess.run([
"allure", "generate", allure_results_dir,
"-o", allure_report_dir,
"--clean"
], check=True, cwd=PROJECT_ROOT)
# 打开报告(会自动在浏览器打开)
subprocess.run([
"allure", "open", allure_report_dir
], check=True, cwd=PROJECT_ROOT)
except subprocess.CalledProcessError as e:
print(f"生成 allure 报告失败: {e}")
print("请确保已安装 allure 命令行工具")
except FileNotFoundError:
print("未找到 allure 命令,请先安装 allure")
print("安装方法: brew install allure 或手动下载安装")
总结
祝你好运!
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: