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

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more