Pytest-Bdd-Playwright 系列教程(4):基于敏捷的通用步骤定义
- 前言
- 一、项目结构
- 二、通用步骤定义
- 三、特性文件设计
- 四、测试脚本实现
- 五、运行测试
- 总结
前言
- 在敏捷迭代中,为了适应快速、高频的交付,自动化测试框架的设计需要注重简洁、灵活性和易于维护的特点,尤其是对初级工程师而言,降低学习成本尤为重要;
- 本文将通过实战案例,详细介绍如何构建通用步骤、特性文件设计、测试脚本实现,使本框架让初学者能够快速上手并投入到敏捷项目的测试工作中。
一、项目结构
│
├── features/ # BDD特性文件
│ └── search.feature
│ └── login.feature(新增)
│
├── pages/ # 页面对象
│ └── search_page.py
│
├── steps/ # 步骤定义
│ └── search_steps.py
│ └── common_steps.py(新增)
│
├── tests/ # 测试脚本
│ └── test_search.py
│ └── test_login.py(新增)
│
├── utils/ # 工具函数
│ └── config.py # 配置管理
│
├── conftest.py # pytest钩子、fixture
├── pytest.ini # pytest配置
├── requirements.txt # 项目依赖
└── README.md # 项目说明
二、通用步骤定义
代码的复用性是提升自动化测试脚本编写效率的关键所在。通过将共用的操作步骤提取到一个模块中,我们可以在多个场景中直接调用这些步骤,从而减少重复代码量。
下面是在 steps
目录中定义的 common_steps.py
文件:
import logging
from playwright.sync_api import Page, expect
from pytest_bdd import given, when, then, parsers
log = logging.getLogger(__name__)
@given(parsers.parse('访问网站[{url}]'))
def goto(page: Page, url: str):
page.goto(url)
log.info(f"访问 {url}")
@given('等待页面加载完成')
def wait_for_page_load(page: Page):
page.wait_for_load_state()
@when(parsers.parse('点击元素[{selector}]'))
def click(page: Page, selector: str):
page.locator(selector).click()
log.info(f"点击元素 {selector}")
@when(parsers.parse('在[{selector}]中输入[{text}]'))
def input_text(page: Page, text: str, selector: str):
page.locator(selector).fill(text)
log.info(f"在 {selector} 中输入 {text}")
@then(parsers.parse('元素[{selector}]的文本应为[{text}]'))
def check_element_has_text(page: Page, selector: str, text: str):
expect(page.locator(selector)).to_have_text(text)
log.info(f"元素 {selector} 的文本应为 {text}")
按需自行添加相应的 playwright
方法,零基础的小伙伴,可以通过我的专栏进行学习,这里有详细的 playwright
教程:https://blog.csdn.net/weixin_48321392/category_12651716.html?spm=1001.2014.3001.5482
三、特性文件设计
在 features
目录下创建一个 login.feature
文件:
Feature: 登录功能
为了能够访问银行系统
作为一名客户
我希望能够登录
Scenario: 登录成功
Given 访问网站[https://parabank.parasoft.com/parabank/index.htm]
Given 等待页面加载完成
When 在[input[name="username"]]中输入[user]
And 在[input[name="password"]]中输入[pwd]
And 点击元素[input[type="submit"]]
Then 元素[#leftPanel h2]的文本应为[Account Services]
四、测试脚本实现
有了特性文件后,我们需要编写测试脚本来执行这些场景。在tests
目录下创建test_login.py
文件,通过pytest_bdd模块将BDD场景映射为测试用例。
import pytest
from steps.common_steps import *
from pytest_bdd import scenario
@pytest.mark.smoke
@scenario('login.feature', '登录成功')
def test_login_success():
pass
五、运行测试
使用以下命令运行测试:
pytest .\tests\test_login.py
运行结果如下:
总结
到目前为止,本框架已具备以下特点:
- 降低学习成本:通过BDD语法,非技术人员也能理解测试场景,有助于跨团队沟通。
- 提高代码复用性:通用步骤定义减少了代码冗余,降低维护成本。
- 适合敏捷项目:快速搭建、执行便捷,适用于频繁交付的敏捷团队。
通过这种设计,即便是初学者也能快速上手自动化测试框架,为项目质量保障提供支持。