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

如何在CDK快照测试中为应用传递上下文参数?

优化CDK快照测试的多环境上下文传递方案

你可以通过抽离环境配置+批量测试的方式,替代硬编码上下文,实现dev/stg/prod环境的程序化测试,同时保持和部署时一致的上下文获取逻辑。具体实现如下:

1. 集中定义多环境上下文配置

把各环境的上下文参数抽离成统一配置对象,方便维护和修改:

// 所有环境的上下文配置,和部署时传递的参数对应
const ENV_CONTEXTS = {
  dev: {
    env: "dev",
    key1: "value1-dev",
    key2: "value2-dev",
    key3: { subkey: "subvalue3-dev" },
  },
  stg: {
    env: "stg",
    key1: "value1-stg",
    key2: "value2-stg",
    key3: { subkey: "subvalue3-stg" },
  },
  prod: {
    env: "prod",
    key1: "value1-prod",
    key2: "value2-prod",
    key3: { subkey: "subvalue3-prod" },
  },
};

2. 批量生成多环境测试用例

利用Jest的test.each遍历所有环境,为每个环境单独运行测试并生成对应快照:

// 遍历环境配置,自动生成每个环境的测试用例
test.each(Object.entries(ENV_CONTEXTS))(
  "Snapshot test for %s environment",
  (envName, contextConfig) => {
    // 创建CDK App并传入当前环境的上下文
    const app = new cdk.App({ context: contextConfig });
    
    // 和部署时完全一致的上下文获取逻辑
    const env = app.node.tryGetContext("env");
    if (!env) {
      throw new Error("Context variable missing on CDK command. Pass in as `-c env=XXX`");
    }
    const key1 = app.node.tryGetContext("key1") as string;
    const key2 = app.node.tryGetContext("key2") as string;
    const key3 = app.node.tryGetContext("key3") as { subkey: string };

    // 创建对应环境的测试堆栈
    const stack = new myStack(app, `test-stack-${envName}`, {
      Env: env,
      Key1: key1,
      Key2: key2,
      Key3: key3,
    });

    // 生成CloudFormation模板并匹配快照
    const template = Template.fromStack(stack).toJSON();
    expect(template).toMatchSnapshot();
  }
);

核心优化说明

  • 配置与测试解耦:后续新增或修改环境参数,只需调整ENV_CONTEXTS对象,无需改动测试核心逻辑。
  • 对齐部署逻辑:依然通过app.node.tryGetContext获取参数,和实际部署时的代码逻辑完全一致,避免测试与生产逻辑脱节。
  • 独立环境快照:test.each会为每个环境生成独立的快照文件(如Snapshot test for dev environment.snap),便于后续对比各环境的模板差异。

修正原代码问题

原测试代码存在重复定义key3变量的错误,上述示例已修复该问题,同时规范了变量命名以匹配堆栈Props的驼峰格式。

内容的提问来源于stack exchange,提问作者Jatin Mehrotra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:22:26