Pytest-Bdd-Playwright 系列教程(11):场景快捷方式

devtools/2024/11/20 1:54:20/

Pytest-Bdd-Playwright 系列教程(11):场景快捷方式

  • 前言
  • 1. 手动绑定场景的传统方法
  • 2. 场景快捷方式的自动绑定方法
    • 2.1 绑定所有场景
    • 2.2 绑定多个路径
    • 2.3 自动与手动绑定的结合
  • 3. 示例:结合 Playwright 的实际应用
    • 3.1 项目目录结构
    • 3.2 代码实现
      • `features/login.feature`
      • `pages/login_page.py`
      • `tests/test_auth.py`
      • `pytest.ini`
  • 4. 使用场景快捷方式的优势
    • 4.1 减少重复代码
    • 4.2 提高开发效率
    • 4.3 保证一致性
  • 总结

前言

  • 在 Pytest-Bdd 中,场景是构成测试用例的核心部分。通常情况下,我们需要通过 @scenario 装饰器将测试函数与特定的场景绑定。当项目规模扩大时,多个 feature 文件及场景的存在可能会导致手动绑定场景变得冗长、繁琐;
  • 场景快捷方式(scenarios 函数)正是为了解决这一问题而设计的。它允许我们通过递归方式,自动绑定指定路径下的所有场景,从而极大地提升测试开发效率。

1. 手动绑定场景的传统方法

在介绍场景快捷方式之前,我们先来看一下传统的手动绑定方式是如何实现的。

假设有一个名为 features/some.feature 的文件,内容如下:

在这里插入图片描述

要手动绑定 Valid login 场景,我们可以使用以下代码:

在这里插入图片描述

虽然这种方法直观且容易理解,但当 feature 文件较多时,每个场景都需要手动绑定,代码量迅速增加,不利于维护。

2. 场景快捷方式的自动绑定方法

为了简化上述流程,Pytest-Bdd 提供了 scenarios 函数。通过它,您可以自动绑定指定路径下的所有场景,无需逐一手动声明。

2.1 绑定所有场景

假设项目的目录结构如下:

project/
├── features/
│   ├── login.feature
│   ├── signup.feature
├── tests/
│   ├── test_login.py

我们可以通过以下方式绑定 features 文件夹中的所有场景:

# pytest.ini
[pytest]
bdd_features_base_dir = features/
# test_login.py
from pytest_bdd import scenarios# 自动绑定 'features' 文件夹中的所有场景
scenarios('')

这段代码将递归搜索 features 文件夹下的所有 .feature 文件,并将其中的场景绑定为测试用例。这不仅减少了代码量,还能确保测试覆盖率的一致性。

2.2 绑定多个路径

如果项目中有多个 feature 文件夹或文件需要绑定,也可以直接传递多个路径:

# pytest.ini
[pytest]
bdd_features_base_dir = features/
# test_login.py
from pytest_bdd import scenarios# 同时绑定多个路径
scenarios('login.feature', 'signup.feature')

这种方式非常灵活,适合复杂项目的场景管理需求。

2.3 自动与手动绑定的结合

在某些情况下,我们可能希望对部分场景进行手动绑定,同时对其他场景使用自动绑定。这在需要自定义测试函数名、参数化测试用例或增加日志记录时尤为常见。

Pytest-Bdd 支持这种混合绑定方式,只需确保在调用 scenarios 之前完成手动绑定。例如:

# pytest.ini
[pytest]
bdd_features_base_dir = features/
# test_login.py
from pytest_bdd import scenario, scenarios# 手动绑定某个场景
@scenario('some.feature', 'Valid login')
def test_valid_login():pass# 自动绑定 'features' 文件夹中的其他场景
scenarios('features')

在这种模式下,test_valid_login 场景保持手动绑定,而 features 文件夹中的其他场景则会通过 scenarios 函数自动绑定。这种方法可以根据需求灵活调整场景绑定策略。

3. 示例:结合 Playwright 的实际应用

3.1 项目目录结构

project/
├── features/
│   ├── login.feature
│   ├── signup.feature
├── pages/
│   ├── login_page.py
│   ├── signup_page.py
├── tests/
│   ├── test_auth.py

3.2 代码实现

features/login.feature

Feature: User loginScenario: Valid loginGiven the user navigates to the login pageWhen the user enters valid credentialsThen the user is redirected to the dashboard

pages/login_page.py

from playwright.sync_api import Pageclass LoginPage:def __init__(self, page: Page):self.page = pagedef navigate(self):self.page.goto("https://example.com/login")def login(self, username: str, password: str):self.page.fill("input#username", username)self.page.fill("input#password", password)self.page.click("button#login")

tests/test_auth.py

from pytest_bdd import scenarios, given, when, then
from pages.login_page import LoginPage# 自动绑定所有场景
scenarios('')@given("the user navigates to the login page")
def navigate_to_login_page(page):login_page = LoginPage(page)login_page.navigate()@when("the user enters valid credentials")
def enter_credentials(page):login_page = LoginPage(page)login_page.login("test_user", "secure_password")@then("the user is redirected to the dashboard")
def verify_dashboard(page):assert page.url == "https://example.com/dashboard"

pytestini_170">pytest.ini

[pytest]
bdd_features_base_dir = features/

4. 使用场景快捷方式的优势

4.1 减少重复代码

通过自动绑定,可以大幅减少重复的装饰器声明,提升代码的可读性和简洁性。尤其是在场景数量较多时,优势尤为明显。

4.2 提高开发效率

手动绑定需要开发人员逐一检查每个 feature 文件及场景,而 scenarios 函数能够自动完成这一过程,节省了大量时间。

4.3 保证一致性

由于 scenarios 函数会递归处理所有场景,不容易遗漏特定场景,能够保证测试覆盖的一致性。

总结

场景快捷方式功能是 Pytest-Bdd 提供的一项极为实用的工具,适合需要处理大量场景的测试项目。通过自动绑定场景,可以有效减少重复代码、提高开发效率,并保证测试覆盖的一致性。


http://www.ppmy.cn/devtools/135351.html

相关文章

DEVOPS: 集群伸缩原理

概述 阿里云 K8S 集群的一个重要特性,是集群的节点可以动态的增加或减少有了这个特性,集群才能在计算资源不足的情况下扩容新的节点,同时也可以在资源利用 率降低的时候,释放节点以节省费用理解实现原理,在遇到问题的…

解决游戏找不到steam_api64.dll,轻松恢复电脑Steam游戏恢复运行

文件基本信息 文件名 steam_api64.dll 类型 动态链接库文件(Dynamic Link Library) 适用平台 64位Windows操作系统 Steam_api64.dll是一个专门用于64位Windows操作系统的动态链接库文件,它是Steam游戏平台的核心组件之一。该文件主要负…

Go 语言已立足主流,编程语言排行榜24 年 11 月

Go语言概述 Go语言,简称Golang,是由Google的Robert Griesemer、Rob Pike和Ken Thompson在2007年设计,并于2009年11月正式宣布推出的静态类型、编译型开源编程语言。Go语言以其提高编程效率、软件构建速度和运行时性能的设计目标,…

css数据不固定情况下,循环加不同背景颜色

<template><div><p v-for"(item, index) in items" :key"index" :class"getBackgroundClass(index)">{{ item }}</p></div> </template><script> export default {data() {return {items: [学不会1, …

借助Excel实现Word表格快速排序

实例需求&#xff1a;Word中的表格如下图所示&#xff0c;为了强化记忆&#xff0c;希望能够将表格内容随机排序&#xff0c;表格第一列仍然按照顺序编号&#xff0c;即编号不跟随表格行内容调整。 乱序之后的效果如下图所示&#xff08;每次运行代码的结果都不一定相同&#x…

mcu之,armv7架构,contex-M4系列,时钟树,中断,IO架构(一)

写这篇文章的目的&#xff0c;是记录一下arm架构的32mcu&#xff0c;方便记忆芯片架构原理&#xff0c;方便我展开对&#xff0c;BootLoader的研究。 arm架构&#xff0c;时钟树&#xff0c;先做个记录&#xff0c;有空写。

Vue3学习笔记(下)

文章目录 Vue3学习笔记&#xff08;下&#xff09;组合式API下的父子通信父传子子传父 模板引用defineExpose()provide和injectvue3新特性 - defineOptionsvue3新特性 - defineModelPiniaPinia异步写法 Vue3学习笔记&#xff08;下&#xff09; 组合式API下的父子通信 父传子…

GIT将源码推送新分支

1. 创建并切换到新分支 首先&#xff0c;确保你在本地创建了一个新的分支并切换到该分支&#xff1a; git checkout -b new-branch-namenew-branch-name 是你要创建的新分支名称&#xff0c;替换为你需要的名称即可。 2. 确保所有更改已提交 在推送之前&#xff0c;确保你的…