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

Visual Studio Code中AWS CDK单元测试失败:未解析令牌错误

VS Code测试模块无法读取CDK环境变量导致单元测试失败

问题详情

我在test_infra_stack.py里写了这段单元测试:

def test_s3_bucket_block_public_access():
    """验证S3桶是否开启公共访问阻止"""
    app = cdk.App()
    testing_stack = InfraStack(
        app,
        construct_id="s3-stack",
        tags={"project": "infra", "environment": "dev"},
    )
    test_template = Template.from_stack(testing_stack)
    test_template.has_resource_properties(
        type="AWS::S3::Bucket",
        props={
            "PublicAccessBlockConfiguration": {
                "BlockPublicAcls": True,
                "BlockPublicPolicy": True,
                "IgnorePublicAcls": True,
                "RestrictPublicBuckets": True,
            }
        },
    )

运行测试时弹出错误:

jsii.errors.JavaScriptError: 
  @jsii/kernel.RuntimeError: Error: Resolution error: ID components may not include unresolved tokens: infra-ingestion-snowflake-${Token[AWS.Region.8]}-${Token[AWS.AccountId.4]}-dev.

排查后确认是VS Code的测试模块读不到项目根目录.env文件里的环境变量:

CDK_DEFAULT_ACCOUNT=11111111111
CDK_DEFAULT_REGION=eu-central-1

我当前的Settings.json配置:

{
    "python.pythonPath": "/Users/me/project/venv/bin/python3",
    "terminal.integrated.env.osx": {
        "PYTHONPATH": "${workspaceFolder}",
    },
    "python.testing.pytestArgs": [
        "."
    ],
    "python.testing.unittestEnabled": false,
    "python.testing.pytestEnabled": true,
    "python.envFile":   "${workspaceFolder}/.env",
}

也试过在launch.json里直接硬编码环境变量:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "cwd": "${fileDirname}",
            "env": {"PYTHONPATH": "${workspaceFolder}${pathSeparator}${env:PYTHONPATH}",
                "CDK_DEFAULT_ACCOUNT": "11111111111",
                "CDK_DEFAULT_REGION": "eu-central-1",
            }
        }
    ]
}

终端里手动配置好环境变量后运行cdk diff一切正常,说明代码本身没问题,就是VS Code的测试模块加载环境变量有问题。

解决方法

方法1:测试代码里直接设置环境变量

在测试代码开头手动注入环境变量,彻底绕开VS Code的配置问题:

import os
# 直接设置CDK所需的环境变量
os.environ["CDK_DEFAULT_ACCOUNT"] = "11111111111"
os.environ["CDK_DEFAULT_REGION"] = "eu-central-1"

def test_s3_bucket_block_public_access():
    # 原测试代码不变
    app = cdk.App()
    testing_stack = InfraStack(
        app,
        construct_id="s3-stack",
        tags={"project": "infra", "environment": "dev"},
    )
    test_template = Template.from_stack(testing_stack)
    test_template.has_resource_properties(
        type="AWS::S3::Bucket",
        props={
            "PublicAccessBlockConfiguration": {
                "BlockPublicAcls": True,
                "BlockPublicPolicy": True,
                "IgnorePublicAcls": True,
                "RestrictPublicBuckets": True,
            }
        },
    )

方法2:给pytest单独配置环境变量

在项目根目录新建pytest.ini文件,添加以下内容:

[pytest]
env =
    CDK_DEFAULT_ACCOUNT=11111111111
    CDK_DEFAULT_REGION=eu-central-1

pytest运行时会自动加载这里配置的环境变量。

方法3:调整VS Code测试配置

修改settings.json,确保测试环境能正确读取.env和终端环境变量,之后重启VS Code生效:

{
    "python.pythonPath": "/Users/me/project/venv/bin/python3",
    "terminal.integrated.env.osx": {
        "PYTHONPATH": "${workspaceFolder}",
        "CDK_DEFAULT_ACCOUNT": "11111111111",
        "CDK_DEFAULT_REGION": "eu-central-1"
    },
    "python.testing.pytestArgs": [
        "."
    ],
    "python.testing.unittestEnabled": false,
    "python.testing.pytestEnabled": true,
    "python.envFile": "${workspaceFolder}/.env",
    // 让测试环境继承终端的环境变量
    "python.testing.env": {
        "CDK_DEFAULT_ACCOUNT": "${env:CDK_DEFAULT_ACCOUNT}",
        "CDK_DEFAULT_REGION": "${env:CDK_DEFAULT_REGION}"
    }
}

方法4:终端直接运行pytest

在VS Code的集成终端里激活虚拟环境,安装python-dotenv后直接运行测试,这样会自动加载.env文件:

source venv/bin/activate
pip install python-dotenv
pytest

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:44:57