Excel接口测试自动化实战

python 复制代码
from string import Template

import jsonpath
import pandas as pd
import json
import os
import requests

def clean_text(text):
    """
    清理文本中的特殊字符,但保留JSON格式
    """
    if isinstance(text, str):
        # 先检查是否是JSON字符串
        try:
            # 如果是有效的JSON,直接返回原字符串
            json.loads(text)
            return text
        except json.JSONDecodeError:
            # 如果不是JSON字符串,再进行清理
            text = text.replace('\\\\', '\\')
            text = text.replace('\\n', ' ')
            text = text.replace('\\r', ' ')
            text = text.replace('\\t', ' ')
            text = text.replace('\\', '')
            text = ' '.join(text.split())
            return text.strip()
    return text


def excel_to_clean_json(excel_file='接口测试.xlsx', output_file='output.json'):
    """读取Excel并转换为清理后的JSON"""
    try:
        # 读取Excel
        df = pd.read_excel(excel_file, keep_default_na=False)

        # 清理数据
        for col in df.columns:
            df[col] = df[col].apply(clean_text)

        # 转换为JSON并保存
        data = df.to_dict('records')
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
        return data
    except Exception as e:
        print(f"处理失败: {e}")
        return None


def execute_test_case(test_case):
    """执行单个测试用例"""
    try:
        # 1. 解析URL参数
        url_params_str = test_case.get('URL参数', '{}')
        url_params = json.loads(url_params_str) if url_params_str else {}

        # 2. 解析JSON参数
        json_params_str = test_case.get('JSON参数', '{}')
        json_params = json.loads(json_params_str) if json_params_str else {}

        # 3. 获取接口信息
        global dic
        url = test_case.get('接口URL', '')

        if "$" in url:
            url = Template(url).substitute(dic)
            print(url, 'iii')
        method = test_case.get('请求方式', 'get').lower()
        print(f"📋 测试用例: {test_case.get('描述', '未知用例')}")
        print(f"🌐 接口地址: {url}")
        print(f"📤 请求方式: {method}")
        print(f"🔗 URL参数: {url_params}")
        print(f"📦 JSON参数: {json_params}")

        # 4. 根据请求类型发送请求
        headers = {'Content-Type': 'application/json'}


        if method == 'post':
            # POST请求通常将参数放在body中
            response = requests.post(url, json=json_params, params=url_params, headers=headers)
            if test_case.get('提取参数', '{}'):
                lst = jsonpath.jsonpath(response.json(), "$.." + test_case.get('提取参数', '{}'))
                dic[test_case.get('提取参数', '{}')] = lst[0]
        elif method == 'get':
            response = requests.get(url, params=url_params, headers=headers)
            if test_case.get('提取参数', '{}'):
                lst = jsonpath.jsonpath(response.json(), "$.." + test_case.get('提取参数', '{}'))
                dic[test_case.get('提取参数', '{}')] = lst[0]
        else:
            # 其他请求方式
            response = requests.request(method=method, url=url, json=json_params, params=url_params, headers=headers)
            if test_case.get('提取参数', '{}'):
                lst = jsonpath.jsonpath(response.json(), "$.." + test_case.get('提取参数', '{}'))
                dic[test_case.get('提取参数', '{}')] = lst[0]

        print(f"📥 响应状态码: {response.status_code}")
        print(f"📥 响应内容: {response.text}")
        print("-" * 50)

        # 解析JSON响应
        try:
            result = response.json()
            return result
        except:
            return {'text': response.text, 'status_code': response.status_code}

    except Exception as e:
        print(f"❌ 执行测试用例时发生错误: {e}")
        return None


def main():
    """主函数"""

    # 1. 从Excel读取数据
    data = excel_to_clean_json('接口测试.xlsx')
    if not data:
        print("❌ 无法读取Excel数据")
        return

    print(f"✅ 成功读取 {len(data)} 条测试用例")
    print("=" * 50)

    # 2. 遍历并执行测试用例
    results = []
    for i, test_case in enumerate(data):
        print(f"🚀 执行第 {i + 1} 条测试用例")
        result = execute_test_case(test_case)
        results.append(result)

    # 3. 分析结果
    print("\n📊 测试结果分析:")
    for i, (test_case, result) in enumerate(zip(data, results)):
        print(f"{i + 1}. {test_case.get('描述', '未知用例')}: ", end='')
        if result and isinstance(result, dict):
            if result.get('code') == 0 or result.get('code') == 200:
                print("✅ 测试通过")
            elif result.get('code') == -1:
                print("❌ 测试失败 - 错误码: -1")
                print(f"   错误信息: {result.get('msg', '未知错误')}")
            else:
                print(f"⚠️  其他响应: {result}")
        else:
            print("❓ 未返回可解析的JSON响应")


if __name__ == "__main__":
    dic = {}
    main()

此方法可以遍历Excel表格里面的接口数据。

相关推荐
2601_949847753 分钟前
Cookie 跨端三方库仓颉适配全流程
python·django·flask
万粉变现经纪人6 分钟前
如何解决 pip install 安装报错 检测到 yanked 版本需更换可用版本 问题
人工智能·python·scrapy·numpy·pandas·pyqt·pip
香蕉大香蕉(06敬畏市场)11 分钟前
高频八股 · Java 并发编程(10):异步、ThreadLocal 与虚拟线程(收官)
java·开发语言·网络·jvm·python·ai·实习
JustNow_Man17 分钟前
【Harness】本地文本向量化搜索解决方案--qmd
git·python·算法
小林ixn17 分钟前
用 FastAPI + SQLAlchemy 从零手搓一个博客系统:一套能落地、能讲清楚的 RESTful 后端
后端·python·fastapi
小年糕是糕手18 分钟前
【AI】用 Python 做一个 AI 截图检索助手:把收藏夹里的截图找回来
linux·人工智能·python·chatgpt·agent·codex·deepseek
2601_9679801134 分钟前
wxPython 入门教程.pdf
python·wxpython·gui·教程·移植性
计算机毕业编程指导师1 小时前
2027计算机毕设选题指南:网站AI化、大数据预测+算法(XGBoost/LightGBM)、深度学习三方向57题+选题方法论
大数据·python·计算机·毕业设计·课程设计·毕设选题·1024程序员节
李航19831 小时前
DeepSeek AI建模(二)让AI建第一个模型
人工智能·python·计算机视觉·ai·ai编程
小嘉丶学长1 小时前
Day06 · 数据类型与类型检测
开发语言·python·学习·1024程序员节