You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tavern中如何用!include导入JSON模板后通过<<修改请求体?

错误原因

你遇到的报错是Tavern自定义!include标签的加载顺序和YAML原生合并符<<的解析顺序不匹配导致的:YAML语法解析阶段会先处理<<合并逻辑,此时!include引入的内容还没有被Tavern解析为映射结构,只会被识别为字符串标量,因此抛出类型不匹配错误。

可行解决方案

方案1:公共片段绑定锚点(官方推荐)

这是Tavern明确支持的片段复用方式,兼容性最好:

  1. 调整公共请求片段的存储格式,在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"
  # 所有公共字段均定义在此处
  1. 测试文件中先引入公共片段,再用锚点完成合并:
# 测试文件开头先引入公共片段,会自动加载锚点定义
!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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:36:03