🧪pytest 自动化测试框架学习笔记|结合两个优质视频总结

本文是我基于两个 B 站教学视频的混合学习笔记总结而成:

第一部视频讲解简洁清晰,适合快速入门;第二部内容更系统,涵盖 YAML、Allure、关键字驱动等进阶技巧。为避免重复,我将两个视频内容合理整合,输出这份系统化的 Pytest 学习笔记与实战指南,适合初学者查阅,也适合有经验的测试人员查漏补缺。


📌 一、Pytest 框架简介与核心优势

Pytest 是 Python 中最流行的单元测试框架之一,也是许多接口自动化框架的基础组件。

核心特点:

  • ✅ 语法简洁:用 assert 就能断言
  • ✅ 自动发现用例:命名规则清晰
  • ✅ 插件丰富:支持 HTML 报告、多线程执行、失败重试等
  • ✅ 数据驱动支持:原生支持 @pytest.mark.parametrize
  • ✅ 兼容 unittest,支持灵活前后置处理(fixture)

🚀 二、Pytest 基础实战与项目规范

✅ 1. 用例编写与命名规则

# test_math.py
def add(x, y):
return x + y

def test_add():
assert add(2, 3) == 5

规范说明:

  • 文件名以 test_ 开头
  • 测试函数名以 test_ 开头
  • 类名以 Test 开头(不能写 __init__

✅ 2. 用例执行方式

pytest                            # 执行所有用例
pytest test_login.py # 执行指定文件
pytest -vs # 显示详细信息和 print 内容
pytest -k "login" # 按关键字筛选
pytest -m smoke # 执行带 smoke 标记的用例

建议将这些配置统一写入 pytest.ini 文件中:

# pytest.ini
[pytest]
addopts = -vs --html=report.html
testpaths = ./tests
python_files = test_*.py
python_classes = Test*
python_functions = test*
markers =
smoke: 冒烟测试
regression: 回归测试

⚙️ 三、前后置处理:setup/teardown vs fixture 对比

类型 控制方式 推荐场景
setup/teardown 类方法中定义 简单、方法级别资源管理
fixture @pytest.fixture 高度灵活,支持参数化、作用域配置
conftest.py + fixture 全局文件共享配置 全项目共享资源,如登录态等

🔧 fixture 示例

import pytest

@pytest.fixture(scope="function", autouse=True)
def init_env():
print("前置处理")
yield
print("后置清理")

作用域支持:

  • function(默认)/ class / module / session

🧬 四、数据驱动测试(parametrize)

Pytest 原生支持数据驱动,无需额外插件。

@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(5, 5, 10),
(-1, 1, 0)
])
def test_add(a, b, expected):
assert a + b == expected

进阶:
可通过 YAML、JSON、Excel 等加载参数数据:

import yaml
@pytest.mark.parametrize("a,b", yaml.safe_load(open("data.yaml")))
def test_case(a, b):
assert a + b > 0

🎯 五、Allure 报告集成:更美观的测试呈现

📦 安装与生成流程

pip install allure-pytest
pytest --alluredir=./temp
allure generate ./temp -o ./report --clean
allure open ./report

也可通过 Python 代码集成:

if __name__ == "__main__":
pytest.main(["--alluredir=./temp"])
os.system("allure generate ./temp -o ./report --clean")

✨ 报告亮点

  • 支持标签(如 feature, severity
  • 支持截图、响应数据等附件
  • 可配置邮件通知,适配 Jenkins CI

🧩 六、YAML 与接口自动化结合应用

YAML 是构建接口自动化中极其实用的配置方式,结合数据驱动、关键字驱动、Allure 报告能实现完整框架闭环。

✅ 用例结构示例(支持断言、标签)

- name: 用户登录测试
url: /api/login
method: POST
params:
username: admin
password: 123456
expected:
status_code: 200
body:
code: 0
message: "登录成功"
allure:
feature: 登录模块
severity: critical

✅ 工具类封装断言

def validate_response(response, expected_data):
assert response.status_code == expected_data.get("status_code", 200)
for key, value in expected_data.get("body", {}).items():
assert response.json().get(key) == value

🛠️ 七、关键字驱动 + Python 反射机制

将常见接口操作封装为函数,配合 YAML 指令执行:

- keyword: login
params: { username: admin, password: 123456 }
save_as: token
KEYWORDS = {
"login": login_func,
"query_user": query_func
}

def run_by_keyword(step):
func = KEYWORDS[step["keyword"]]
return func(**step["params"])

进一步配合反射动态执行类中方法:

if hasattr(ApiTest, "test_login"):
method = getattr(ApiTest(), "test_login")
method(data)

🔁 八、进阶技巧汇总

场景 推荐实践
测试报告 Allure(美观) or pytest-html(简洁)
并发执行 pytest-xdist(支持 -n auto 参数)
失败重试 pytest-rerunfailures(--reruns=2
控制用例顺序 pytest-ordering
跳过未开发用例 @pytest.mark.skip or skipif
全局资源(如登录状态) conftest.py + session 级 fixture

🧾 总结与学习建议

通过结合两个高质量视频的学习,我更加全面地理解了 Pytest 的:

  • 用例组织结构
  • 数据驱动方式(尤其是结合 YAML)
  • 前后置处理机制(fixture 的多种高级用法)
  • 报告输出(Allure 报告集成)
  • 框架扩展能力(关键字驱动、反射、Jenkins 集成)

✅ 入门建议:先用 assert 写简单函数测试,掌握 parametrizefixture
✅ 进阶建议:YAML 数据分离 + Allure 报告集成 + pytest.ini 管理 + 插件扩展
✅ 实战建议:根据项目特点封装断言、数据加载与公共关键字,快速实现框架落地


📚 参考资料: