一、先明确你的需求对应的技能 / 库清单(按优先级排序)
你的核心需求是「读取标准化用例→生成用例→执行用例」,结合你已掌握的 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实现用例并行执行(提速)。
总结
- 核心必学:pytest(用例执行)+ 复用 pandas/openpyxl(用例读取);
- 场景补充:接口用例学 requests,UI 用例学 selenium/appium;
- pytest 关键:参数化(批量执行 Excel 用例)、断言(验证结果)、报告生成(输出结果);
- 先从「读取 Excel 用例→参数化执行→生成报告」这个最小流程入手,再逐步扩展。