Bootstrap

Pytest-Bdd-Playwright 系列教程(4):基于敏捷的通用步骤定义

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语法,非技术人员也能理解测试场景,有助于跨团队沟通。
  • 提高代码复用性:通用步骤定义减少了代码冗余,降低维护成本。
  • 适合敏捷项目:快速搭建、执行便捷,适用于频繁交付的敏捷团队。

通过这种设计,即便是初学者也能快速上手自动化测试框架,为项目质量保障提供支持。

;