Docker容器中pytest执行两次的原因及解决办法
解决Docker中pytest重复执行Lambda测试的问题
1. 调整Lambda handler执行逻辑
Lambda的handler函数仅应在被SAM invoke触发时执行测试,避免容器初始化阶段意外触发。修改测试脚本(如test_lambda.py),添加判断逻辑:
import pytest def lambda_handler(event, context): # 仅在Lambda事件触发时运行测试 pytest.main(["-v", "/path/to/your/tests"]) return {"statusCode": 200, "body": "Tests completed"} # 避免脚本直接运行时执行测试 if __name__ == "__main__": pass
2. 修正SAM模板配置
检查template_pytest.yaml中的Runtime和Handler配置,确保指向正确入口:
Resources: TestFunction: Type: AWS::Serverless::Function Properties: CodeUri: . Handler: test_lambda.lambda_handler Runtime: python3.11 # 匹配你使用的Python版本
3. 排查容器初始化错误
Init failed错误多因运行时找不到正确handler或脚本初始化阶段抛异常,可通过以下方式排查:
- 确认
sam build生成的.aws-sam目录下代码结构正确,handler路径无误 - 在handler函数开头添加日志,确认执行时机:
import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def lambda_handler(event, context): logger.info("Lambda handler triggered") pytest.main(["-v", "/path/to/your/tests"]) return {"statusCode": 200, "body": "Tests completed"}
4. 调整SAM invoke执行方式
不要直接将测试脚本作为事件传入,改用空事件或专用触发事件:
sam build -t template_pytest.yaml && sam local invoke TestFunction -e event.json
其中event.json为简单JSON文件:
{}
通过以上调整,可确保pytest仅在Lambda handler被正确触发时执行一次,同时解决容器初始化失败问题。
内容的提问来源于stack exchange,提问作者crushing necessity
相关产品推荐
相关产品推荐

