PlaywrightBDDGherkin语法Skill playwright-bdd-gherkin-syntax

这个技能提供了在Playwright BDD中使用Gherkin语法编写和管理测试的全面知识。它覆盖了从基础结构到高级特性的所有方面,如场景大纲、标签组织、背景设置和国际化的支持。关键词包括Gherkin语法、Playwright测试、BDD实践、自动化测试、软件质量保证、行为驱动开发、测试框架、代码生成、端到端测试。

测试 0 次安装 0 次浏览 更新于 3/25/2026

name: playwright-bdd-gherkin-syntax user-invocable: false description: 在编写Gherkin特性文件时使用,使用带示例的场景大纲,应用标签进行测试组织,并利用背景部分进行共享设置。 allowed-tools: [Read, Write, Edit, Bash, Glob, Grep]

Playwright BDD Gherkin语法

在Playwright BDD中编写特性文件的Gherkin语法专家知识,包括场景、大纲、背景、标签和国际化的知识。

概述

Gherkin是一种领域特定语言,用于以纯文本描述软件行为。Playwright BDD使用Gherkin特性文件(.feature),通过bddgen转换为Playwright测试文件。

特性文件结构

基本结构

Feature: 用户认证
  作为用户
  我希望能够登录
  以便我可以访问我的账户

  Background:
    Given 我在登录页面

  Scenario: 成功登录
    When 我输入有效凭证
    And 我点击登录按钮
    Then 我应该看到仪表板

  Scenario: 登录失败
    When 我输入无效凭证
    And 我点击登录按钮
    Then 我应该看到错误消息

特性声明

Feature: 简短的描述性标题

  可选描述跨越
  多行解释特性的
  目的和上下文。

关键词

Given - 前提条件

描述初始上下文或状态:

Given 我以“admin”身份登录
Given 购物车为空
Given 以下用户存在:
  | 姓名  | 邮箱           |
  | Alice | alice@test.com  |
  | Bob   | bob@test.com    |

When - 动作

描述动作或事件:

When 我点击“提交”按钮
When 我在“邮箱”中输入“test@example.com”
When 我从配送选项中选择“快递”
When 24小时已过去

Then - 结果

描述预期结果:

Then 我应该看到“欢迎回来!”
Then 购物车应包含3个物品
Then 我应该被重定向到仪表板
Then 应发送邮件到“test@example.com”

And / But - 延续

继续前一个Given/When/Then:

Given 我已登录
And 我购物车中有物品
But 我未输入配送地址

When 我点击结账
And 我输入我的支付详情

Then 我应该看到确认页面
And 我应该收到订单邮件
But 我不应被重复收费

场景类型

基本场景

Scenario: 添加物品到购物车
  Given 我在产品页面
  When 我点击“添加到购物车”
  Then 购物车数量应为1

场景大纲(数据驱动)

用不同数据运行相同场景:

Scenario Outline: 用不同角色登录
  Given 我在登录页面
  When 我以“<角色>”登录
  Then 我应该看到“<仪表板>”仪表板

  Examples:
    | 角色    | 仪表板 |
    | admin   | Admin     |
    | user    | User      |
    | manager | Manager   |

多个示例表:

Scenario Outline: 产品定价
  Given 我正在查看产品“<产品>”
  Then 价格应为“<价格>”
  And 折扣应为“<折扣>”

  Examples: 常规产品
    | 产品 | 价格  | 折扣 |
    | 笔记本电脑 | $999   | 0%       |
    | 鼠标   | $29    | 0%       |

  Examples: 促销产品
    | 产品    | 价格  | 折扣 |
    | 键盘   | $79    | 20%      |
    | 耳机 | $149   | 15%      |

Background(共享设置)

在特性中每个场景之前运行:

Feature: 购物车

  Background:
    Given 我已登录
    And 我有一个空购物车

  Scenario: 添加单个物品
    When 我添加“产品A”到购物车
    Then 购物车应有1个物品

  Scenario: 添加多个物品
    When 我添加“产品A”到购物车
    And 我添加“产品B”到购物车
    Then 购物车应有2个物品

Rule(分组相关场景)

在业务规则下分组场景:

Feature: 折扣系统

  Rule: 批量折扣适用于超过10个物品的订单

    Scenario: 10个物品的订单无折扣
      Given 我购物车中有10个物品
      Then 我应该看到无折扣应用

    Scenario: 11个物品的订单获得批量折扣
      Given 我购物车中有11个物品
      Then 我应该看到10%折扣应用

  Rule: VIP会员获得额外折扣

    Scenario: VIP会员获得会员折扣
      Given 我是VIP会员
      When 我查看我的购物车
      Then 我应该看到5%会员折扣

标签

基本标签

@smoke
Feature: 用户认证

  @critical
  Scenario: 成功登录
    Given 我在登录页面
    When 我输入有效凭证
    Then 我应该看到仪表板

  @regression @slow
  Scenario: 密码恢复
    Given 我在忘记密码页面
    When 我请求密码重置
    Then 我应该收到邮件

特殊Playwright BDD标签

# 跳过此场景
@skip
Scenario: 功能未就绪
  Given 这个被跳过

# 仅运行此场景(如test.only)
@only
Scenario: 调试此特定测试
  Given 我需要专注于这个

# 标记为已知失败
@fail
Scenario: 已知bug #123
  Given 这个预期会失败

# 标记为不稳定但继续
@fixme
Scenario: 间歇性失败的测试
  Given 这个有时失败

标签表达式

运行时间筛选测试:

# 仅运行冒烟测试
npx playwright test --grep @smoke

# 运行关键测试
npx playwright test --grep @critical

# 运行除了慢测试之外的一切
npx playwright test --grep-invert @slow

# 组合标签(AND)
npx playwright test --grep "@smoke.*@critical"

标签继承

特性上的标签应用于所有场景:

@authentication @web
Feature: 用户登录

  @happy-path
  Scenario: 成功登录
    # 拥有标签:@authentication, @web, @happy-path
    ...

  @error-handling
  Scenario: 无效密码
    # 拥有标签:@authentication, @web, @error-handling
    ...

数据表

简单列表

Scenario: 添加多个物品
  When 我添加以下物品:
    | 牛奶   |
    | 面包  |
    | 黄油 |

键值表

Scenario: 填充注册表单
  When 我用以下填充表单:
    | 名 | John           |
    | 姓  | Doe            |
    | 邮箱      | john@test.com  |
    | 密码   | secret123      |

带标题的表

Scenario: 创建多个用户
  Given 以下用户存在:
    | 用户名 | 邮箱           | 角色  |
    | alice    | alice@test.com  | admin |
    | bob      | bob@test.com    | user  |
    | carol    | carol@test.com  | user  |

复杂表

Scenario: 带多个产品的订单
  When 我用以下创建订单:
    | 产品   | 数量 | 价格 | 折扣 |
    | 笔记本电脑    | 1        | 999   | 0%       |
    | 鼠标     | 2        | 29    | 10%      |
    | 键盘  | 1        | 79    | 5%       |
  Then 订单总额应为$1123.55

文档字符串

纯文本

Scenario: 提交反馈
  When 我输入以下反馈:
    """
    优秀产品!推荐。
    快速配送和卓越质量。
    """
  And 我点击提交
  Then 我应该看到“感谢您的反馈”

JSON内容

Scenario: 通过API创建产品
  When 我用以下发送POST请求:
    """json
    {
      "name": "新产品",
      "price": 49.99,
      "category": "电子产品",
      "tags": ["新", "特色"]
    }
    """
  Then 响应状态应为201

代码块

Scenario: 执行脚本
  When 我运行以下脚本:
    """javascript
    const result = await page.evaluate(() => {
      return document.title;
    });
    console.log(result);
    """

国际化(i18n)

语言头

# language: de
Funktionalität: Benutzeranmeldung

  Grundlage:
    Angenommen ich bin auf der Anmeldeseite

  Szenario: Erfolgreiche Anmeldung
    Wenn ich gültige Anmeldedaten eingebe
    Dann sollte ich das Dashboard sehen

支持的语言

常见语言及其关键词:

德语(de):

# language: de
Funktionalität: 特性标题
  Szenario: 场景标题
    Angenommen: Given
    Wenn: When
    Dann: Then
    Und: And
    Aber: But

法语(fr):

# language: fr
Fonctionnalité: 特性标题
  Scénario: 场景标题
    Soit: Given
    Quand: When
    Alors: Then
    Et: And
    Mais: But

西班牙语(es):

# language: es
Característica: 特性标题
  Escenario: 场景标题
    Dado: Given
    Cuando: When
    Entonces: Then
    Y: And
    Pero: But

注释

Feature: 产品目录
  # 此特性覆盖产品列表页面

  # TODO: 添加搜索功能测试
  Scenario: 查看所有产品
    Given 我在目录页面
    # 检查产品加载
    Then 我应该看到至少10个产品

最佳实践

编写声明性步骤

好(声明性):

Given 我以管理员身份登录
When 我创建新产品
Then 产品应在目录中可见

坏(命令式):

Given 我导航到“/login”
And 我在邮箱字段输入“admin@test.com”
And 我在密码字段输入“password123”
And 我点击登录按钮
And 我等待仪表板加载
When 我点击“产品”菜单项
And 我点击“添加新”
...

使用有意义的场景名称

好:

Scenario: 已登录用户可以添加到愿望清单
Scenario: 访客用户在结账前被提示注册
Scenario: 过期促销码显示清晰的错误消息

坏:

Scenario: 测试1
Scenario: 检查愿望清单
Scenario: 错误测试

保持场景独立

每个场景应独立工作:

# 好 - 每个场景设置自己的状态
Scenario: 编辑现有产品
  Given 产品“测试产品”存在
  When 我将产品名称编辑为“更新产品”
  Then 我应在列表中看到“更新产品”

# 坏 - 依赖于前一个场景
Scenario: 编辑产品
  # 假设前一个场景的产品存在
  When 我编辑产品名称
  Then 它应被更新

明智使用Background

仅在Background中放置真正通用的设置:

# 好 - 通用设置
Background:
  Given 我已登录

# 坏 - 太具体
Background:
  Given 我已登录
  And 我创建了产品“Widget”
  And 产品有5条评论
  And 产品在促销中

用标签组织

@e2e @checkout
Feature: 结账流程

  @smoke @critical
  Scenario: 用信用卡完成结账
    ...

  @regression
  Scenario: 用PayPal结账
    ...

  @slow @integration
  Scenario: 与库存同步的结账
    ...

避免太多步骤

保持场景集中(理想3-7步):

好:

Scenario: 添加物品到购物车
  Given 我正在查看产品
  When 我点击“添加到购物车”
  Then 购物车应显示1个物品

坏(太多步骤):

Scenario: 完成购买
  Given 我已登录
  And 我在首页
  And 我搜索“笔记本电脑”
  And 我点击第一个结果
  And 我选择颜色“银色”
  And 我选择内存“16GB”
  And 我点击添加到购物车
  And 我查看我的购物车
  And 我点击结账
  And 我输入我的地址
  And 我选择配送方式
  And 我输入信用卡详情
  And 我确认订单
  Then 我应该看到订单确认
  # 太长 - 分成多个场景

常见模式

设置和验证模式

Scenario: 删除产品
  Given 产品“测试产品”存在     # 设置
  When 我删除“测试产品”               # 动作
  Then “测试产品”不应可见  # 验证

状态转换模式

Scenario: 订单生命周期
  Given 订单处于“待处理”状态
  When 我处理订单
  Then 订单状态应为“处理中”

  When 我配送订单
  Then 订单状态应为“已配送”

  When 订单已交付
  Then 订单状态应为“已完成”

错误处理模式

@error-handling
Scenario: 无效表单提交
  Given 我在注册页面
  When 我用以下提交表单:
    | 邮箱    | 无效邮箱 |
    | 密码 | 123           |
  Then 我应该看到以下错误:
    | 字段    | 消息                    |
    | 邮箱    | 请输入有效邮箱 |
    | 密码 | 密码太短         |

文件组织

features/
├── authentication/
│   ├── login.feature
│   ├── logout.feature
│   └── password-reset.feature
├── products/
│   ├── catalog.feature
│   ├── search.feature
│   └── product-details.feature
├── checkout/
│   ├── cart.feature
│   ├── payment.feature
│   └── shipping.feature
└── admin/
    ├── user-management.feature
    └── product-management.feature

何时使用此技能

  • 编写新特性文件
  • 将需求转换为Gherkin场景
  • 使用场景大纲进行数据驱动测试
  • 用标签组织测试
  • 设置共享Background步骤
  • 使用国际化特性
  • 审查和提高特性文件质量
  • 培训团队成员BDD语法