aws функция юнит-теста boto3, которая вызывает лямбда-функцию - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть python функция, которая вызывает AWS лямбда-функцию.

#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: 

1 Ответ

0 голосов
/ 17 апреля 2020

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

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

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