Playwright + Pytest UI 自动化测试框架

1026 字
5 分钟
Playwright + Pytest UI 自动化测试框架

国土云耕地保护网格化监管平台 — 接口 & UI 自动化测试

技术栈#

组件技术
浏览器自动化Playwright (Chromium)
测试框架Pytest
报告Allure
数据驱动YAML
环境切换pytest-env
失败重试pytest-rerunfailures
CI/CDJenkins Pipeline

快速开始#

Terminal window
# 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 }

切换方式#

Terminal window
# 方式 1: --env CLI 参数 (推荐)
pytest --env=dev -m smoke -v
pytest --env=prod -m p0 -v
pytest --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 即可使用。

执行测试#

分级执行#

Terminal window
# 冒烟测试 (每次 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

按模块执行#

Terminal window
# 仅 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
# 仅线索推送 DDT
pytest tests/test_clue_push.py -v --alluredir=reports/allure-results

其他常用#

Terminal window
# 收集用例 (不执行)
pytest --collect-only -q
# 按标记收集
pytest -m smoke --collect-only -q
pytest -m e2e --collect-only -q
pytest -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 秒)。

弱网强化#

Terminal window
# 增加重试次数 + 间隔 (弱网环境)
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 报告#

Terminal window
# 生成 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 用例#

  1. config/ 下新建 YAML:
api_path: "/your/api/path"
test_cases:
- name: "场景名称"
request:
param1: "value1"
expected:
status_code: 200
status: "OK"
has_data: true
  1. conftest.py 添加加载 fixture:
@pytest.fixture(scope="session")
def your_data() -> dict:
return load_yaml("config/your.yaml")
  1. 创建测试文件,使用 _load_ddt_cases() + @pytest.mark.parametrize

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Playwright + Pytest UI 自动化测试框架
https://wwkcim.xyz/posts/webautotest-playwright/
作者
wwk
发布于
2026-07-06
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
wwk
Hello, I'm wwk.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
16
分类
5
标签
34
总字数
17,180
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录