How can I test lambda in local using python?

I think that Moto, a library that allows your tests to easily mock out AWS Services, could be very useful.

Imagine you have the following python code that you want to test:

 import boto3

 class MyModel(object):
    def __init__(self, name, value):
        self.name = name
        self.value = value

    def save(self):
        s3 = boto3.client('s3', region_name='us-east-1')
        s3.put_object(Bucket='mybucket', Key=self.name, Body=self.value)

Take a minute to think how you would have tested that in the past.

Now see how you could test it with Moto:

import boto3
from moto import mock_s3
from mymodule import MyModel

@mock_s3
def test_my_model_save():
conn = boto3.resource('s3', region_name='us-east-1')
# We need to create the bucket since this is all in Moto's 'virtual' AWS account
conn.create_bucket(Bucket='mybucket')

model_instance = MyModel('steve', 'is awesome')
model_instance.save()

body = conn.Object('mybucket', 'steve').get()['Body'].read().decode("utf-8")

assert body == b'is awesome'    

With the decorator wrapping the test, all the calls to s3 are automatically mocked out. The mock keeps the state of the buckets and keys.


You can run your Lambda functions in the same way you would run any python script e.g.

if __name__ == "__main__":
    event = []
    context = []
    lambda_handler(event, context)

If you use virtual environments, this helps ensure you have all the required dependencies installed for your lambda function alongside the correct python version.

Is there any additional services you need that are present in 'localstack' that you don't have locally?


I have used Python Lambda Local in pip, https://pypi.python.org/pypi/python-lambda-local

Hope it helps you.