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
以包含默认区域。
我有什么遗漏的吗?
虽然我不确定上面的代码有什么问题,但我建议您在尝试使用 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 本身并自己返回客户端。
归档时间: |
|
查看次数: |
3880 次 |
最近记录: |