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
相关产品推荐
相关产品推荐

