领域适宜场景语言 (DASL)
#intro
“严格地说,写关于音乐的文章和唱关于经济学的歌曲一样不合逻辑” - 1918 年 2 月 9 日,新共和国,H. K. M. 的《看不见的世界》。
领域适宜场景语言是一种形式化的、声明式的 DSL,它可以为特定应用程序清晰地、明确地、简洁地和准确地定义行为场景。
DASL 是肉食性 BDD 实践的关键工具。
虽然 DASL 对编写代码来说并不严格必要,但如果没有它,规范错误更容易潜入。例如
- 场景描述不明确 - 模糊不清,缺少关键细节(“缺肉”)。
- 场景描述过于冗长,无法使用。
- 场景描述包含噪音 - 与场景描述无关的无关信息(例如,实现细节)。
使用 DASL,通常也很容易将示例场景中的规范作为测试执行。
Gherkin 不适合 DASL
Gherkin 不适用于肉食性 BDD。
Gherkin 试图表达“类似英语”的需求,通常不是领域适宜场景语言。这通常表现为缺少关于规范的上下文。例如,从 Cucumber 培训材料中提取的规范示例体现了这个问题
Scenario: Create a new person
Given API: I create a new person
Then API: I check that POST call body is "OK"
And API: I check that POST call status code is 200
这个故事省略了与场景相关的几个关键细节。如何创建新的人?发送的是什么类型的 POST 请求?带有 200 代码的响应是什么?
更糟糕的是,它具有误导性 - 并非每次尝试创建新人员都会导致 200。如果省略年龄,也许它不应该导致 200。或者它应该吗?
虽然 Gherkin 在理论上可以表示非常精确地描述的场景,但在实践中,如果你这样做,故事会变得过于冗长。部分原因是 Gherkin 没有继承的概念。
英语不是 DASL
虽然口语和书面英语可以在高层次上描述上下文和行为场景(如上面的“关于”部分所做的那样),但如果用这种方式描述整个场景,那么关键信息往往会丢失。
与英语相比,DASL 的严格性有助于确保填补规范空白。
HitchStory 作为创建 DASL 的工具
以下是用 hitchstory StrictYAML DASL 编写的示例场景,用于描述 REST API 服务的行为
Add employee record:
# business readable high level description
about: |
When an employee's key details are added via the employee api
then that employee details can be retrieved via that API.
# sequence of steps that leads to desired outcome
steps:
- API Call:
request:
username: john
method: POST
path: /employee/add
content: |
{
"name": "Thomas Kettering",
"age": 35,
"address": "1 Example road, example drive"
}
response:
status: 200
content: |-
{
"code": 200,
"id": "e30ffb2-bb50-4836-aefa-86c78af157cc",
"status": "success"
}
varying:
id: thomas kettering's user id
- API call:
request:
username: john
method: GET
path: /employee/{{ thomas kettering's user id }}
response:
status: 200
content: |-
{
"id": "e30ffb2-bb50-4836-aefa-86c78af157cc",
"name": "Thomas Kettering",
"age": 35,
"address": "1 Example road, example drive"
}
varying:
id: thomas kettering's user id