Local Testing of AWS Serverless Lambda Functions
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/8585017/openvalue-block-color-square.png)
Jens Knipper
- Software Engineer
- OpenValue Düsseldorf GmbH
- curious about new technologies
- likes well tested software!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9952564/DSC09591_2.jpg)
Agenda
- Testing of Microservices
- Introduction to Lambda Functions
- Testing of Lambdas
- Example Use-Case
- Demo
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
Testing of Microservices
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
Database Adapter
Service Layer
Domain
External Service
External Database
HTTP Adapter
REST Adapter
in Hexagonal Architecture*
* martinfowler.com/articles/microservice-testing
Testing of Microservices
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
Unit-Tests
Database Adapter
Service Layer
Domain
External Service
External Database
HTTP Adapter
REST Adapter
Testing of Microservices
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
Integration-Tests
Database Adapter
Service Layer
Domain
External Service
External Database
HTTP Adapter
REST Adapter
Testing of Microservices
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
Component-Tests
Database Adapter
Service Layer
Domain
External Service
External Database
HTTP Adapter
REST Adapter
Testing of Microservices
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
Database Adapter
Service Layer
Domain
External Service
External Database
HTTP Adapter
REST Adapter
Summary
Testing of Microservices
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
Unit
Integration
Component
Manual
Summary
e2e
Unit
Introduction to Lambdas
- simple function - very small!
- e.g. no webserver needed
- triggered by event
- custom
- AWS specific
- e.g. fileupload to S3
- scales automatically
- runs your function only when needed
- pay what you consume
- no load - no lambda running
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951762/Arch_AWS-Lambda_64_5x.png)
Introduction to Lambdas
- size constrained by framework
- only one event allowed
- no tendency to grow
- can be used in a Microservices architecture
- API Gateway required
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951762/Arch_AWS-Lambda_64_5x.png)
Testing of Lambdas
- Lambdas can be Microservices!
- testing should be the same!
- same tools
- Dependency Injection
- Testcontainers
- Wiremock
- ...
- new tools
- LocalStack
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
Example Use-Case
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951761/Arch_Amazon-Simple-Storage-Service_64_5x.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951762/Arch_AWS-Lambda_64_5x.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/8585017/openvalue-block-color-square.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/8585017/openvalue-block-color-square.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/8585017/openvalue-block-color-square.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/8585017/openvalue-block-color-square.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/8585017/openvalue-block-color-square.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/8585017/openvalue-block-color-square.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
public class EventHandler
implements RequestHandler<Input, Output> {
...
public EventHandler() {
final StorageService storageService = new StorageService(...);
final ImageService imageService = new ImageService(...);
this.eventHandlingService =
new EventHandlingService(storageService, imageService);
}
@Override
public Output
handleRequest(final Input input, final Context context) {
return eventHandlingService.handleEvent(input);
}
Example Use-Case
EventHandler
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
public class Input {
private String bucket;
private String key;
...
}
Example Use-Case
Input & Output
public class Output {
private String bucket;
private String key;
...
}
Example Use-Case
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
public class EventHandlingService {
private final StorageService storageService;
private final ImageService imageService;
public EventHandlingService(...) {
...
}
public Output handleEvent(final Input input) {
final InputStream inputStream = storageService.getObject(...);
...
final BufferedImage newImage = imageService.resize(...);
...
storageService.uploadFile(...);
return new Output(...);
}
}
EventHandlingService
Demo
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
Summary
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
- manual Dependency Injection
- independent testing
- Hexagonal Architecture
- testing external dependencies
- component tests
- ensure Lambda is executable
- reliable test suite for automatic testing
Other Clouds?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
- Microsoft Azure
- Azurite
- Google Cloud Platform
- Google App Engine local development server
Resources
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)
- Slides
https://slides.com/jensknipper/testing-aws-lambdas - Demo Code
https://github.com/JensKnipper/testing-aws-lambdas
- Testing Microservices
https://martinfowler.com/articles/microservice-testing
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9971425/f1f7a80de2e44dae50eab64bbc296036.png)
Thank you!
Please ask questions.
jens@openvalue.de
@OpenValue
openvalue.eu
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9971425/f1f7a80de2e44dae50eab64bbc296036.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1887248/images/9951703/openvalue-text-color.png)