python-pytest学习

一、先明确你的需求对应的技能 / 库清单(按优先级排序)

你的核心需求是「读取标准化用例→生成用例→执行用例」,结合你已掌握的 pandas/openpyxl 基础,需要补充的技能 / 库如下:

表格

类别 核心库 / 技能 作用说明
用例执行核心 pytest(必学) 自动化用例执行、断言、报告生成、用例管理
用例生成 / 读取 1. 已掌握的 pandas/openpyxl(复用)2. yaml/json 库(可选) 读取用例文件(Excel/YAML/JSON)、生成用例
执行辅助 1. requests(接口用例)/selenium/appium(UI 用例)2. logging(日志) 实际执行用例(接口 / UI)、记录执行过程
结果输出 pytest-html(测试报告)、allure-pytest(可视化报告) 生成易读的测试报告

用例的读取和写入优先使用pandas/openpyxl来读取或写入(写入pass,写入备注,写入测试时间,和地点,地点需要自己填写,位置需要自己填写)


二、pytest 库超详细讲解(贴合你的用例执行需求)

pytest 是 Python 最主流的自动化测试框架,比自带的 unittest 更简洁、灵活,完全适配「读取 - 生成 - 执行用例」的全流程。

1. 核心优势(为什么选 pytest 而非其他)
  • 语法极简:无需类 / 继承,普通函数加装饰器就能当用例
  • 用例灵活:支持参数化(批量执行多组用例)、跳过 / 标记用例;
  • 插件丰富:自带 1000+ 插件(报告、并行执行、失败重跑等);
  • 兼容广泛:能执行 unittest 写的用例,也能和 pandas/Excel 无缝结合。
2. 基础安装
复制代码
pip install pytest  # 核心库
pip install pytest-html  # 生成HTML报告(必备)
pip install allure-pytest  # 可选,生成更美观的Allure报告
3. 核心语法(从简单到复杂,贴合你的用例场景)
(1)最基础的用例写法(单条用例)

首先我们有如下一个标准化表格

用例 ID 用例名称 参数 a 参数 b 操作步骤 预期结果 用例状态
TC001 正数相加 2 3 1、a+b 5 执行
TC002 零加正数 0 5 1、a+b 5 执行
TC003 负数相加 -2 -3 /1、a-b 1 执行

python,以下代码实现了,以下功能,

python 复制代码
import pytest
import pandas as pd

# 操作映射表:步骤字符串 → 计算函数
OPERATIONS = {
    "a+b": lambda a, b: a + b,#这个字典非常特殊,它的value实际上是个函数
    "a-b": lambda a, b: a - b
}
#到时候读取到的字符会在这里索引,如果存在就装换为对应的参数值

def parse_operation(step_str):#这里的形参就是读取表格中的操作步骤那一个单元格的所有数据
    """解析操作步骤字符串,提取核心操作"""
    if "、" in step_str:
        return step_str.split("、")[1].strip() #这段代码的作用是分割字符为字符列表,然后取一个特定字符,最后去除一些额外符号
    return step_str.strip()

# 读取所有用例并参数化
df = pd.read_excel("用例文件.xlsx", sheet_name="加法用例")#确认读取的用例存储地址
df = df[df["用例状态"] == "执行"] #筛选出所有用例标注为执行的用例,其他用例不执行

test_data = [
    (
        row["参数a"],
        row["参数b"],
        row["预期结果"],
        row["操作步骤"]
    )
    for _, row in df.iterrows()
]

@pytest.mark.parametrize("a, b, expected, step", test_data)
def test_calculate(a, b, expected, step):
    # 1. 解析操作步骤
    op_key = parse_operation(step)
    if op_key not in OPERATIONS:
        pytest.fail(f"不支持的操作步骤:{step}")#如果代码执行到pytest.fail则不会再执行其他语句代码到这里就结束了
    
    # 2. 动态执行对应操作
    calc_func = OPERATIONS[op_key]#将函数名称赋值给calc变量
    actual = calc_func(a, b)      #calc就变成变量了
    
    # 3. 断言结果
    assert actual == expected, \
        f"操作:{op_key},实际:{actual},预期:{expected}"

执行命令

复制代码
pytest test_demo.py -v  # -v 显示详细执行结果
(2)参数化:批量执行 Excel 中的多组用例(核心!)

你的需求是「读取标准化用例→生成用例」,参数化是实现这个需求的核心:

python

复制代码
# test_param.py
import pytest
import pandas as pd

# 1. 读取Excel中的所有用例数据
df = pd.read_excel("用例文件.xlsx", sheet_name="加法用例")
# 把DataFrame转成列表(每个元素是一组用例参数)
test_data = [(row["参数a"], row["参数b"], row["预期结果"]) for _, row in df.iterrows()]

# 2. 参数化装饰器:批量传入用例数据
@pytest.mark.parametrize("a, b, expected", test_data)
def test_add_param(a, b, expected):
    # 执行用例逻辑
    actual = a + b
    # 断言
    assert actual == expected

效果:Excel 中有多少行用例,pytest 就自动执行多少条,每条结果独立显示。

(3)用例管理:标记 / 跳过用例

python

运行

复制代码
# 标记重要用例(执行时可筛选)
@pytest.mark.smoke  # 冒烟用例标记
def test_login():
    assert True

# 跳过某个用例
@pytest.mark.skip(reason="该用例暂未实现")
def test_pay():
    assert False

# 按标记执行用例(只执行冒烟用例)
# 命令行:pytest -m smoke
(4)生成测试报告(必备)

bash

复制代码
# 生成HTML报告(执行后会生成report.html文件)
pytest test_param.py --html=report.html --self-contained-html

报告包含:用例总数、通过数、失败数、失败原因、执行时间,直接发给同事 / 领导即可。

4. 完整流程示例(贴合你的需求)

python

运行

复制代码
# test_case_exec.py
import pytest
import pandas as pd

# 步骤1:读取Excel中的标准化用例
def read_test_cases(file_path, sheet_name):
    df = pd.read_excel(file_path, sheet_name=sheet_name)
    # 过滤有效用例(比如只执行状态为"执行"的用例)
    df = df[df["用例状态"] == "执行"]
    return df

# 步骤2:生成并执行用例
test_cases = read_test_cases("标准化用例.xlsx", "接口用例")
# 提取用例参数:接口URL、请求参数、预期响应码
test_data = [
    (row["URL"], row["请求参数"], row["预期响应码"]) 
    for _, row in test_cases.iterrows()
]

@pytest.mark.parametrize("url, params, expected_code", test_data)
def test_api_case(url, params, expected_code):
    # 步骤3:执行用例(以接口用例为例,需安装requests)
    import requests
    response = requests.get(url, params=eval(params))  # eval转参数为字典
    # 断言响应码是否符合预期
    assert response.status_code == expected_code

if __name__ == "__main__":
    # 执行用例并生成报告
    pytest.main(["-v", "--html=api_test_report.html", "--self-contained-html"])
5. 必学的 pytest 核心概念

表格

概念 作用
测试用例 test_ 开头的函数 / 以 Test 开头的类(类中方法以 test_ 开头)
断言 assert 语句,判断实际结果是否等于预期结果
参数化 @pytest.mark.parametrize,批量传入用例数据
固件(fixture) 前置 / 后置操作(如初始化数据库、打开浏览器),用 @pytest.fixture 定义
测试报告 --html 生成 HTML 报告,allure 生成可视化报告

三、补充学习建议(按阶段)

阶段 1(1-2 天):掌握 pytest 核心
  • 学会基础用例写法、参数化、断言;
  • 能读取 Excel 用例并批量执行;
  • 生成 HTML 报告。
阶段 2(3-5 天):结合实际用例场景
  • 接口用例:学 requests 库(发送 HTTP 请求);
  • UI 用例:学 selenium(Web)/ appium(APP);
  • 日志:学 logging 库,记录用例执行细节(方便排查问题)。
阶段 3(可选):进阶优化
  • fixture 做用例前置(如统一初始化 Excel 读取、关闭连接);
  • allure 生成更美观的测试报告;
  • pytest-xdist 实现用例并行执行(提速)。

总结

  1. 核心必学:pytest(用例执行)+ 复用 pandas/openpyxl(用例读取);
  2. 场景补充:接口用例学 requests,UI 用例学 selenium/appium;
  3. pytest 关键:参数化(批量执行 Excel 用例)、断言(验证结果)、报告生成(输出结果);
  4. 先从「读取 Excel 用例→参数化执行→生成报告」这个最小流程入手,再逐步扩展。
相关推荐
BUG?不,是彩蛋!2 小时前
从 Q-Learning 到 LLM:我把 AI 的“大脑”换成了 GPT,发生了什么?
人工智能·python·gpt
祁鱼鱼鱼鱼鱼2 小时前
Nginx源码编译及平滑升级及回滚
学习
AnalogElectronic2 小时前
云原生学习day1ubuntu安装docker,基础镜像打包
学习·docker·云原生
XiYang-DING2 小时前
【Java SE】Java代码块详解
java·开发语言·python
chao_7892 小时前
【hello-agent】ReAct 第一个demo实践
python·agent·react-agent
weixin_458872612 小时前
东华复试OJ二刷复盘6
学习
微露清风2 小时前
系统性学习Linux-第四讲-进程控制
linux·服务器·学习
01二进制代码漫游日记2 小时前
C/C++中的内存区域划分
c语言·jvm·数据结构·学习