Slide 1

Slide 1 text

@michikuehne TDD for APIs in a Microservice World Michael Kuehne-Schlinkert Head of Development @ Cybus

Slide 2

Slide 2 text

@michikuehne Cybus brings untapped Data Sources to a secure API Access Control Pre-Processing & API Shopfloor Protocols Security Monitoring Maintenance Efficiency Sovereignty

Slide 3

Slide 3 text

@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

Slide 4

Slide 4 text

@michikuehne „How to validate that our API is working as intended?“ by Steve Klabnik

Slide 5

Slide 5 text

@michikuehne „How to efficiently validate that our microservice ecosystem is working as intended?“ by Michael Kuehne-Schlinkert

Slide 6

Slide 6 text

@michikuehne Simplified Ecosystem Device Service Data {...} Data {...} Data {...} UI Service Auth Service

Slide 7

Slide 7 text

@michikuehne Where to start? Story   As a , __.I want __.so that . 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 __.WHEN __.THEN 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

Slide 8

Slide 8 text

@michikuehne Non-Success Scenarios Example __. GIVEN External Device __. GIVEN Device Service __. GIVEN Auth Service __. WHEN External Device provides new data __. WHEN Read Access to Device is not granted __. THEN Device Service fails to read data from external device Example __. GIVEN External Device __. GIVEN Device Service __. NOT GIVEN Auth Service __. WHEN External Device provides new data __. THEN ..... Error Scernarios Failover Scenarios

Slide 9

Slide 9 text

@michikuehne Test Scenario Device Service Data {...} Data {...} Data {...} UI Service Auth Service External Device Data {...} Stubbed

Slide 10

Slide 10 text

@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 (General Contract)   Black Box Testing

Slide 11

Slide 11 text

@michikuehne Each Consumer forms a Contract Device Service Contract PUT /device/ { mapping: ... } UI Service Auth Service Contract GET /devices/ [ { mapping: ... } ]

Slide 12

Slide 12 text

@michikuehne Our Solution: One Contract for All Device Service Contract PUT /device/ GET /devices/ UI Service Auth Service

Slide 13

Slide 13 text

@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 External Client Stubbed Service Ext. DB Stb. Test Client Simplified Microservice Architecture

Slide 14

Slide 14 text

@michikuehne Functional Tests Controller Industrial Protocol Device Handler   Focus on 2+ Classes/Modules of Domain Verify Interaction between Modules   Internal Dependencies are stubbed/mocked   White Box Testing Example Domain of Microservice Stubbed

Slide 15

Slide 15 text

@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

Slide 16

Slide 16 text

@michikuehne Our TDD Cycle Acceptance Tests Integration Tests Functional Tests Unit Tests Code Black Box Gray Box White Box

Slide 17

Slide 17 text

@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 –

Slide 18

Slide 18 text

@michikuehne Testing Pyramid Acceptance Integration Unit Functional (optional)

Slide 19

Slide 19 text

@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 Don‘t forget the Human Factory

Slide 20

Slide 20 text

@michikuehne Internal Adoption It‘s a process! Be patient & encourage   Support from Management   Trainings & Pair Programming on real World Problems One TDD Evengalist per Team   Start with Contract Tests Awesome Test Libraries are critical Measure progess – Make it visible

Slide 21

Slide 21 text

@michikuehne cybus.io @cybus_io hello@cybus.io Pssst! We‘re hiring! Michael Kuehne-Schlinkert @michikuehne kuehne@cybus.io Thx! ...and happy testing! TDD gives you more time for fun stuff

Slide 22

Slide 22 text

@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