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语法