Tavern中如何用!include导入JSON模板后通过<<修改请求体?
错误原因
你遇到的报错是Tavern自定义!include标签的加载顺序和YAML原生合并符<<的解析顺序不匹配导致的:YAML语法解析阶段会先处理<<合并逻辑,此时!include引入的内容还没有被Tavern解析为映射结构,只会被识别为字符串标量,因此抛出类型不匹配错误。
可行解决方案
方案1:公共片段绑定锚点(官方推荐)
这是Tavern明确支持的片段复用方式,兼容性最好:
- 调整公共请求片段的存储格式,在
components/request_base.yaml中给公共参数绑定锚点:
# components/request_base.yaml .base_request: &request_template common_param_1: "default_value1" common_param_2: "default_value2" nested_common: key_a: "val_a" key_b: "val_b" # 所有公共字段均定义在此处
- 测试文件中先引入公共片段,再用锚点完成合并:
# 测试文件开头先引入公共片段,会自动加载锚点定义 !include components/request_base.yaml stages: - name: Create infrastructure request: url: "{service:s}" json: <<: *request_template # 此处新增/覆盖测试专属参数,优先级高于公共模板 name: "infrastructure_name" param_1: "param_for_test_1" nested_common: key_b: "overwrite_val"
方案2:扩展函数深合并(无需修改原有公共文件)
如果你的公共请求体已经大量投入使用,不想额外加锚点,可以用Tavern内置的deep_update扩展函数完成合并:
variables: # 直接加载原有公共请求体为变量 base_request: !include components/request.yaml stages: - name: Create infrastructure request: url: "{service:s}" json: $ext: function: tavern.testutils.helpers:deep_update extra_kwargs: base: "{base_request}" # 此处写需要新增/覆盖的参数,支持深嵌套覆盖 overwrite: name: "infrastructure_name" param_1: "param_for_test_1" param_2: "another param for test 1"
该方案支持深嵌套字段合并,比YAML原生的浅合并适用场景更广。
内容的提问来源于stack exchange,提问作者hamx0r
相关产品推荐
相关产品推荐

