SlideShare a Scribd company logo
1 of 76
A Better Approach for Testing Micro-Services
Introducing: Test Kits in Practice
Maxim Novak, Wix Back-end
https://github.com/maximn@maximnovakmaximn@wix.com
With Wix you can create a stunning website.
I’m Maxim Novak
▪ Team leader at Wix
▪ Building core services
▪ 10 years developing software
▪ TDD and clean code enthusiast
Lithuania
Vilnius
Kyiv
Dnipro
Wix Engineering Locations
Israel
Tel-Aviv
Be’er Sheva
Ukraine
AGENDA
Why testing in a microservices
architecture is challenging
How to approach these
challenges
Why testing in a microservices
architecture is challenging
01
MONOLITH In the old world,
testing was
simple.
http://3gamma.com/insights/architecting-speed-agile-innovators-accelerate-growth-microservices/
You start
like this...
https://www.slideshare.net/BruceWong3/the-case-for-chaos https://twitter.com/adrianco/status/441883572618948608
...and end up
like this.
NETFLIX TWITTER
Testing with microservices
is challenging.
You still want...
❏ A short and reliable
feedback loop
❏ To test assumptions vs.
reality (logic/protocol)
RECAP
How we Test
MY APP
STORE
SESSION
(USER ID)
USERS
SERVER
NAME IN THE
CONFIRMATION
PAGE
Example
Scenario
SESSION
(USER ID)
CONFIRMATION
PAGE WITH
NAME
Recap
End to End
(Out-of-process
component tests)
MY APP
STORE
?
TEST
Recap
Integration Tests
MY APP
STORE
USER ID
?
TEST
NAME
USERS
CLIENT
How to
approach it
02
#0
Don’t test
(the integration)
NOT
REALLY,
RIGHT?
OUR
MICRO
SERVICE
MY APP
STORE
TEST
USERS
CLIENT
STUB
USERS
CLIENT
Users
SERVER
SESSION
(USER ID)
CONFIRMATION
PAGE WITH
NAME
MY APP
STORE
if (isTestMode) {
// ...
}
else {
// ...
}
TEST
USERS
CLIENT
STUB
USERS
CLIENT
SESSION
(USER ID)
CONFIRMATION
PAGE WITH
NAME
Users
SERVER
The real
implementation
is never tested
(well … only in
production)
MY APP
STORE
TEST
STUB
USERS
CLIENT
SESSION
(USER ID)
CONFIRMATION
PAGE WITH
NAME
Users
SERVERUSERS
CLIENT
You DO want an “out of process
component tests” (e2e).
❏E2E
❏Integration
✘
✘
#0
Don’t test
(the integration)
OUR
MICRO
SERVICE
OUR
MICRO
SERVICE
#1
Run against an
external environment
USERS
SERVER
MY APP
STORE
SESSION
(USER ID)
TEST
CONFIRMATION
PAGE WITH
NAME
❏ A short and reliable
feedback loop
❏ To test assumptions vs.
reality (logic/protocol)
✘
BEHAVES AS
WE ASSUME ✔
#1
Run against an
external environment
❏ A short and reliable
feedback loop
❏ To test assumptions vs.
reality (logic/protocol)
✘
ENSURE
COMMUNICATION
PROTOCOL &
SCHEMA
✔
#1
Run against an
external environment
Running against external environment is
unreliable. It has a high maintenance
cost and it adds complexity to your app.
#1
Run against an
external environment
OUR
MICRO
SERVICE
❏E2E
❏Integration
✘
✘
#2
Use test
doubles
STUB
FAKE
MOCK
OUR
MICRO
SERVICE
https://martinfowler.com/articles
/mocksArentStubs.html
HTTP
FAKE
USERS SERVER
MY APP
STORE
SESSION
(USER ID)
TEST
NAME IN THE
CONFIRMATION
PAGE
@Test
public void purchase_e2e() {
UUID userId = UUID.randomUUID();
String name = someName();
fakeUsersServer.givenUser(userId, name);
login(userId);
addItemToCart(itemId);
ConfirmationPage confirmationPage = purchase();
assertThat(confirmationPage, containsName(name));
}
#2
Use test
doubles
E2E
example
@Test
public void purchase_e2e() {
UUID userId = UUID.randomUUID();
String name = someName();
fakeUsersServer.givenUser(userId, name);
login(userId);
addItemToCart(itemId);
ConfirmationPage confirmationPage = purchase();
assertThat(confirmationPage, containsName(name));
}
#2
Use test
doubles
E2E
example
@Test
public void purchase_e2e() {
UUID userId = UUID.randomUUID();
String name = someName();
fakeUsersServer.givenUser(userId, name);
login(userId);
addItemToCart(itemId);
ConfirmationPage confirmationPage = purchase();
assertThat(confirmationPage, containsName(name));
}
#2
Use test
doubles
E2E
example
@Test
public void purchase_e2e() {
UUID userId = UUID.randomUUID();
String name = someName();
fakeUsersServer.givenUser(userId, name);
login(userId);
addItemToCart(itemId);
ConfirmationPage confirmationPage = purchase();
assertThat(confirmationPage, containsName(name));
}
#2
Use test
doubles
E2E
example
@Test
public void getName_success() {
UUID userId = UUID.randomUUID();
String name = someName();
fakeUsersServer.givenUser(userId, name);
String result = usersClient.getName(userId);
assertEquals(name, result);
}
#2
Use test
doubles
IT success
example
@Test
public void getName_success() {
UUID userId = UUID.randomUUID();
String name = someName();
fakeUsersServer.givenUser(userId, name);
String result = usersClient.getName(userId);
assertEquals(name, result);
}
#2
Use test
doubles
IT success
example
@Test
public void getName_success() {
UUID userId = UUID.randomUUID();
String name = someName();
fakeUsersServer.givenUser(userId, name);
String result = usersClient.getName(userId);
assertEquals(name, result);
}
#2
Use test
doubles
IT success
example
@Test
public void getName_success() {
UUID userId = UUID.randomUUID();
String name = someName();
fakeUsersServer.givenUser(userId, name);
String result = usersClient.getName(userId);
assertEquals(name, result);
}
#2
Use test
doubles
IT success
example
@Test(expected = UserNotFoundException.class)
public void getName_notFound() {
UUID userId = UUID.randomUUID();
fakeUsersServer.givenUserNotFound(userId);
usersClient.getName(userId);
}
#2
Use test
doubles
IT failure
example
@Test(expected = UserNotFoundException.class)
public void getName_notFound() {
UUID userId = UUID.randomUUID();
fakeUsersServer.givenUserNotFound(userId);
usersClient.getName(userId);
}
#2
Use test
doubles
IT failure
example
@Test(expected = UserNotFoundException.class)
public void getName_notFound() {
UUID userId = UUID.randomUUID();
fakeUsersServer.givenUserNotFound(userId);
usersClient.getName(userId);
}
#2
Use test
doubles
IT failure
example
@Test(expected = UserNotFoundException.class)
public void getName_notFound() {
UUID userId = UUID.randomUUID();
fakeUsersServer.givenUserNotFound(userId);
usersClient.getName(userId);
}
#2
Use test
doubles
IT failure
example
#2
Use test
doubles
❏ A short and reliable
feedback loop
❏ To test assumptions vs.
reality (logic/protocol)
✔
#2
Use test
doubles
❏ A short and reliable
feedback loop
❏ To test assumptions vs.
reality (logic/protocol)
✔
✔✘
WE IMPLEMENT THE
TEST DOUBLE IN A
WAY WE ASSUME IT
WORKS - NOT HOW IT
WORKS IN REALITY
#2
Use test
doubles
CONSUMER
CONSUMER
CONSUMER
CONSUMER
CONSUMER
CONSUMER
...AND, ALL OUR CONSUMERS
WILL HAVE TO IMPLEMENT
THEM TOO
SERVICE
PROVIDER
❏E2E
❏Integration
#2
Use test
doubles
STUB
FAKE
MOCK
✔✘OUR
MICRO
SERVICE
✔
We can do
better.
HAVE A MUCH
HIGHER LEVEL
OF CONFIDENCE
❏ A short and reliable
feedback loop
❏ To test assumptions vs.
reality (logic/protocol)
✔
✔
A lightweight version
of the real thing.
OUR
MICRO
SERVICE
#3
Test Kit from
Service Provider
USERS
TESTKIT
MY APP
STORE
SESSION
(USER ID)
TEST
NAME IN THE
CONFIRMATION
PAGE
@Test
public void purchase_e2e() {
UUID userId = UUID.randomUUID();
String name = someName();
User user = new UsersTestBuilder()
.withId(userId)
.withName(name)
.build();
usersTestkit.givenUser(user);
login(userId);
addItemToCart(itemId);
ConfirmationPage confirmationPage = purchase();
assertThat(confirmationPage, containsName(name));
}
#3
Test kits
E2E
example
@Test
public void purchase_e2e() {
UUID userId = UUID.randomUUID();
String name = someName();
User user = new UsersTestBuilder()
.withId(userId)
.withName(name)
.build();
usersTestkit.givenUser(user);
login(userId);
addItemToCart(itemId);
ConfirmationPage confirmationPage = purchase();
assertThat(confirmationPage, containsName(name));
}
#3
Test kits
E2E
example
@Test
public void purchase_e2e() {
UUID userId = UUID.randomUUID();
String name = someName();
User user = new UsersTestBuilder()
.withId(userId)
.withName(name)
.build();
usersTestkit.givenUser(user);
login(userId);
addItemToCart(itemId);
ConfirmationPage confirmationPage = purchase();
assertThat(confirmationPage, containsName(name));
}
#3
Test kits
E2E
example
@Test
public void purchase_e2e() {
UUID userId = UUID.randomUUID();
String name = someName();
User user = new UsersTestBuilder()
.withId(userId)
.withName(name)
.build();
usersTestkit.givenUser(user);
login(userId);
addItemToCart(itemId);
ConfirmationPage confirmationPage = purchase();
assertThat(confirmationPage, containsName(name));
}
#3
Test kits
E2E
example
@Test
public void getName_success() {
UUID userId = UUID.randomUUID();
String name = someName();
User givenUser = new UsersTestBuilder()
.withId(userId)
.withName(name)
.build();
usersTestkit.givenUser(givenUser);
String result = usersClient.getName(userId);
assertEquals(name, result);
}
#3
Test kits
IT success
example
@Test
public void getName_success() {
UUID userId = UUID.randomUUID();
String name = someName();
User givenUser = new UsersTestBuilder()
.withId(userId)
.withName(name)
.build();
usersTestkit.givenUser(givenUser);
String result = usersClient.getName(userId);
assertEquals(name, result);
}
#3
Test kits
IT success
example
@Test
public void getName_success() {
UUID userId = UUID.randomUUID();
String name = someName();
User givenUser = new UsersTestBuilder()
.withId(userId)
.withName(name)
.build();
usersTestkit.givenUser(givenUser);
String result = usersClient.getName(userId);
assertEquals(name, result);
}
#3
Test kits
IT success
example
@Test
public void getName_success() {
UUID userId = UUID.randomUUID();
String name = someName();
User givenUser = new UsersTestBuilder()
.withId(userId)
.withName(name)
.build();
usersTestkit.givenUser(givenUser);
String result = usersClient.getName(userId);
assertEquals(name, result);
}
#3
Test kits
IT success
example
@Test(expected = UserNotFoundException.class)
public void getName_notFound() {
usersClient.getName(UUID.randomUUID());
}
#3
Test kits
IT failure
example
@Test(expected = UserNotFoundException.class)
public void getName_notFound() {
usersClient.getName(UUID.randomUUID());
}
#3
Test kits
IT failure
example
@Test(expected = UserNotFoundException.class)
public void getName_notFound() {
usersClient.getName(UUID.randomUUID());
}
#3
Test kits
IT failure
example
public class UsersTestkit {
public void start(int port) {
...
}
public void stop() {
...
}
...
What the
consumer
gets?
public class UsersTestkit {
...
public void givenUser(User user) {
...
}
public void updateUser(UUID userId,
UserUpdate user) {
...
}
}
What the
consumer
gets?
How to build a testkit?
OUR
MICRO
SERVICE
Test
doubles
Real
thing
Test kits
You’re able to
communicate with
your consumers
Other services
Use test doubles
Database
Implement in-memory version
Cross-test with the real
implementation
WHEN SOMETHING
CHANGES - THEY KNOW
ABOUT IT
OUR
MICRO
SERVICE
What about next level
dependencies?
Other services
Use test doubles
Database
Implement in-memory version
Cross-test with the real
implementation
OUR TESTKIT WON’T
BRING MORE LEVELS
IN THE CHAIN OF
SERVICES!
OUR
MICRO
SERVICE
Integration Contract
Test
We want to make sure that our
testkit behaves like the real thing
OUR
MICRO
SERVICE
https://martinfowler.com/bliki
/IntegrationContractTest.html
INTEGRATION
CONTRACT TEST
USERS
TESTKIT
USERS
SERVER
In Memory DAO MySLQ DAO
USERS
SERVER
INTEGRATION
CONTRACT TEST
USERS
TESTKIT
MY APP
STORE
SESSION
(USER ID)
NAME IN THE
CONFIRMATION
PAGE
TEST
Disadvantages
➜ More development
➜ Build dependency (on
implementation)
#3
Test kits OUR
MICRO
SERVICE
#3
Test kits
OUR
MICRO
SERVICE
❏E2E
❏Integration
✔
✔
Thank You
https://github.com/maximn@maximnovakmaximn@wix.com

More Related Content

What's hot

Testing strategies for micro services - Ketan Soni, Jesal Mistry, ThoughtWorks
Testing strategies for micro services - Ketan Soni, Jesal Mistry, ThoughtWorksTesting strategies for micro services - Ketan Soni, Jesal Mistry, ThoughtWorks
Testing strategies for micro services - Ketan Soni, Jesal Mistry, ThoughtWorks
Thoughtworks
 
SystemVerilog Assertions (SVA) in the Design/Verification Process
SystemVerilog Assertions (SVA) in the Design/Verification ProcessSystemVerilog Assertions (SVA) in the Design/Verification Process
SystemVerilog Assertions (SVA) in the Design/Verification Process
DVClub
 
Introduction To Continuous Integration
Introduction To Continuous IntegrationIntroduction To Continuous Integration
Introduction To Continuous Integration
Christopher Read
 

What's hot (20)

Increasing Quality with DevOps
Increasing Quality with DevOpsIncreasing Quality with DevOps
Increasing Quality with DevOps
 
DevSecOps and the CI/CD Pipeline
 DevSecOps and the CI/CD Pipeline DevSecOps and the CI/CD Pipeline
DevSecOps and the CI/CD Pipeline
 
Building Security in Using CI
Building Security in Using CIBuilding Security in Using CI
Building Security in Using CI
 
Testing strategies for micro services - Ketan Soni, Jesal Mistry, ThoughtWorks
Testing strategies for micro services - Ketan Soni, Jesal Mistry, ThoughtWorksTesting strategies for micro services - Ketan Soni, Jesal Mistry, ThoughtWorks
Testing strategies for micro services - Ketan Soni, Jesal Mistry, ThoughtWorks
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
 
Compatibility Testing of Your Web Apps - Tips and Tricks for Debugging Locall...
Compatibility Testing of Your Web Apps - Tips and Tricks for Debugging Locall...Compatibility Testing of Your Web Apps - Tips and Tricks for Debugging Locall...
Compatibility Testing of Your Web Apps - Tips and Tricks for Debugging Locall...
 
Scale security for a dollar or less
Scale security for a dollar or lessScale security for a dollar or less
Scale security for a dollar or less
 
Strengthen and Scale Security for a dollar or less
Strengthen and Scale Security for a dollar or lessStrengthen and Scale Security for a dollar or less
Strengthen and Scale Security for a dollar or less
 
Continuous integration
Continuous integration Continuous integration
Continuous integration
 
SystemVerilog Assertions (SVA) in the Design/Verification Process
SystemVerilog Assertions (SVA) in the Design/Verification ProcessSystemVerilog Assertions (SVA) in the Design/Verification Process
SystemVerilog Assertions (SVA) in the Design/Verification Process
 
DevSecOps reference architectures 2018
DevSecOps reference architectures 2018DevSecOps reference architectures 2018
DevSecOps reference architectures 2018
 
Introduction To Continuous Integration
Introduction To Continuous IntegrationIntroduction To Continuous Integration
Introduction To Continuous Integration
 
The DevSecOps Builder’s Guide to the CI/CD Pipeline
The DevSecOps Builder’s Guide to the CI/CD PipelineThe DevSecOps Builder’s Guide to the CI/CD Pipeline
The DevSecOps Builder’s Guide to the CI/CD Pipeline
 
Continuous Integration
Continuous IntegrationContinuous Integration
Continuous Integration
 
CI-CD and DevOps with Ruby
CI-CD and DevOps with RubyCI-CD and DevOps with Ruby
CI-CD and DevOps with Ruby
 
DevSecops: Defined, tools, characteristics, tools, frameworks, benefits and c...
DevSecops: Defined, tools, characteristics, tools, frameworks, benefits and c...DevSecops: Defined, tools, characteristics, tools, frameworks, benefits and c...
DevSecops: Defined, tools, characteristics, tools, frameworks, benefits and c...
 
.NET Code Coverage for Continuous Integration using TeamCity and dotCover
.NET Code Coverage for Continuous Integrationusing TeamCity and dotCover.NET Code Coverage for Continuous Integrationusing TeamCity and dotCover
.NET Code Coverage for Continuous Integration using TeamCity and dotCover
 
#ATAGTR2019 Presentation "DevSecOps with GitLab" By Avishkar Nikale
#ATAGTR2019 Presentation "DevSecOps with GitLab" By Avishkar Nikale#ATAGTR2019 Presentation "DevSecOps with GitLab" By Avishkar Nikale
#ATAGTR2019 Presentation "DevSecOps with GitLab" By Avishkar Nikale
 
Continuous Delivery, Continuous Integration
Continuous Delivery, Continuous Integration Continuous Delivery, Continuous Integration
Continuous Delivery, Continuous Integration
 
What is Continuous Integration? | Continuous Integration with Jenkins | DevOp...
What is Continuous Integration? | Continuous Integration with Jenkins | DevOp...What is Continuous Integration? | Continuous Integration with Jenkins | DevOp...
What is Continuous Integration? | Continuous Integration with Jenkins | DevOp...
 

Similar to A better approach for testing microservices - introducing test kits in practice

Keep your Wicket application in production
Keep your Wicket application in productionKeep your Wicket application in production
Keep your Wicket application in production
Martijn Dashorst
 
Php & Web Security - PHPXperts 2009
Php & Web Security - PHPXperts 2009Php & Web Security - PHPXperts 2009
Php & Web Security - PHPXperts 2009
mirahman
 

Similar to A better approach for testing microservices - introducing test kits in practice (20)

Testing micro services using testkits
Testing micro services using testkitsTesting micro services using testkits
Testing micro services using testkits
 
МИХАЙЛО БОДНАРЧУК «SuperCharged End to End Testing with CodeceptJS» QADay 2019
МИХАЙЛО БОДНАРЧУК «SuperCharged End to End Testing with CodeceptJS»  QADay 2019МИХАЙЛО БОДНАРЧУК «SuperCharged End to End Testing with CodeceptJS»  QADay 2019
МИХАЙЛО БОДНАРЧУК «SuperCharged End to End Testing with CodeceptJS» QADay 2019
 
Keep your Wicket application in production
Keep your Wicket application in productionKeep your Wicket application in production
Keep your Wicket application in production
 
1 aleksandr gritsevski - attd example using
1   aleksandr gritsevski - attd example using1   aleksandr gritsevski - attd example using
1 aleksandr gritsevski - attd example using
 
DevSecOps: Let's Write Security Unit Tests
DevSecOps: Let's Write Security Unit TestsDevSecOps: Let's Write Security Unit Tests
DevSecOps: Let's Write Security Unit Tests
 
Rhino Mocks
Rhino MocksRhino Mocks
Rhino Mocks
 
Workshop: Building Vaadin add-ons
Workshop: Building Vaadin add-onsWorkshop: Building Vaadin add-ons
Workshop: Building Vaadin add-ons
 
SessionTrackServlets.pptx
SessionTrackServlets.pptxSessionTrackServlets.pptx
SessionTrackServlets.pptx
 
Security Testing
Security TestingSecurity Testing
Security Testing
 
Test driven development (java script & mivascript)
Test driven development (java script & mivascript)Test driven development (java script & mivascript)
Test driven development (java script & mivascript)
 
Developer Joy - How great teams get s%*t done
Developer Joy - How great teams get s%*t doneDeveloper Joy - How great teams get s%*t done
Developer Joy - How great teams get s%*t done
 
Test-driven Development with Drupal and Codeception (DrupalCamp Brighton)
Test-driven Development with Drupal and Codeception (DrupalCamp Brighton)Test-driven Development with Drupal and Codeception (DrupalCamp Brighton)
Test-driven Development with Drupal and Codeception (DrupalCamp Brighton)
 
Secret unit testing tools
Secret unit testing toolsSecret unit testing tools
Secret unit testing tools
 
Tdd is not about testing (OOP)
Tdd is not about testing (OOP)Tdd is not about testing (OOP)
Tdd is not about testing (OOP)
 
Testing ASP.NET - Progressive.NET
Testing ASP.NET - Progressive.NETTesting ASP.NET - Progressive.NET
Testing ASP.NET - Progressive.NET
 
Azure from scratch part 4
Azure from scratch part 4Azure from scratch part 4
Azure from scratch part 4
 
Php & Web Security - PHPXperts 2009
Php & Web Security - PHPXperts 2009Php & Web Security - PHPXperts 2009
Php & Web Security - PHPXperts 2009
 
Continously delivering
Continously deliveringContinously delivering
Continously delivering
 
Practical Secure Coding Workshop - {DECIPHER} Hackathon
Practical Secure Coding Workshop - {DECIPHER} HackathonPractical Secure Coding Workshop - {DECIPHER} Hackathon
Practical Secure Coding Workshop - {DECIPHER} Hackathon
 
JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
JavaCro'14 - Building interactive web applications with Vaadin – Peter LehtoJavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
 

Recently uploaded

%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
masabamasaba
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
chiefasafspells
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
masabamasaba
 

Recently uploaded (20)

Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 

A better approach for testing microservices - introducing test kits in practice