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
。如果关联值是标量,则合并键未定义要执行的操作,因此会出现错误。
用户定义的标签,如!include
(user在这里表示酒馆)在合并后处理。它们是使用自定义构造函数实现的,这些构造函数将 YAML 值作为输入(此处为标量 components/request.yaml
)和 return 本机数据结构(例如 [=35= 的 dict
]mappings,sequences 的 list
,对于标量,通常是字符串、数字或布尔值,具体取决于标量的内容)。在 !include
的情况下,从引用文件加载的数据很可能是 returned(我不知道血淋淋的细节)。
重要的是,对于自定义构造函数,我们将保留 YAML 结构(mappings、sequences 和 标量),因此无法使用在 YAML 结构上定义的类似 !!merge
的语义来处理结果。
克服这个问题的唯一方法是 Tavern 实现自己的 !merge
语义,该语义将适用于易于加载的数据而不是 YAML 结构。既然没有,那你就不走运了。
我正在使用 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
。如果关联值是标量,则合并键未定义要执行的操作,因此会出现错误。
用户定义的标签,如!include
(user在这里表示酒馆)在合并后处理。它们是使用自定义构造函数实现的,这些构造函数将 YAML 值作为输入(此处为标量 components/request.yaml
)和 return 本机数据结构(例如 [=35= 的 dict
]mappings,sequences 的 list
,对于标量,通常是字符串、数字或布尔值,具体取决于标量的内容)。在 !include
的情况下,从引用文件加载的数据很可能是 returned(我不知道血淋淋的细节)。
重要的是,对于自定义构造函数,我们将保留 YAML 结构(mappings、sequences 和 标量),因此无法使用在 YAML 结构上定义的类似 !!merge
的语义来处理结果。
克服这个问题的唯一方法是 Tavern 实现自己的 !merge
语义,该语义将适用于易于加载的数据而不是 YAML 结构。既然没有,那你就不走运了。