Tavern `!include` template JSON 如何请求正文并用 `<<` 修改?

How can Tavern `!include` template JSON request body and modify with `<<`?

我正在使用 tavern 向网络服务器发出多个类似的请求,但处于 不同测试 的同一阶段(即不同的 YAML 文件)。每个 Web 请求都需要很长时间,所以我将我的整体测试分成不同的测试文件,以便我可以并行使用 python-xdist 到 运行 测试。这意味着通过将所有测试组合为同一测试的不同阶段,我一无所获。

看来我可以使用 !include 重用存储在 JSON 或 YAML 文件中的完整 JSON 正文(参见 Directly including test data). However, I want to reuse a partial JSON body and then add/override just the parameters that differ for each test (see Reusing requests and YAML fragments")

例如,测试文件如下所示:

选项 1:包含的中间变量

variables:
  request_template: &reqtemp
    !include components/request.yaml


stages:
  - name: Create infrastructure
    request:
      url: "{service:s}"
      json:
        <<: *reqtemp
# Here I start extending the template with values specific to the test
        name: "infrastructure_name"
        param_1: "param_for_test_1"
        param_2: "another param for test 1"

但是,当运行进行这样的测试时,它会抛出异常expected a mapping or list of mappings for merging, but found scalar。我已经尝试了如下所示的其他语法选项,但仍然出现相同的错误:

选项 2:无变量

stages:
  - name: Create infrastructure
    request:
      url: "{service:s}"
      json:
        <<: !include components/request.yaml
# Here I start extending the template with values specific to the test
        name: "infrastructure_name"
        param_1: "param_for_test_1"
        param_2: "another param for test 1"

如何获得使用 !include 导入大型请求主体的好处,同时又能够在每个阶段修改它?

那是不可能的。

<< 是 YAML defined here 的可选扩展。它说

[…] If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the current mapping, unless the key already exists in it. If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes and each of these nodes is merged in turn according to its order in the sequence. […]

无论您是将 !include 作为别名还是直接提供,YAML 语义始终是您的 << 密钥与 标量 相关联它恰好有标签 !include。如果关联值是标量,则合并键未定义要执行的操作,因此会出现错误。

用户定义的标签,如!includeuser在这里表示酒馆)在合并后处理。它们是使用自定义构造函数实现的,这些构造函数将 YAML 值作为输入(此处为标量 components/request.yaml)和 return 本机数据结构(例如 [=35= 的 dict ]mappings,sequenceslist,对于标量,通常是字符串、数字或布尔值,具体取决于标量的内容)。在 !include 的情况下,从引用文件加载的数据很可能是 returned(我不知道血淋淋的细节)。

重要的是,对于自定义构造函数,我们将保留 YAML 结构(mappingssequences标量),因此无法使用在 YAML 结构上定义的类似 !!merge 的语义来处理结果。

克服这个问题的唯一方法是 Tavern 实现自己的 !merge 语义,该语义将适用于易于加载的数据而不是 YAML 结构。既然没有,那你就不走运了。