@michikuehne
TDD for APIs in a Microservice World
Michael Kuehne-Schlinkert Head of Development @ Cybus
@michikuehne
Cybus brings untapped Data Sources to a secure API
Access Control
Pre-Processing & API
Shopfloor Protocols
Security Monitoring Maintenance Efficiency Sovereignty
@michikuehne
Our Challenges
Security, Reliability & Scalability è Service Level Agreements
Better Representation of Customer Needs through Tests & Codes
Loosly coupled but highly connected Microservices
Efficient TDD with limited resources
@michikuehne
„How to validate that our API is working as intended?“
by Steve Klabnik
@michikuehne
„How to efficiently validate that our microservice ecosystem is working as
intended?“ by Michael Kuehne-Schlinkert
@michikuehne
Simplified Ecosystem
Device Service
Data {...}
Data {...}
Data {...}
UI Service
Auth Service
@michikuehne
Where to start?
Story
As a <role>,
__.I want <feature>
__.so that <reason>.
Example
__.As an admin of the cybus middleware
__.I want to control the read access to my devices
__.so that users can only read the data they are allowed to
Scenario
GIVEN <context>
__.WHEN <event>
__.THEN <outcome>
Example
__. GIVEN External Device
__. GIVEN Device Service
__. GIVEN Auth Service
__. WHEN External Device provides new data
__. WHEN Read Access to Device is granted
__. THEN Device Service reads data from external device
@michikuehne
Test Scenario
Device Service
Data {...}
Data {...}
Data {...}
UI Service
Auth Service
External Device
Data {...}
Stubbed
@michikuehne
Acceptance Tests
Platform Tests
Turn Scenarios into Tests
Focus on whole Microservice Ecosystem
Verify Functionality of Ecosystem
External / Third-Party Services are stubbed/mocked
Black Box Testing
Entry Point of Platform Test depends on Scenario API
GUI
Contract Tests
Turn API Specifications into Tests
Focus on only One Mircroservice
Verify the Interface (Contract)
Black Box Testing
@michikuehne
Integration Tests
A.k.a. Component Tests & Service Tests
Focus on only One Microservice
Verify Functionality of One Service
Break down Scenarios
End-to-End Tests – but not to end of ecosystem
Internal Services are stubbed/mocked
Gray Box Testing (Black & White)
Resources
Domain
ORM
Exte
rnal
Cl
ient
Stubbed Service
Ext. DB Stb.
Test Client
Simplified Microservice Architecture
@michikuehne
Functional Tests
Controller
Industrial Protocol
Device Handler
Focus on 2+ Classes/Modules of Domain
Verify Interaction between Modules
White Box Testing
Internal Dependencies are stubbed/mocked
Example Domain of Microservice
Stubbed
@michikuehne
Unit Tests
Controller
Industrial Protocol
Device Handler
Focus on One Unit (Class/Module) of Domain
Verify Functionality of One Unit
Internal Dependencies are stubbed/mocked
White Box Testing
Example Domain of Microservice
Stubbed
@michikuehne
Our TDD Cycle
Acceptance Tests
Integration Tests
Functional Tests
Unit Tests Code
Black Box Gray Box White Box
@michikuehne
Our TDD Cycle with aspired Test Coverage
Acceptance Tests
Integration Tests
Functional Tests
Unit Tests Code
tcU à 100%
tcI à 100% tcF à 100% - tcI
tcI + tcF à 100%
tcA à x%
tc = test coverage
x –
@michikuehne
Lessons Learned
It works! We overcame Testing Hell
Less Test Code and less Fragile Tests but high test coverage
Quality of Story Definitions increased with mandatory Scenarios
Efficency comes with the right Tools
Each Microservice must provide Test Library (e.g. Stubs)
Deterministic Environments gained Complexity
Asynchronous Services require Gray to White Box Testing
Functional Tests became our Plan B
@michikuehne
cybus.io @cybus_io [email protected]
Pssst! We‘re hiring!
Michael Kuehne-Schlinkert @michikuehne [email protected]
Thx! ...and happy testing!
@michikuehne
Appendix
Icons by Gregor Cresnar from www.flaticon.com is licensed by CC 3.0 BY
Icons by Freepik from www.flaticon.com is licensed by CC 3.0 BY