5

我正在 Cucumber Java 中做一个简单的 rest api 测试。响应采用 Json 格式。

我编写的小黄瓜功能文件如下所示:

  Scenario:  
    Given I query service by "employees"
    When I make the rest call
    Then response should contain:
      """
      {"employees":[
      {"firstName":"John", "lastName":"Doe"},
      {"firstName":"Anna", "lastName":"Smith"},
      {"firstName":"Peter", "lastName":"Jones"}
      ]}
      """

现在,由于有多个查询要使用不同的参数进行测试,例如“员工”、“部门”.. 等,所以很自然地编写场景大纲来执行任务:

  Scenario Outline: 
    Given I query service by "<category>"
    When I make the rest call
    Then response should contain "<json_string_for_that_category>"
    Examples:
      | category     | json_string_for_that_category     |
      | employee     | "json_string_expected_for_employee"  |
      | department   | "json_string_expected_for_department"|

其中 json_string_expected_for_employee 只是:

  {"employees":[
  {"firstName":"John", "lastName":"Doe"},
  {"firstName":"Anna", "lastName":"Smith"},
  {"firstName":"Peter", "lastName":"Jones"}
  ]}

通过复制和粘贴。

但是这种方法存在问题:

  1. Json字符串中有特殊字符需要转义如果只是被“”包围
  2. Scenario Outline 表看起来很乱

这样做的好方法是什么?是否可以在特征文件中的其他位置定义字符串变量以存储长字符串,并将该变量名放在表中?

或者有什么解决办法?这一定是人们比较 Cucumber 中非平凡数据输出的常见场景。

谢谢,

4

2 回答 2

1

首先要抵制使用场景大纲的诱惑,通常它们不值得麻烦。

就我个人而言,我认为将 json 字符串实际包含在功能中并没有任何价值。所以我会写这样的东西:

Scenario: Query by category
  Given there is a category
  When I query the service by the category
  Then I should receive a json representation of the category

这使我可以将定义类别的 json 表示应该是什么的责任分配给代码。该代码可能在我们的步骤定义中,甚至可能在我们的应用程序中(可能与单元测试共享)。这段代码可以做的一些事情是:

  1. 实际验证响应是有效的 json
  2. 验证 json 的结构是否匹配某个类别的结构
  3. 验证值,例如类别 ID

这种方法要做的一件事是,当您向类别添加额外字段时,您不必重写所有场景。

于 2015-12-28T13:01:15.193 回答
1

对于你的问题 1

您必须使用转义字符backslash( \)

示例:\"employees\"代替"employees"

对于你的问题 2

通常,如果您的输入不是字符的相似长度,则会很混乱。你可以用indent它来说明清楚。

或者

使用单独java file将所有输入存储为变量并scenario outline examples在执行时将其传递给。

于 2015-12-21T10:12:57.840 回答