Native Testing A Serverless API (API Gateway And Lambda)

No Comments

This text is for anybody battling testing cloud companies domestically, and particularly for folks eager to domestically take a look at an API that makes use of API Gateway and Lambda, with the Serverless framework, on AWS. I used to be as soon as in determined want of this data, and my co-worker Joseph Jaffe helped me put this answer into place.

A extremely popular and fast API answer is utilizing Serverless together with API Gateway and Lambda. When you’ve got by no means performed this earlier than, you possibly can learn extra about it right here. If you have already got expertise, and are in search of inventive methods to domestically take a look at, then hold studying. Bonus should you like 🌮🌮!

The Drawback

When establishing an API utilizing the Serverless framework, there are vital decisions to make. Some are extraordinarily vital: they will make your life a lot simpler as you construct your API, or trigger you big complications sooner or later. As an illustration, after I first began my API, I used to be establishing every endpoint in its personal Serverless challenge folder. Thus every endpoint had distinctive URLs. That is unhealthy observe for an API answer that wants one base URL with a number of service factors. We modified the answer to have all endpoints in the identical Serverless challenge, and that allowed us to make use of one additional helpful side of Lambda — layers. Lambda layers are a solution to share code throughout API endpoints, lowering the quantity of repeated code throughout the API challenge. You possibly can learn extra about Lambda Layers right here, however I digress. Let’s get again to the issue: native testing!

Once you create a brand new API endpoint, you will need to deploy the complete API to incorporate the brand new useful resource in API Gateway and get the URL for it. Upon getting performed that, you possibly can deploy particular person sources.

Deploying for Serverless takes time. A number of time. As an illustration, see these common deploy occasions for certainly one of our final initiatives:

Deploying a single endpoint: ~7 seconds 🙂
Deploying full API (~12 sources): ~24 seconds 😔
Deploying Layers (2 layers): ~32 seconds 💀

Whereas these occasions don’t seem too unhealthy at first look, think about making an attempt to shortly and iteratively take a look at out adjustments in your API. Having every deploy over 1 minute lengthy is a big time-hog and can kill your momentum. Stretch this over weeks of improvement and you will notice why all of us want an answer to check Lambda capabilities domestically.

Our Resolution

With a view to shortly flush out the apparent errors, we require native testing. With a view to take a look at domestically, we discovered that serverless invoke native permits us to do that within the easiest method. This not solely permits us to run Lambda scripts domestically, however we will additionally add breakpoints utilizing Debug Mode in Visible Studio Code. When you’ve got by no means performed with it, Debug Mode in VSC is absolutely useful.

An important side of native testing is on the spot suggestions. No extra ready round for layers, capabilities or total APIs to deploy! Tons of time saved throughout the preliminary construct and your (endurance in addition to your) Program Director will love you for it!


The final Serverless API challenge we labored on saved all the info in JSON information hosted on AWS S3 buckets. It’s possible you’ll be studying the info from a database, so that you must be sure you can nonetheless entry the info whereas operating domestically. A technique could be to arrange the database domestically in your machine. In the end, each challenge is exclusive and requires you to assume creatively for an answer that meets your wants.

Surroundings Variables

To ensure that us to know if we’re operating domestically or not, we created an setting variable to cross in by means of our native invocation. The variable is known as LOCAL_DEV and is used to test if we needs to be loading the info from S3 or from an area file system folder, like so:

const information =
course of.env.LOCAL_DEV === “true”
? require(`./information/tacos.json`)
: //deal with loading/setting the info as you repeatedly would

Notice above that the boolean worth of true is in quotes. Surroundings variables all the time come by means of as strings, so be able to deal with this truth of life.

We have now a snapshot of the info saved on S3 on our native computer systems, so after we are in native improvement mode, we use that native information as a way to run and take a look at the code domestically.

Moreover, in case you are utilizing layers in Lambda, you’ll need to level on to the code versus referring to it by title, on the prime of your Lambda file:

const apiCommon = course of.env.LOCAL_DEV === “true”
? require(“../layers/apicommon/nodejs/node_modules/apicommon/index”)
: require(“apicommon”);

Native Invocation

Upon getting all code in place to permit the Lambda perform to run efficiently domestically, then you possibly can attempt invoking the perform. Right here is an instance invocation of an endpoint referred to as tacos (🌮🌮) that will get all tacos from a meals API. As a result of I ❤️ 🌮🌮. Code for this instance can discovered on Github.

That is copied and pasted from a command shortcut I outlined in my bundle.json file. That command requires you to place literal markers in entrance of all quotes. Right here is that command from bundle.json in its entirety:

“scripts”: {
“local-tacos”: “serverless invoke native –function tacos –data ‘{ “queryStringParameters”: {“kind”: “breakfast”, “filling1”: “egg”, “filling2”: “bacon”, “filling3”: “cheese”, “tortilla”: “flour”, “salsa”: “Salsa Doña”}}’ -e LOCAL_DEV=true > output.json”

Okay, now let’s take a look at this command and what every half does. I’m eradicating the entire literal markers for simpler readability.

serverless invoke native –function tacos –data ‘{ “queryStringParameters”: {“kind”: “breakfast”, “filling1”: “egg”, “filling2”: “bacon”, “filling3”: “cheese”, “tortilla”: “flour”, “salsa”: “Salsa Doña”}}’ -e LOCAL_DEV=true > output.json

First, the bottom half:

serverless invoke native –function tacos

The merchandise above says to domestically invoke the API endpoint “tacos” (native 🌮🌮 are the most effective, proper?) which will get a set of tacos filtered by no matter question string parameters you ship it. Subsequent, let’s take a look at the second half.

–data ‘{ “queryStringParameters”: {“kind”: “breakfast”, “filling1”: “egg”, “filling2”: “bacon”, “filling3”: “cheese”, “tortilla”: “flour”, “salsa”: “Salsa Doña”}}’

Right here is the place we will outline no matter question string parameters we’re passing into the API endpoint. For this instance, we cross into the API endpoint all of the attributes that describe the taco(s) we’re in search of. In our case, we’re in search of egg, bacon and cheese tacos on a flour tortilla with Salsa Doña.

Notice: Any guess as to the place the taco described above (with Salsa Doña) might be present in Austin, Texas, USA? If you realize, please reply within the feedback!

If that you must take a look at a bunch of parameters, you might save them out in a testing/question.json file(s) so you might do one thing like:

yarn local-taco query-success yarn local-taco query-fail

This might be begin for an API testing setting!

The third a part of the decision is for outlining any setting variables.

-e LOCAL_DEV=true

This tells our Lambda code very clearly we’re operating this perform domestically and to ensure and put together for that by pulling all sources in domestically as properly.

Final, I pipe the outcomes right into a JSON file.

> output.json

From right here I can simply confirm if the outcomes are appropriate or if an error was thrown.


That sums it up! In case you didn’t see the hyperlink earlier, I’ve a pattern challenge written up you can attempt by yourself, utilizing the Serverless framework, the AWS companies API Gateway, and Lambda.

Additionally, if in case you have concepts on the best way to make this answer higher, or different various options, I’d love to listen to about your suggestions/ideas/experiences within the feedback under.

Additional Studying On Smashing Journal

Orchestrating Complexity With Net Animations API, Kirill Myshkin
Selecting A New Serverless Database Expertise At An Company (Case Research), Michael Rispoli
Gatsby Serverless Features And The Worldwide House Station, Paul Scanlon
Flaky Checks: Getting Rid Of A Residing Nightmare In Testing, Ramona Schwering

🎧 Bonus: Smashing Podcast Episode 22 With Chris Coyier: What Is Serverless? (moderated by Drew McLellan)

    About Marketing Solution Australia

    We are a digital marketing company with a focus on helping our customers achieve great results across several key areas.

    Request a free quote

    We offer professional SEO services that help websites increase their organic search score drastically in order to compete for the highest rankings even when it comes to highly competitive keywords.

    Subscribe to our newsletter!

    More from our blog

    See all posts

    Leave a Comment