当前位置: 首页 > news >正文

从零到一:手把手教你用Playwright+Pytest+Allure搭建数据驱动的UI自动化测试(含Yaml配置详解)

从零到一:手把手教你用Playwright+Pytest+Allure搭建数据驱动的UI自动化测试(含Yaml配置详解)

最近两年,UI自动化测试领域出现了一匹黑马——Playwright。作为一个新兴的测试框架,它凭借跨浏览器支持、自动等待机制和强大的录制功能,迅速赢得了开发者和测试人员的青睐。但很多刚接触自动化测试的同学常常面临这样的困境:工具学会了,却不知道如何组织代码;用例写出来了,但维护起来一团糟;测试跑通了,却无法生成直观的报告。

本文将带你从零开始,用Playwright+Pytest+Allure+Yaml搭建一个结构清晰、易于维护的自动化测试框架。不同于简单的代码堆砌,我们会重点讲解如何用Yaml实现数据驱动,如何用Pytest组织测试用例,以及如何生成专业的Allure报告。即使你之前没有任何自动化测试经验,跟着本文一步步操作,也能在2小时内搭建出属于自己的测试框架。

1. 环境准备与工具安装

在开始编码之前,我们需要准备好开发环境。这里假设你已经安装了Python(建议3.8+版本),如果没有,可以从Python官网下载安装包。

首先创建一个干净的虚拟环境,这能避免包版本冲突:

python -m venv playwright-env source playwright-env/bin/activate # Linux/Mac playwright-env\Scripts\activate # Windows

接下来安装必要的依赖包:

pip install playwright pytest allure-pytest pyyaml

安装完成后,需要下载Playwright支持的浏览器内核:

python -m playwright install

小技巧:如果你在国内网络环境下安装较慢,可以尝试使用清华源:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple playwright pytest allure-pytest pyyaml

验证安装是否成功:

pytest --version playwright --version

如果都能正确输出版本号,说明环境已经准备就绪。

2. 项目结构与Yaml数据配置

良好的项目结构是维护自动化测试代码的关键。我们采用分层设计,将不同功能的代码放在不同的目录中:

project-root/ ├── common/ # 公共方法 ├── testcase/ # 测试用例 ├── data/ # 测试数据 ├── reports/ # 测试报告 ├── conftest.py # Pytest配置 └── pytest.ini # Pytest运行配置

2.1 Yaml数据驱动设计

Yaml文件非常适合存储测试数据,它比JSON更易读,比Excel更易版本控制。我们在data目录下创建base.yaml:

# data/base.yaml baidu_search: url: "https://www.baidu.com" test_cases: - name: "搜索Python" keyword: "Python" expected_title: "Python_百度搜索" - name: "搜索Playwright" keyword: "Playwright" expected_title: "Playwright_百度搜索" login_page: url: "https://example.com/login" valid_credentials: username: "testuser" password: "Test@123"

为了读取这些Yaml数据,我们需要在common目录下创建read_file.py:

# common/read_file.py import yaml import os def load_yaml(file_path): """加载Yaml文件""" with open(os.path.join("data", file_path), "r", encoding="utf-8") as f: return yaml.safe_load(f) def get_test_data(yaml_file, key): """获取特定测试数据""" data = load_yaml(yaml_file) return data[key]

这种设计有三大优势:

  1. 测试数据与代码分离,修改数据无需改动代码
  2. 支持多环境配置,只需切换不同的Yaml文件
  3. 非技术人员也能理解和修改测试数据

3. Playwright核心操作封装

为了提高代码复用性,我们把常用的Playwright操作封装成公共方法。

3.1 基础操作封装

在common/action.py中:

# common/action.py from playwright.sync_api import Page class PageActions: def __init__(self, page: Page): self.page = page def navigate(self, url): """访问URL""" self.page.goto(url) def fill_input(self, selector, text): """填充输入框""" self.page.locator(selector).fill(text) def click_element(self, selector): """点击元素""" self.page.locator(selector).click() def get_text(self, selector): """获取元素文本""" return self.page.locator(selector).text_content()

3.2 截图与Allure附件

测试失败时,截图能帮助我们快速定位问题。在common/attach.py中:

# common/attach.py import allure from playwright.sync_api import Page def attach_screenshot(page: Page, name="screenshot"): """截图并附加到Allure报告""" screenshot = page.screenshot() allure.attach( screenshot, name=name, attachment_type=allure.attachment_type.PNG ) def attach_text(text, name="text"): """附加文本到Allure报告""" allure.attach( str(text), name=name, attachment_type=allure.attachment_type.TEXT )

4. 编写Pytest测试用例

有了基础设施,现在可以编写真正的测试用例了。

4.1 百度搜索测试案例

在testcase/test_baidu.py中:

# testcase/test_baidu.py import allure import pytest from common.action import PageActions from common.read_file import get_test_data @allure.feature("百度搜索测试") class TestBaiduSearch: @pytest.fixture(autouse=True) def setup(self, page): self.page = page self.actions = PageActions(page) self.test_data = get_test_data("base.yaml", "baidu_search") @allure.story("基本搜索功能") @allure.title("测试百度搜索不同关键词") @pytest.mark.parametrize("case", get_test_data("base.yaml", "baidu_search")["test_cases"]) def test_search(self, case): with allure.step("打开百度首页"): self.actions.navigate(self.test_data["url"]) with allure.step(f"搜索关键词: {case['keyword']}"): self.actions.fill_input("#kw", case["keyword"]) self.actions.click_element('text="百度一下"') with allure.step("验证搜索结果标题"): assert case["expected_title"] in self.page.title()

4.2 使用Fixture管理浏览器

在conftest.py中配置Pytest Fixture:

# conftest.py import pytest from playwright.sync_api import Playwright, sync_playwright @pytest.fixture(scope="function") def page(): with sync_playwright() as p: browser = p.chromium.launch(headless=False) context = browser.new_context() page = context.new_page() yield page browser.close()

5. 生成Allure测试报告

Allure报告能让测试结果更加直观专业。首先需要配置pytest.ini:

# pytest.ini [pytest] addopts = -v --alluredir=./reports/allure-results testpaths = ./testcase python_files = test_*.py python_classes = Test* python_functions = test_*

然后创建run.py来执行测试并生成报告:

# run.py import os import pytest if __name__ == "__main__": # 运行测试 pytest.main() # 生成Allure报告 os.system("allure generate ./reports/allure-results -o ./reports/allure-report --clean") # 自动打开报告(可选) os.system("allure open ./reports/allure-report")

运行测试后,你会在reports目录下看到漂亮的Allure报告,包含:

  • 测试用例执行情况
  • 步骤详细日志
  • 截图附件
  • 历史趋势图

6. 高级技巧与最佳实践

6.1 并行测试配置

Playwright原生支持并行测试,只需修改pytest.ini:

[pytest] addopts = -v -n auto --alluredir=./reports/allure-results

6.2 元素定位策略

推荐使用以下定位方式(按优先级排序):

  1. get_by_role- 通过ARIA角色定位

    page.get_by_role("button", name="Submit").click()
  2. get_by_text- 通过文本内容定位

    page.get_by_text("Welcome back").click()
  3. get_by_test_id- 通过测试ID定位

    page.get_by_test_id("submit-button").click()
  4. CSS/XPath- 最后考虑的选择

    page.locator("#submit-btn").click()

6.3 等待策略优化

Playwright内置智能等待机制,但有时需要自定义:

# 显式等待元素可见 page.locator(".loading").wait_for(state="hidden") # 自定义超时时间 page.locator("#dynamic-content").click(timeout=10000)

6.4 跨浏览器测试配置

修改conftest.py支持多浏览器:

@pytest.fixture(params=["chromium", "firefox", "webkit"], scope="function") def browser_type(request): return request.param @pytest.fixture(scope="function") def page(browser_type): with sync_playwright() as p: browser = getattr(p, browser_type).launch() context = browser.new_context() page = context.new_page() yield page browser.close()

7. 常见问题排查

Q1: 测试在CI环境中失败,但在本地能通过?

A1: 这通常是因为:

  • CI环境缺少浏览器依赖,确保安装了所需依赖:
    sudo apt-get install libgbm-dev libxkbcommon-x11-0
  • 网络延迟不同,增加超时时间
  • 屏幕尺寸不同,设置一致的视口大小

Q2: 如何调试Playwright脚本?

A2: 推荐几种调试方式:

  1. 使用headless=False模式观察浏览器行为
  2. 添加slow_mo参数放慢执行速度:
    browser = p.chromium.launch(headless=False, slow_mo=100)
  3. 使用Playwright Inspector:
    PWDEBUG=1 pytest

Q3: Allure报告没有显示截图?

A3: 确保:

  1. 截图代码确实执行了
  2. 文件路径正确
  3. 在测试结束时才生成报告

8. 项目优化方向

当框架基本功能完成后,可以考虑以下优化:

  1. 日志系统集成:添加logging模块记录详细执行日志
  2. 邮件通知:测试失败时自动发送邮件
  3. CI/CD集成:与Jenkins/GitHub Actions等集成
  4. 移动端测试:利用Playwright的移动设备模拟功能
  5. 视觉回归测试:使用像素对比工具
# 示例:简单的日志配置 import logging def configure_logging(): logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", handlers=[ logging.FileHandler("debug.log"), logging.StreamHandler() ] )

实际项目中,我们团队用这套框架将回归测试时间从3小时缩短到20分钟,而且测试覆盖率从60%提升到了85%。最关键的是,产品经理也能通过Allure报告直观地看到测试结果,这在以前是不可想象的。

http://www.rkmt.cn/news/1381893.html

相关文章:

  • 告别手动抢茅台!3分钟部署i茅台自动预约系统终极指南
  • 第2章 谁在危险中——被AI替代的五类程序员
  • AutoClicker实战指南:Windows鼠标点击自动化的高效解决方案
  • 深圳翻译公司推荐:2026年专业语言服务商权威盘点 - 资讯焦点
  • Lucyd 应用上线 AI 实时翻译通话:对讲机式母语交流,智能眼镜厂商竞逐可穿戴 AI 平台新赛道
  • 如何在Windows 10/11上完美运行Android应用?WSABuilds v2407.40000.4.0_v2完整指南
  • java的继承和多态
  • 别让依赖毁了你的实验:记一次Vision Mamba复现中causal_conv1d与mamba-ssm的版本“打架”事件
  • 别再乱建索引了!用Explain的key_len字段,一眼看穿你的MySQL联合索引到底生效了几个字段
  • DIY智能USB充电器:基于电流检测与双稳态继电器的零功耗节能方案
  • 2026上海二次加压泵工厂实测排行:合规与性能双维度对比 - 资讯焦点
  • (毕业必看)实测好用的AI论文写作工具,毕业党收藏备用
  • 科普帖|你的论文“含金量“谁说了算?聊聊查重背后的免费工具
  • 如何零基础搭建专属原神私服:KCN-GenshinServer的图形化革命
  • 如何突破网盘限速瓶颈?LinkSwift直链解析工具让企业文件传输效率提升300%
  • Burp抓包失败的五大隐形墙与HTTPS解密断裂点排查指南
  • qobuz-dl终极实战指南:专业无损音乐下载工具架构解析与高效应用
  • 【RT-DETR实战】070、模型分析工具:PyTorch Profiler性能分析
  • 腾讯元宝GEO排名优化:2026年AI搜索流量抢占的系统性方法论 - 博客湾
  • 终极指南:如何用wechat-need-web插件突破微信网页版访问限制
  • 在数据预处理与分析流水线中集成大模型API进行智能标注与摘要
  • 珍宝黄金回收(十年老店)|2026 年 5 月扬州江都黄金回收行情解读、避坑技巧与 FAQ 在扬州江都区,提到黄金回收,很多老居民第一反应就是珍宝。 - 润富黄金珠宝行
  • AAAI 2025 | VHM:面向遥感图像分析的通用可信视觉语言模型
  • Proteus仿真进阶:给你的AT89C52温控风扇加上OLED显示和手机蓝牙遥控
  • Selenium自动化测试第一步:手把手教你在Win10/Win11上搞定ChromeDriver环境
  • 网安学习第24天 PHP安全——PHP反序列化
  • 在Ubuntu 20.04上从零搞定WAVEWATCHⅢ 6.07.0:一个Linux小白的踩坑与通关实录
  • SELinux:Linux系统的终极安全防护锁
  • 河北钢格栅踏步板技术选型指南及合规供应商盘点 - 奔跑123
  • 从分区看设计哲学:深度对比银河麒麟V10、Windows 11与Ubuntu的系统布局