Gherkin语法

Gherkin(小黄瓜,读“哥kin”)是BDD的领域特定语言(DSL),对应的软件框架是Cucumber(黄瓜)。

关键字

首要关键字:

Feature
Rule (as of Gherkin 6)
Example (or Scenario)
Given, When, Then, And, But for steps (or *)
Background
Scenario Outline (or Scenario Template)
Examples (or Scenarios)

次要关键字:

""" (Doc Strings)
| (Data Tables)
@ (Tags)
# (Comments)

注释

Gherkin只支持行注释,注释行开头使用“#”符号,#符号前可以有多个空格。

缩进

可以使用空格和tab进行缩进,建议使用两个空格。

中文支持

Gherkin支持多种语言,在文件头写入注释 # language: zh-CN表示使用中文书写。下面是关键字的中英文对照:

英文关键字 中文
featur 功能
background 背景
scenario 场景、剧本
scenarioOutline 场景大纲
examples 例子
given *、假设、假如、假定
when *、当
then *、那么
and *、而且、并且、同时
but *、但是
rule 规则

简单示例

下面是简单的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

功能: 诗词接龙
诗词接龙有若干玩家参与,某个玩家以一句诗句开始,后续玩家轮流作答,后一句的第一个字是前一句最后一个字。


场景: 正确的作答
假如 “张三”开始游戏,游戏开始条件是:“小时不识月”
当 “李四”作答:“月既不解饮”
那么 “李四”回答正确

场景:错误的作答
假如 “张三”开始游戏,游戏开始条件是:“小时不识月”
当 “李四”作答:“呼作白玉盘”
那么 “李四”回答错误

Feature

Feature关键字是软件功能的高层描述,用于组织相关场景。一个Gherkin文档必须以Feature:开头,然后是对这个功能的描述和说明,Feature不会被测试框架解释,主要用于说明。

Feature后面可以是Background、Rule、Example或者ScenarioOutline。

在Feature可以增加tag,用于跨文件结构的标记。

Scenario/Example

场景或示例用于说明业务规则,包含一系列的步骤。
场景可以包含任意多的步骤,但建议包含3-5个步骤。一个示例也是一个测试,所有示例构成系统的可测试规格。

Steps

示例或者场景中包括步骤,这些步骤包括Given、When、Then、And和But。

步骤关键字不用于执行时的文字判断,所以,步骤不能有相同的文字定义。下面的步骤会被认为是重复的:

1
2
Given there is money in my account
Then there is money in my account

这个约束是我们使用更精确的语言进行描述:

1
2
Given my account has a balance of £430
Then my account should have a balance of £430

Background

如果若干场景的起始条件相同,可以使用Background简化功能描述。Background 在每个场景执行前开始,但晚于任何Before钩子。

Scenario Outline

当有若干场景,只是输入参数不同时,可以使用Scenario Outline。

1
2
3
4
5
6
7
8
9
10
场景: 正确的作答1
假如 “张三”开始游戏,游戏开始条件是:“小时不识月”
当 “李四”作答:“月既不解饮”
那么 “李四”回答正确

场景: 正确的作答2
假如 “张三”开始游戏,游戏开始条件是:“小时不识月”
当 “李四”作答:“月出惊山鸟”
那么 “李四”回答正确

上面的场景可以简化为:

1
2
3
4
5
6
7
8
9
场景大纲: 正确作答
假如 <user1>开始游戏,游戏开始条件是:<condition>
当 <user2>作答:<answer>
那么 <user2>回答正确

Examples:
|user1|condition|user2|answer|
|张三|小时不识月|李四|月既不解饮|
|张三|小时不识月|李四|月出惊山鸟|

Step参数

当需要输入文档数据时,可以使用 “””或者```作为文档参数:

1
2
3
4
5
假如 张三背了一首诗
"""
窗前明月光,
疑是地上霜
"""

如果输入对象数组等格式化数据,可以使用DataTable。

1
2
3
4
5
假如 下面的用户存在:
| 姓名 | 电子邮件 |
| Aslak | aslak@cucumber.io |
| Julien | julien@cucumber.io |
| Matt | matt@cucumber.io |