Playwright + Pytest UI 自动化测试框架
1026 字
5 分钟
Playwright + Pytest UI 自动化测试框架
国土云耕地保护网格化监管平台 — 接口 & UI 自动化测试
技术栈
| 组件 | 技术 |
|---|---|
| 浏览器自动化 | Playwright (Chromium) |
| 测试框架 | Pytest |
| 报告 | Allure |
| 数据驱动 | YAML |
| 环境切换 | pytest-env |
| 失败重试 | pytest-rerunfailures |
| CI/CD | Jenkins Pipeline |
快速开始
# 1. 创建虚拟环境python -m venv venv
# 2. 激活 (Windows Git Bash)source venv/Scripts/activate
# 3. 安装依赖 (清华镜像)pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 4. 安装浏览器playwright install chromium环境切换
通过 --env 参数或 TEST_ENV 环境变量切换测试环境,默认 test。
环境配置(config/env.yaml)
test: # 测试环境 (默认) base_url: "https://gdwgh.xjsllandcloud.org.cn/landCloudWork" browser: { headless: true, slow_mo: 0 }
dev: # 开发环境 base_url: "https://dev.example.com/landCloudWork" browser: { headless: true, slow_mo: 100 }
prod: # 生产环境 (URL 从环境变量注入) base_url: "${PROD_BASE_URL}" browser: { headless: true, slow_mo: 0 }切换方式
# 方式 1: --env CLI 参数 (推荐)pytest --env=dev -m smoke -vpytest --env=prod -m p0 -vpytest --env=test -m e2e -v
# 方式 2: 环境变量TEST_ENV=prod pytest -m smoke -v
# 方式 3: 环境变量 + URL 注入 (CI/CD 安全实践)PROD_BASE_URL=https://prod.example.com/landCloudWork pytest --env=prod -m p0 -v添加新环境
在 config/env.yaml 中新增 section:
staging: base_url: "https://staging.example.com/landCloudWork" ...无需修改代码,--env=staging 即可使用。
执行测试
分级执行
# 冒烟测试 (每次 commit / PR 必跑, ~30s)pytest -m smoke -v --alluredir=reports/allure-results --clean-alluredir
# 冒烟 + 指定环境pytest --env=prod -m smoke -v --alluredir=reports/allure-results --clean-alluredir
# P0 核心用例 (部署前必过, ~20s)pytest -m p0 -v --alluredir=reports/allure-results --clean-alluredir
# E2E 端到端 (每日构建, ~60s)pytest -m e2e -v --alluredir=reports/allure-results --clean-alluredir
# 全量测试 (发版前, ~90s)pytest -v --alluredir=reports/allure-results --clean-alluredir按模块执行
# 仅 API 测试pytest tests/test_login_api.py tests/test_clue_push.py -v --alluredir=reports/allure-results
# 仅 UI 测试pytest tests/test_ui_login.py -v --alluredir=reports/allure-results
# 仅线索推送 DDTpytest tests/test_clue_push.py -v --alluredir=reports/allure-results其他常用
# 收集用例 (不执行)pytest --collect-only -q
# 按标记收集pytest -m smoke --collect-only -qpytest -m e2e --collect-only -qpytest -m p0 --collect-only -q
# 执行单个用例pytest tests/test_login_api.py::TestLoginAPI::test_login_success_status -v
# 失败重跑 (需安装 pytest-rerunfailures)pytest --reruns 2 --alluredir=reports/allure-results失败重试
默认配置 pytest.ini 已启用 --reruns 1 --reruns-delay 2(失败后重试 1 次,间隔 2 秒)。
弱网强化
# 增加重试次数 + 间隔 (弱网环境)pytest -m smoke --reruns 3 --reruns-delay 5 -v
# 仅重试网络类异常,断言失败不重试pytest -m e2e --reruns 3 --reruns-delay 3 \ --only-rerun "TimeoutError|ConnectionError|ConnectionResetError|MaxRetryError|ProtocolError"
# 重试 + 环境切换pytest --env=prod -m p0 --reruns 3 --reruns-delay 5 -v标记弱网用例
@pytest.mark.flaky # 配合 --reruns 自动重试def test_sms_login_flow(self, ...): ...命令行 vs 全局配置优先级
命令行 --reruns 3 → 覆盖 pytest.ini 默认值pytest.ini addopts → 全局默认 --reruns 1 --reruns-delay 2生成 Allure 报告
# 生成 HTML 报告allure generate reports/allure-results -o reports/allure-report --clean
# 打开报告start reports/allure-report/index.html
# 或本地服务器预览allure serve reports/allure-results用例分级
| 标记 | 说明 | 用例数 | 触发时机 |
|---|---|---|---|
smoke | 冒烟测试 | 4 | 每次 commit |
p0 | 核心必过 | 4 | 部署前 |
e2e | 端到端 | 9 | 每日构建 |
flaky | 弱网不稳定 | — | 自动重试 |
分级明细
smoke (4 条): test_login_success_status API 登录成功验证 test_sms_login_flow UI 完整登录流程 test_login_page_loads UI 登录页加载 test_query_task_list[默认分页] DDT 第一条用例
p0 (4 条): test_login_success_status API 登录成功 test_login_auth_credentials Token/Cookie 验证 test_sms_login_flow UI 完整流程 test_query_task_list[默认分页] DDT 核心场景
e2e (9 条): 全部 API 测试 (4条) + UI 测试 (2条) + DDT 测试 (3条)项目结构
├── config/│ ├── env.yaml # 环境配置 (URL, 浏览器, 超时)│ ├── roles.yaml # 测试角色凭据│ └── clue_push.yaml # DDT 数据源├── data/│ └── test_home.yaml # 仪表盘预期数据├── pages/│ ├── base_page.py # Page Object 基类│ ├── login_page.py # 登录页 PO│ └── home_page.py # 仪表盘 PO├── services/│ ├── auth_service.py # API 登录│ └── user_context.py # Cookie 注入├── tests/│ ├── conftest.py # Fixtures (browser, api_session, ...)│ ├── test_login_api.py # 登录 API 测试 (4 条)│ ├── test_clue_push.py # 线索推送 DDT 测试 (4 条)│ └── test_ui_login.py # UI 登录测试 (3 条)├── utils/│ ├── config_loader.py # YAML 加载器│ ├── allure_utils.py # Allure 工具│ └── logger.py # 日志├── conftest.py # Allure 失败截图钩子├── pytest.ini # Pytest 配置├── Jenkinsfile # CI/CD Pipeline└── requirements.txt添加新的 YAML DDT 用例
- 在
config/下新建 YAML:
api_path: "/your/api/path"test_cases: - name: "场景名称" request: param1: "value1" expected: status_code: 200 status: "OK" has_data: true- 在
conftest.py添加加载 fixture:
@pytest.fixture(scope="session")def your_data() -> dict: return load_yaml("config/your.yaml")- 创建测试文件,使用
_load_ddt_cases()+@pytest.mark.parametrize
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
Playwright + Pytest UI 自动化测试框架
https://wwkcim.xyz/posts/webautotest-playwright/相关文章智能推荐
1
Device UI 测试性能优化记录 — 7.3x 加速
测试通过浏览器内 JS 计算替代 Python 逐单元格 CDP 调用、文本定位器替代全页文本读取、统一轮询去冗余等手段,将测试用例从 140s 优化到 19s。
2
WordPress 访问 503 与 Nginx 代理配置问题解决
运维记录 Nginx 反向代理场景下 WordPress 与 Spring Boot 共存时,因 location 匹配顺序导致 PHP 请求被错误转发到 Java 后端的排查与修复过程。
3
简单使用指南
博客指南如何使用 Firefly 博客模板。
4
Docker 部署 Jenkins 并与 Gitee 联动
运维使用 Docker 快速部署 Jenkins LTS,配置 Gitee 插件与 Webhook,实现推送代码自动触发构建的 CI 流水线。
5
Firefly 代码块示例
文章示例在Firefly中使用表达性代码的代码块在 Markdown 中的外观。
随机文章随机推荐













