Тестирование Python AWS Lambda Boto3 инициализации - PullRequest
0 голосов
/ 07 февраля 2019

Для лямбды лучшая практика - инициализировать зависимости вне обработчика.

Я создаю простую функцию 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 не приводит к ошибке при You must specify a region.

При Option 1 он вызывает ошибку при вызове импорта, а при Option 2 это происходит при patch setup

Я не могу использовать ~/.aws/config, потому что он будет использоваться на КИ, который не может этого иметь.Я также не хочу изменять вызов boto.client, чтобы включить регион по умолчанию.

Есть что-то, чего мне не хватает?

1 Ответ

0 голосов
/ 07 февраля 2019

Хотя я не уверен, в чем проблема с приведенным выше кодом, я бы посоветовал вам использовать библиотеку moto, когда вы пытаетесь смоделировать сервисы AWS в Python (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

Кроме того - и в качестве личного предпочтения - я бы не советовал помещать слишком много логики в вашу реальную лямбда-функцию. Просто возьмите входящее событие и отправьте его как можно большему числу других функций / классов. Это должно помочь упростить тестирование.

Если вы действительно хотите продолжать использовать @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)

Здесь lambda_function - это файлсодержащий ваш обработчик, и он находится в каталоге / package example . Вы также можете смоделировать boto3 с помощью 'example.lambda_function.boto3' и вернуть клиента самостоятельно.

...