测试 Python AWS Lambda boto3 初始化

Raq*_*ães 6 python mocking amazon-web-services python-unittest boto3

对于 lambda,最佳实践是在处理程序外部初始化依赖项。

我正在创建一个简单的 python 函数,其工作原理与蓝图类似:

import boto3


s3 = boto3.client('ssm')


def lambda_handler(event, context):
    # some code here
Run Code Online (Sandbox Code Playgroud)

还有测试

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):
        # ...
Run Code Online (Sandbox Code Playgroud)

我似乎无法正确设置模拟,以便调用boto.client不会出错You must specify a region.

Option 1导入调用期间出错,在设置Option 2期间出错patch

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

我有什么遗漏的吗?

Hie*_*ron 1

虽然我不确定上面的代码有什么问题,但我建议您在尝试使用 Python 模拟 AWS 服务时使用 moto 库(https://github.com/spulec/moto):

import boto3
from moto import mock_s3
from lambda_function import handler

class TestHandler(unittest.TestCase):

    @mock_s3
    def test(self, boto3_mock):
       # setup your connection to s3 or ssm. Make sure this matches the setup in the lambda file.
       conn = boto3.client('s3')
       conn.create_bucket(Bucket='mybucket') # setup your fake resources
       # call your lambda function
Run Code Online (Sandbox Code Playgroud)

此外,作为个人偏好,我建议不要在实际的 lambda 函数中放入太多逻辑。只需将传入事件尽可能发送给其他函数/类即可。这应该有助于简化测试。

如果您确实想继续使用 @patch 而不是 moto 库,我得到了可以使用以下内容的代码:

from mock import patch
from example import lambda_function

class TestStringMethods(unittest.TestCase):

    @patch('example.lambda_function.boto3.client')
    def test_my_model(self, some_mock):
        # further setup of test
        lambda_function.my_handler(None, None)
Run Code Online (Sandbox Code Playgroud)

这里,lambda_function是包含处理程序的文件,它位于目录/包example中。您还可以使用“example.lambda_function.boto3”模拟 boto3 本身并自己返回客户端。