DEV Community

Cover image for Python AWS Lambda unit testing
Prabusah
Prabusah

Posted on • Edited on

5 2

Python AWS Lambda unit testing

Unit testing computational AWS Lambda

Consider a lambda handler retrieving two values from an event and returns the sum. (no interaction with other AWS Services).

index.py

def lambda_handler(event, context):
    result = int(event['first_number']) + int(event['second_number'])  
    return { 
        'sum' : result
    }
Enter fullscreen mode Exit fullscreen mode

Below is one option of unit testing using Python "unittest"

test_index.py

import unittest
import index
class TestSumOfTwoNumbers(unittest.TestCase):
    def test_sum(self):
        input = {
            "first_number": "1",
            "second_number": "2"
        }
        output = index.lambda_handler(input,{})
        self.assertEqual(3, output['sum'])
Enter fullscreen mode Exit fullscreen mode

Unit testing AWS Lambda interacting with other AWS Services/APIs

The handler code given below calling AWS Service API (get_function() of boto3 lambda client) fetching a lambda functions metadata.

index.py

import boto3

def lambda_handler(event, context):
    lambda_client = boto3.client('lambda')
    response = lambda_client.get_function(
        FunctionName='for-blog'
    )
    return response
Enter fullscreen mode Exit fullscreen mode

test_index.py

Below code shows how we performed Unit testing boto3 calls using Stubber. (Go through the in-line comments for brief explanation)

import boto3
from botocore.stub import Stubber
import index # source file
import unittest
from unittest.mock import patch

class TestLambdaMetadata(unittest.TestCase):
    def tests_Metadata_for_lambda_function(self):
        client = boto3.client('lambda')
        stubber = Stubber(client) # stubbed lambda client

        # expected response from boto3 lambda client's get_function call 
        expected_response = {u"Configuration": {"FunctionName": "for-blog", "Runtime": "python3.8"}}

        # stubbed lambda client (with specific parameter) call to get_function results in expected_response. 
        stubber.add_response('get_function', expected_response, {'FunctionName': 'for-blog'})

        # patching boto3 attribute of index.py with stubber
        with patch('index.boto3') as mock_boto3:
            with stubber:
                mock_boto3.client.return_value = client

                # call to lambda_handler in index.py 
                lambda_response = index.lambda_handler({}, 'context')
                self.assertEqual(lambda_response, expected_response)
Enter fullscreen mode Exit fullscreen mode

Image by Gerd Altmann from Pixabay

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay