转测试开发之 “api自动化测试” 急速版

AI摘要
本文介绍了基于Python的API自动化测试框架搭建流程,属于技术知识分享。内容涵盖pytest测试框架、requests库、allure报告生成、Jenkins集成等核心组件,并提供了从Excel读取测试用例、参数化执行、断言校验到日志记录和报告生成的完整代码示例,展示了如何构建一个结构化的接口自动化测试项目。

环境搭建

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 协议》,转载必须注明作者和本文链接
保持好奇,求知若饥,终身编程
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!