SlideShare a Scribd company logo
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 (4 years)
▪ Building infrastructure services
▪ Over 10 years developing software
▪ TDD and clean code enthusiast
Lithuania
Vilnius
Kyiv
Dnipro
Wix Engineering Locations
Israel
Tel-Aviv
Be’er Sheva
Ukraine
The Integration with your service was
the easiest thing I’ve ever done
“
”
- said nobody
The Integration with your service was
the easiest thing I’ve ever done
“
”
- said nobody , NEVER
The Integration with your service was
the easiest thing I’ve ever done
“
”
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.
TEST
TEST
TEST
TEST
TEST
TEST
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
~500 microservices ~500 microservices
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).
Testing micro services using testkits
❏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
❏ A short and reliable
feedback loop
❏ To test assumptions vs.
reality (logic/protocol)
✘
✔
#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.
Shared
state Security
Non-happy
paths Maintain data
Neet it to be in
production
Flaky Complexity
#1
Run against an external
environment
OUR
MICRO
SERVICE
❏E2E
❏Integration
✔✘
✔✘
#2
Use test
doubles
STUB / MOCK / FAKE
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
HTTP
Real Service (Provider)
Logic 1
(core)
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Real Service (Provider) Test Double
STUB /
MOCK /
FAKE
Logic 1
(core)
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
A
P
I
@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
Assumptions vs. Reality
http://i.imgur.com/oSUaHS7.jpg
ConfirmationPage purchase(UUID userId,
List<Item> items) {
BigDecimal sum = calculatePrice(items);
boolean billedSuccessfully;
try{
billUser(userId);
billedSuccessfully = true;
}
catch (StolenCreditCardException ex) {
billedSuccessfully = false;
}
return renderConfirmationPage(
userId, sum, billedSuccessfully);
}
#2
Use test
doubles
Service
Interaction
ConfirmationPage purchase(UUID userId,
List<Item> items) {
BigDecimal sum = calculatePrice(items);
boolean billedSuccessfully;
try{
billUser(userId);
billedSuccessfully = true;
}
catch (StolenCreditCardException ex) {
billedSuccessfully = false;
usersClient.blockUser(userId);
}
return renderConfirmationPage(
userId, sum, billedSuccessfully);
}
#2
Use test
doubles
Service
Interaction
private ConfirmationPage renderConfirmationPage(
UUID userId,
BigDecimal sum,
boolean billedSuccessfully) {
String name = usersClient.getName(userId);
//render the page
}
#2
Use test
doubles
Service
Interaction
private ConfirmationPage renderConfirmationPage(
UUID userId,
BigDecimal sum,
boolean billedSuccessfully) {
String name = usersClient.getName(userId);
//render the page
}
#2
Use test
doubles
Service
Interaction
UserNotFoundException
#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 / MOCK /
FAKE
OUR
MICRO
SERVICE
HTTP
✘✔
OUR
MICRO
SERVICE
# 3 (1 + 2)
Record/Replay tests
Pre-recorded
MY APP
STORE
SESSION
(USER ID)
TEST
NAME IN THE
CONFIRMATION
PAGE
HTTP
#3
Record /
Replay
● Re-do for every change
● Recording is manual
● Random data in requests
(E2E)
● Continuous Integration
#3
Record /
Replay
CONSUMER
CONSUMER
CONSUMER
CONSUMER
CONSUMER
CONSUMER
...AND, ALL OUR CONSUMERS
WILL HAVE TO RECORD
SERVICE
PROVIDER
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
#4
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));
}
#4
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));
}
#4
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));
}
#4
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));
}
#4
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);
}
#4
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);
}
#4
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);
}
#4
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);
}
#4
Test kits
IT success
example
@Test(expected = UserNotFoundException.class)
public void getName_notFound() {
usersClient.getName(UUID.randomUUID());
}
#4
Test kits
IT failure
example
@Test(expected = UserNotFoundException.class)
public void getName_notFound() {
usersClient.getName(UUID.randomUUID());
}
#4
Test kits
IT failure
example
@Test(expected = UserNotFoundException.class)
public void getName_notFound() {
usersClient.getName(UUID.randomUUID());
}
#4
Test kits
IT failure
example
@Test(expected = UserNotFoundException.class)
public void getName_deactivated() {
UUID userId = UUID.randomUUID();
String name = someName();
User givenUser = new UsersTestBuilder()
.withId(userId)
.withName(name)
.isActive(false)
.build();
usersTestkit.givenUser(givenUser);
usersClient.getName(userId);
}
#4
Test kits
IT special
case
example
@Test(expected = UserNotFoundException.class)
public void getName_deactivated() {
UUID userId = UUID.randomUUID();
String name = someName();
User givenUser = new UsersTestBuilder()
.withId(userId)
.withName(name)
.isActive(false)
.build();
usersTestkit.givenUser(givenUser);
usersClient.getName(userId);
}
#4
Test kits
IT special
case
example
@Test(expected = UserNotFoundException.class)
public void getName_deactivated() {
UUID userId = UUID.randomUUID();
String name = someName();
User givenUser = new UsersTestBuilder()
.withId(userId)
.withName(name)
.isActive(false)
.build();
usersTestkit.givenUser(givenUser);
usersClient.getName(userId);
}
#4
Test kits
IT special
case
example
@Test(expected = UserNotFoundException.class)
public void getName_deactivated() {
UUID userId = UUID.randomUUID();
String name = someName();
User givenUser = new UsersTestBuilder()
.withId(userId)
.withName(name)
.isActive(false)
.build();
usersTestkit.givenUser(givenUser);
usersClient.getName(userId);
}
#4
Test kits
IT special
case
example
@Test
public void getName_deactivated_backoffice() {
UUID userId = UUID.randomUUID();
String name = someName();
User givenUser = new UsersTestBuilder()
.withId(userId)
.withName(name)
.isActive(false)
.build();
usersTestkit.givenUser(givenUser);
String result =
usersBackofficeClient.getName(userId);
assertEquals(name, result);
}
#4
Test kits
IT special
case
example
How to build a testkit?
OUR
MICRO
SERVICE
Test
doubles
Real
thing
Test kits
Logic 1
(core)
Real Service
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Logic 1
(core)
Real Service
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Testkit
Logic 1
(core)
Real Service
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
A
P
I
Testkit
Logic 1
(core)
Real Service
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
A
P
I
Validation
Testkit
Logic 1
(core)
Real Service
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Logic 1
(core)
A
P
I
Validation
Testkit
Logic 1
(core)
Real Service
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Logic 1
(core)
In Memory DAO
A
P
I
Validation
Testkit
Logic 1
(core)
Real Service
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Logic 1
(core)
In Memory DAO
A
P
I
ValidationTime
Testkit
Logic 1
(core)
Real Service
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Logic 1
(core)
In Memory DAO
A
P
I
ValidationTime
Wiring/
Composition
Testkit
Logic 1
(core)
Real Service
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Logic 1
(core)
In Memory DAO
A
P
I
ValidationTime
Wiring/
Composition
Testkit
Helpers
testkit.jarservice.jar
Logic 1
(core)
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Logic 1
(core)
In Memory DAO
A
P
I
ValidationTime
Wiring/
Composition
Helpers
testkit.jarservice.jar
Logic 1
(core)
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Logic 1
(core)
In Memory DAO
A
P
I
ValidationTime
Wiring/
Composition
Helpers
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?
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
Hexagonal Architecture
Domain
Hexagonal Architecture
Domain
Hexagonal Architecture
Domain
USERS
SERVER
INTEGRATION
CONTRACT TEST
USERS
TESTKIT
MY APP
STORE
SESSION
(USER ID)
NAME IN THE
CONFIRMATION
PAGE
TEST
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
Logic 1
(core)
Real Service
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Testkit
Logic 1
(core)
In Memory DAO
A
P
I
ValidationTime
Wiring/
Composition
Helpers
Logic 1
(core)
Real Service
DAO
A
P
I
Validation
Logic 2
(internal)
Time
(real)
Wiring/
Composition
Logic 1
(core)
In Memory DAO
A
P
I
ValidationTime
Wiring/
Composition
TK
Logic
Testkit
Helpers
Disadvantages
➜ More development
➜ Build dependency (on
implementation)
#4
Test kits OUR
MICRO
SERVICE
#4
Test kits
OUR
MICRO
SERVICE
❏E2E
❏Integration
✔
✔
Summary
# 0 - Not Testing
Summary
# 0 - Not Testing
# 1 - External environment
Summary
# 0 - Not Testing
# 1 - External environment
# 2 - Test Doubles
Summary
# 0 - Not Testing
# 1 - External environment
# 2 - Test Doubles
# 3 - Record / Replay
Summary
# 0 - Not Testing
# 1 - External environment
# 2 - Test Doubles
# 3 - Record / Replay
# 4 - Test Kits
Summary
# 0 - Not Testing
# 1 - External environment
# 2 - Test Doubles
# 3 - Record / Replay
# 4 - Test Kits
API Complexity
number of
consumers
Test
Doubles
Testkits
Testing micro services using testkits
Thank You
https://github.com/maximn@maximnovakmaximn@wix.com

More Related Content

PDF
GWT Reloaded
PDF
Von JavaEE auf Microservice in 6 Monaten - The Good, the Bad, and the wtfs...
PDF
From Developer to Production, Promoting your Webservices
PDF
Aleksey Bogachuk - "Offline Second"
PDF
Hybrid Apps (Native + Web) via QtWebKit
PDF
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
PPTX
Prisoner's Dilemma and Service-oriented Architectures
PDF
Spring Up Your Graph
GWT Reloaded
Von JavaEE auf Microservice in 6 Monaten - The Good, the Bad, and the wtfs...
From Developer to Production, Promoting your Webservices
Aleksey Bogachuk - "Offline Second"
Hybrid Apps (Native + Web) via QtWebKit
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
Prisoner's Dilemma and Service-oriented Architectures
Spring Up Your Graph

What's hot (9)

PDF
Java REST API Framework Comparison - PWX 2021
PPTX
JavaFX / JacpFX interaction with JSR356 WebSockets
PDF
Whatever it takes - Fixing SQLIA and XSS in the process
PDF
JavaOne India 2011 - Running your Java EE 6 Apps in the Cloud
PDF
Microservices for the Masses with Spring Boot, JHipster, and OAuth - Utah JUG...
PPT
Keyword Driven Testing
PDF
How to Win at UI Development in the World of Microservices - THAT Conference ...
PDF
Apache Roller, Acegi Security and Single Sign-on
PDF
Test-Driven Development in React with Cypress
Java REST API Framework Comparison - PWX 2021
JavaFX / JacpFX interaction with JSR356 WebSockets
Whatever it takes - Fixing SQLIA and XSS in the process
JavaOne India 2011 - Running your Java EE 6 Apps in the Cloud
Microservices for the Masses with Spring Boot, JHipster, and OAuth - Utah JUG...
Keyword Driven Testing
How to Win at UI Development in the World of Microservices - THAT Conference ...
Apache Roller, Acegi Security and Single Sign-on
Test-Driven Development in React with Cypress
Ad

Similar to Testing micro services using testkits (20)

PPTX
A better approach for testing microservices - introducing test kits in practice
PDF
DevOps in Practice: When does "Practice" Become "Doing"?
PDF
Testing Applications—For the Cloud and in the Cloud
PPTX
Evaluating Test Driven Development And Parameterized Unit Testing In Dot Net ...
PDF
Level Up Your Integration Testing With Testcontainers
PDF
谷歌 Scott-lessons learned in testability
PDF
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
PPTX
Testing ASP.NET - Progressive.NET
PPTX
Altitude San Francisco 2018: Testing with Fastly Workshop
PDF
Using Puppet - Real World Configuration Management
PDF
JEE on DC/OS - MesosCon Europe
PDF
JEE on DC/OS
PDF
Service Virtualization: What Testers Need to Know
PDF
How EVERFI Moved from No Automation to Continuous Test Generation in 9 Months
KEY
Testing w-mocks
PDF
From Monoliths to Microservices at Realestate.com.au
PDF
Testing for fun in production Into The Box 2018
PPTX
JavaLand - Integration Testing How-to
PPTX
201502 - Integration Testing
PDF
Testing Microservices @DevoxxBE 23.pdf
A better approach for testing microservices - introducing test kits in practice
DevOps in Practice: When does "Practice" Become "Doing"?
Testing Applications—For the Cloud and in the Cloud
Evaluating Test Driven Development And Parameterized Unit Testing In Dot Net ...
Level Up Your Integration Testing With Testcontainers
谷歌 Scott-lessons learned in testability
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing ASP.NET - Progressive.NET
Altitude San Francisco 2018: Testing with Fastly Workshop
Using Puppet - Real World Configuration Management
JEE on DC/OS - MesosCon Europe
JEE on DC/OS
Service Virtualization: What Testers Need to Know
How EVERFI Moved from No Automation to Continuous Test Generation in 9 Months
Testing w-mocks
From Monoliths to Microservices at Realestate.com.au
Testing for fun in production Into The Box 2018
JavaLand - Integration Testing How-to
201502 - Integration Testing
Testing Microservices @DevoxxBE 23.pdf
Ad

Recently uploaded (20)

PDF
Nekopoi APK 2025 free lastest update
PDF
Autodesk AutoCAD Crack Free Download 2025
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
iTop VPN 6.5.0 Crack + License Key 2025 (Premium Version)
PPTX
Advanced SystemCare Ultimate Crack + Portable (2025)
PDF
Cost to Outsource Software Development in 2025
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PPTX
assetexplorer- product-overview - presentation
PDF
AutoCAD Professional Crack 2025 With License Key
PDF
17 Powerful Integrations Your Next-Gen MLM Software Needs
PDF
iTop VPN Free 5.6.0.5262 Crack latest version 2025
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PPTX
Computer Software and OS of computer science of grade 11.pptx
PPTX
history of c programming in notes for students .pptx
DOCX
Greta — No-Code AI for Building Full-Stack Web & Mobile Apps
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PPTX
Patient Appointment Booking in Odoo with online payment
Nekopoi APK 2025 free lastest update
Autodesk AutoCAD Crack Free Download 2025
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Odoo Companies in India – Driving Business Transformation.pdf
iTop VPN 6.5.0 Crack + License Key 2025 (Premium Version)
Advanced SystemCare Ultimate Crack + Portable (2025)
Cost to Outsource Software Development in 2025
Design an Analysis of Algorithms I-SECS-1021-03
Navsoft: AI-Powered Business Solutions & Custom Software Development
Design an Analysis of Algorithms II-SECS-1021-03
assetexplorer- product-overview - presentation
AutoCAD Professional Crack 2025 With License Key
17 Powerful Integrations Your Next-Gen MLM Software Needs
iTop VPN Free 5.6.0.5262 Crack latest version 2025
wealthsignaloriginal-com-DS-text-... (1).pdf
Computer Software and OS of computer science of grade 11.pptx
history of c programming in notes for students .pptx
Greta — No-Code AI for Building Full-Stack Web & Mobile Apps
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Patient Appointment Booking in Odoo with online payment

Testing micro services using testkits