如何在AWS CDK中对多个Lambda函数进行单元测试?
解决AWS CDK断言测试多个Lambda函数的问题
当前你的测试代码使用template.has_resource_properties("AWS::Lambda::Function", {...}),这个方法的逻辑是只要栈中存在至少一个匹配该属性的资源就会通过测试,不会校验所有Lambda函数。所以第二个不符合条件的函数不会触发测试失败。
方案1:验证所有Lambda函数满足统一属性要求
如果要确保栈内所有Lambda都符合某套共同规则(比如架构必须是arm64),可以先通过find_resources获取所有Lambda资源,再逐个检查属性:
def test_all_lambda_functions(): app = core.App() stack = RadBackendStack(app, "rad-backend") template = assertions.Template.from_stack(stack) # 获取所有Lambda资源 lambda_resources = template.find_resources("AWS::Lambda::Function") # 遍历每个Lambda,检查属性 for logical_id, props in lambda_resources.items(): # 检查架构(两个函数都符合) assert props["Properties"]["Architectures"] == ["arm64"] # 可添加其他统一校验规则
方案2:分别验证每个Lambda的特定属性
如果需要针对每个Lambda的不同属性(比如Runtime、Timeout)做精准校验,可以通过逻辑ID或者属性过滤来定位单个函数:
方式A:通过逻辑ID定位(推荐,更精准)
CDK生成的逻辑ID默认是构造函数中指定的名称(比如test_function、test_function_2),可以直接用has_resource结合逻辑ID来校验:
def test_individual_lambda_functions(): app = core.App() stack = RadBackendStack(app, "rad-backend") template = assertions.Template.from_stack(stack) # 验证第一个Lambda的属性 template.has_resource("AWS::Lambda::Function", { "Properties": { "Architectures": ["arm64"], "Runtime": "python3.8", "Timeout": 1 }, "LogicalResourceId": "test_function" }) # 验证第二个Lambda的属性(若要触发失败,可将值改为不符合预期的内容,比如把Runtime改成python3.8) template.has_resource("AWS::Lambda::Function", { "Properties": { "Architectures": ["arm64"], "Runtime": "python2.7", "Timeout": 2 }, "LogicalResourceId": "test_function_2" })
方式B:通过属性过滤定位
如果不想依赖逻辑ID,可以用find_resources结合属性过滤找到目标函数,再校验:
def test_individual_lambda_via_filter(): app = core.App() stack = RadBackendStack(app, "rad-backend") template = assertions.Template.from_stack(stack) # 找到Runtime为python3.8的Lambda py38_lambdas = template.find_resources("AWS::Lambda::Function", { "Properties": { "Runtime": "python3.8" } }) # 确保只有一个这样的函数,且属性符合预期 assert len(py38_lambdas) == 1 for props in py38_lambdas.values(): assert props["Properties"]["Timeout"] == 1 assert props["Properties"]["Architectures"] == ["arm64"] # 找到Runtime为python2.7的Lambda py27_lambdas = template.find_resources("AWS::Lambda::Function", { "Properties": { "Runtime": "python2.7" } }) assert len(py27_lambdas) == 1 for props in py27_lambdas.values(): assert props["Properties"]["Timeout"] == 2 assert props["Properties"]["Architectures"] == ["arm64"]
内容的提问来源于stack exchange,提问作者Sourav Mondal
相关产品推荐
相关产品推荐

