我正在使用小酒馆向一个web服务器发出多个类似的请求,但是在不同测试的同一阶段(即不同的YAML文件)。每个web请求都需要很长的时间,所以我将整个测试分成不同的测试文件,这样我就可以使用python-xdist并行运行测试了。这意味着,通过将所有测试合并为同一测试的单独阶段,我将一无所获。
我似乎可以使用!include重用存储在JSON或YAML文件中的完整JSON主体(参见直接包括测试数据)。但是,我希望重用部分JSON主体,然后只添加/重写每个测试的不同参数(请参阅重用请求和YAML片段")
例如,测试文件如下所示:
选项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导入一个大型请求体而又能够在每个阶段修改它呢?
发布于 2021-11-30 12:18:32
这是不可能的
<<是YAML 在此定义的可选扩展。上面写着
…如果与键关联的值是单个映射节点,则将其每个键/值对插入到当前映射中,除非键已经存在于其中。如果与合并键相关联的值是序列,则期望该序列包含映射节点,并根据其在序列中的顺序依次合并这些节点。…
无论您是将!include作为别名还是直接给出,YAML的语义始终是<<键与标量相关联,标量恰好具有!include标记。如果关联的值是标量,则合并键不定义要做什么,因此出现了错误。
用户定义的标记,如!include (这里的用户含义Tavern ),在合并后被处理。它们是用自定义构造函数实现的,这些构造函数以YAML值作为输入(这里是标量components/request.yaml)并返回本机数据结构(例如,映射的dict、序列的list以及标量(通常是字符串、数字或布尔值)(取决于标量的内容)。在!include的情况下,可能会返回来自引用文件的加载数据(我不知道血淋淋的细节)。
重要的是,使用自定义构造函数,我们将保留YAML结构(映射、序列和标量),因此不能使用定义在YAML结构上的语义类!!merge来处理结果。
克服这一问题的唯一方法是,如果Tavern实现了自己的!merge语义,该语义将用于轻松加载的数据,而不是YAML结构。既然没有,你在这里就不走运了。
https://stackoverflow.com/questions/70163056
复制相似问题