pytest做接口和UI自动化测试的核心是分层设计、统一断言、驱动复用与环境隔离;需按职责划分目录结构,封装ApiClient和PageObject,标准化断言与报告策略。

用 pytest 做接口和 UI 自动化测试,核心不是堆功能,而是理清分层、统一断言、复用驱动、隔离环境。下面从实际落地角度拆解关键环节。
pytest 结构要支持多类型测试混跑
别把接口、UI、数据准备全塞进 test_*.py 里。按职责分目录:
- tests/api/:纯 requests + pytest.mark.api,用 pytest --markers 筛选运行
- tests/ui/:PageObject 模式 + WebDriver fixture,加 @pytest.mark.ui 标记
- conftest.py:全局 fixture(如 session、driver、clean_db),按 scope 控制生命周期
- configs/:env.yaml 存 host、timeout、headless 开关,pytest_addoption 读取命令行参数切换环境
接口测试:用 requests + pytest 参数化 + 断言标准化
避免每个 test 写重复的 headers、token 刷新、状态码判断。封装一个 ApiClient:
- 继承 requests.Session,自动带 auth token(从 fixture 获取)
- 提供 .get_json()/.post_json() 方法,统一处理 200 响应体解析和非 200 抛异常
- 用 pytest.mark.parametrize 跑用例表(路径、参数、期望 status_code、json schema)
- 断言不写 if assert r.status_code == 200,改用 assert r.status_code == expected_status
UI 测试:PageObject + 显式等待 + 截图兜底
Page 类只管元素定位和操作方法,不写断言和业务逻辑:
立即学习“Python免费学习笔记(深入)”;
- 每个页面对应一个类(LoginPage、DashboardPage),__init__ 接收 driver,用 WebDriverWait 等待关键元素
- 操作方法返回 self(链式调用)或下一个 Page 实例(如 login().goto_profile())
- 用 pytest_runtest_makereport hook,在用例失败时自动截图,保存为 testname_timestamp.png
- 敏感操作(如提交订单)前加 time.sleep(0.5) 或 driver.execute_script("arguments[0].scrollIntoView();", el)
统一报告与执行策略
pytest-html 生成报告只是基础,重点是让结果可读、可追溯:
- 用 --junitxml=report.xml 配合 Jenkins 解析通过率;加 --tb=short 减少冗余 traceback
- 在 conftest.py 里用 pytest_runtest_logreport 记录每个用例耗时、标签、错误摘要到 CSV
- CI 中用 pytest -m "api and not slow" 运行高频接口;用 pytest -m ui --headless 跑 UI 回归
- 失败用例自动重试(pytest-rerunfailures),但仅限 UI,接口失败通常代表真实问题










