跳到内容

领域适宜场景语言 (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