Как провести модульное тестирование лямбда-логики, которая использует методы слоя? - PullRequest
0 голосов
/ 15 февраля 2019

Привет, у меня есть AWS Lambda, и я хотел добавить к нему слой.Я хотел бы иметь возможность просто проверить отдельные методы лямбда.Однако многие из них используют логику слоя, поэтому мне кажется, что это нелегко.Каков наилучший подход для этого?

Один из подходов заключается в том, чтобы упаковать слой, хост где-то и использовать его в качестве зависимости.В таком случае зачем вообще использовать слои?

Другая идея, которую я имею, - это локальное развертывание лямбды с помощью sam-cli.Я знаю, как использовать его для проверки всей лямбда-логики, но не вижу, как раздельно тестировать методы; / Каков ваш опыт?KR

РЕДАКТИРОВАТЬ.Мое решение

  • Добавить pytest

  • Поместить все тесты в test каталог

  • Добавитьтестовый лямбда-обработчик, который вызывает тесты

import pytest def lambda_handler(event, _): res = pytest.main(['-x', './tests']) return res

  • Добавить template.yml, который указывает на ранее созданный лямбда-обработчик

Resources: MyFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: src/ Handler: test.lambda_handler Runtime: python3.6 Events: MyInfo: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /my-service/test Method: get Environment: Variables: ELASTICSEARCH_DOC_TYPE: "article" ELASTICSEARCH_INDEX: "artilces" ELASTICSEARCH_HOST: "elastic" ELASTICSEARCH_PORT: "9200" ELASTICSEARCH_URL: "http://my_elastic.com:9200" Layers: - arn:aws:lambda:eu-west-1:XXXXXXXXXXXXX:layer:lambda_layer:37

  • Пробег sam local invoke --no-event

1 Ответ

0 голосов
/ 28 апреля 2019

Я пытался сделать то же самое и нигде не мог найти ответ.Подумав немного над проблемой, я придумал довольно чистый подход.Я заканчиваю запись в блоге об этом, которую я опубликую здесь, но в основном я использовал шаблон Factory, чтобы загрузить свой код слоя и смоделировал код во время модульных тестов.

Это будет выглядеть примерно так:

Предположим, что весь код вашего слоя инкапсулирован в класс с именем SharedCode.Вы можете использовать статическую фабрику, которая загружает SharedCode с помощью условного импорта:

class Factory:

   def __init__(self):
       self._shared = None

   def set_shared_code(self, shared_code):
       self._shared = shared_code

   def get_shared_code(self):
       if not self._shared:
           from shared_code import SharedCode
           self._shared = SharedCode()

       return self._shared


FACTORY = Factory()

В своих тестах вы можете использовать установщик Factory для макетирования кода Layer, но в вашей реальной функции Lambda вы просто загружаетеобщий код, использующий Factory, который благодаря условному импорту и среде выполнения Lambda, которая внедряет Layer, сможет без проблем загрузить его.

Надеюсь, это поможет, и я вернусь, чтобы получить большезавершите пример, как только я закончу создавать образцы для своего поста в блоге.

РЕДАКТИРОВАТЬ: упомянутый выше пост в блоге готов, и вы можете прочитать его здесь :

...