gpt4 book ai didi

python - 测试 Python AWS Lambda boto3 初始化

转载 作者:行者123 更新时间:2023-12-01 08:22:03 25 4
gpt4 key购买 nike

对于 lambda,它是 best practice在处理程序外部初始化依赖项。

我正在创建一个简单的 python 函数,其工作方式类似于蓝图:

import boto3


s3 = boto3.client('ssm')


def lambda_handler(event, context):
# some code here

还有测试

from lambda_function import handler # Option 1
import lambda_function # Option 2

class TestHandler(unittest.TestCase):

@patch('lambda_function.handler.boto3.client')
def test(self, boto3_mock):
# ...

我似乎无法正确设置模拟,以便 boto.client 调用不会因 您必须指定区域而出错。

选项1上,它在导入调用期间出错,在选项2上,它在补丁设置期间出错

我无法使用 ~/.aws/config 因为它将在没有该配置的 CI 上使用。我也不想更改 boto.client 调用以包含默认区域。

我有什么遗漏吗?

最佳答案

我的客户端类中的 boto3 s3 客户端和我的 pytest 中的 moto 遇到了同样的问题。我通过将 boto3 客户端包装到单例中解决了这个问题:

这是我的客户端代码 hello_world/app.py

class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]

class S3BotoClient(metaclass=Singleton):
def __init__(self, *args):
print(f"creating s3 cient with args {args}")
self.client = boto3.client("s3", *args)

def lambda_handler(event, context):
s3 = S3BotoClient().client
s3.list_buckets()

这是一个单元测试:

from moto import mock_s3
from hello_world import app

@pytest.fixture()
def apigw_event():
# return some sample event here

@mock_s3
def test_lambda_handler(apigw_event):
ret = app.lambda_handler(apigw_event, "")
ret = app.lambda_handler(apigw_event, "")
# do assertions here

因此 S3 客户端仅在 moto 虚拟环境初始化后实例化一次

关于python - 测试 Python AWS Lambda boto3 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54578701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com