Squeak.ru - шаблоны программирования

функция aws boto3 unittest, которая вызывает лямбда-функцию

У меня есть функция Python, которая вызывает функцию AWS Lambda.

#lambda.py
import boto3
import os

client    = boto3.client('lambda')
MY_LAMBDA = os.environ['MY_LAMBDA']

def invoke_function(input):
    response = client.invoke(
        FunctionName=MY_LAMBDA,
        InvocationType='RequestResponse',
        Payload=json.dumps(input)
    )

Как я могу создать модульный тест для этой функции? Я использовал Moto для других сервисов AWS, но не смог заставить его работать с Lambda.

Моя попытка использовать moto:

#test_lambda.py

from unittest.mock import MagicMock, patch
from unittest.mock import ANY
from moto import mock_lambda
import boto3
import os
import zipfile
import io
import lambda

class LambdaTest(unittest.TestCase):

    def get_test_zip_file(self):
        pfunc = '''
                def lambda_handler(event, context):
                    return event
                '''
        zip_output = io.BytesIO()
        zip_file = zipfile.ZipFile(zip_output, 'w', zipfile.ZIP_DEFLATED)
        zip_file.writestr('lambda_function.py', pfunc)
        zip_file.close()
        zip_output.seek(0)
        return zip_output.read()

    @mock_lambda
    def test_invoke_requestresponse_function(self):
        conn = boto3.client('lambda', 'us-east-1')
        conn.create_function(
            FunctionName='test-func',
            Runtime='python3.8',
            Role='test-iam-role',
            Handler='lambda_function.lambda_handler',
            Code={
                'ZipFile': self.get_test_zip_file(),
            },
            Description='test lambda function',
            Timeout=3,
            MemorySize=128,
            Publish=True
        )

        sample_input = {'msg': 'Test Input'}

        result = lambda.invoke_function(sample_input)

Это ошибка с:

botocore.exceptions.ClientError: An error occurred (404) when calling the Invoke operation: 

  • Кажется, не хватает некоторого кода для инициализации клиента, не могли бы вы добавить его во фрагмент кода? 09.04.2020
  • @Maurice Обновлен фрагмент с инициализацией клиента. 09.04.2020
  • Где вы устанавливаете os.environ['MY_LAMBDA']? 13.04.2020
  • Я экспортирую эту переменную env перед запуском тестов. export MY_LAMBDA=test-func 14.04.2020
  • какие-либо обновления по этому поводу? 28.12.2020

Ответы:


1

Клиент boto3 в lambda.py инициализируется до того, как будет выполнено какое-либо насмешливое действие. Поскольку этот клиент не знает, что над ним издеваются, он, вероятно, попытается поговорить с самим AWS.

Для вашего конкретного тестового примера есть несколько решений:

  • Поместите import lambda в сам тест, чтобы boto3-клиент создавался после инициализации декораторов
  • Переопределите клиент с имитированной версией: lambda.client = conn
  • Передайте издевательский клиент в качестве аргумента lambda.invoke_function(conn, sample_input)
17.04.2020
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...