SlideShare uma empresa Scribd logo
1 de 280
@mogronalol
API Simulation Patterns for
Better Testing
1
Andrew Morgan
@mogronalol
Spectolabs
@mogronalol 2
About Me
Andrew Morgan
@mogronalol
@mogronalol 2
About Me
• Independent Consultant
Andrew Morgan
@mogronalol
@mogronalol 2
About Me
• Independent Consultant
• Microservices / Cloud /
Continuous Delivery
Andrew Morgan
@mogronalol
@mogronalol 2
About Me
• Independent Consultant
• Microservices / Cloud /
Continuous Delivery
• InfoQ Editor
Andrew Morgan
@mogronalol
@mogronalol 4
Agenda
@mogronalol 4
Agenda
• The problems with testing API driven architectures
@mogronalol 4
Agenda
• The problems with testing API driven architectures
• Introduction to API simulation
@mogronalol 4
Agenda
• The problems with testing API driven architectures
• Introduction to API simulation
• Applying API simulation patterns
@mogronalol 4
Agenda
• The problems with testing API driven architectures
• Introduction to API simulation
• Applying API simulation patterns
• Data management
@mogronalol 4
Agenda
• The problems with testing API driven architectures
• Introduction to API simulation
• Applying API simulation patterns
• Data management
• Conclusion
@mogronalol 5
Agenda
• The problems with testing API driven architectures
• Introduction to API simulation
• Applying API simulation patterns
• Data management
• Conclusion
@mogronalol
API-Driven Architecture
6
@mogronalol
API-Driven Architecture
6
Application
@mogronalol
API-Driven Architecture
6
Application
Payment
Provider
API Call
@mogronalol
API-Driven Architecture
6
Application
Payment
Provider
Social
Network
API Call API Call
@mogronalol
Microservices
7
@mogronalol
Microservices
7
Flights
@mogronalol
Microservices
7
Flights
Auth
@mogronalol
Microservices
7
Booking
Flights
Auth
@mogronalol
Microservices
7
Payment
Booking
Flights
Auth
@mogronalol
Microservices
7
Payment
Company
Booking
Flights
Auth
@mogronalol
Microservices
7
Payment
Company
Booking
Flights
Auth
@mogronalol
A natural evolution...
8
@mogronalol
Challenges…
9
@mogronalol 10
Airline Booking Application
@mogronalol 10
Airline Booking Application
• Microservice architecture
@mogronalol 10
Airline Booking Application
• Microservice architecture
• Integration with third party services
@mogronalol 10
Airline Booking Application
• Microservice architecture
• Integration with third party services
• Integration with legacy internal services
@mogronalol 10
Airline Booking Application
• Microservice architecture
• Integration with third party services
• Integration with legacy internal services
• Heavy resource consumption
@mogronalol 10
Airline Booking Application
• Microservice architecture
• Integration with third party services
• Integration with legacy internal services
• Heavy resource consumption
• A standard CI/CD pipeline
@mogronalol 11
Resources
@mogronalol 11
Resources
Booking
@mogronalol 11
Resources
Booking
Flights
@mogronalol 11
Resources
Booking
Flights
Rewards
@mogronalol 11
Resources
Booking
Flights
Rewards
Payments
@mogronalol 11
Resources
Booking
Flights
Rewards
Payments
Fraud
@mogronalol 11
Resources
Booking
Flights
Rewards
Payments
Fraud
@mogronalol 11
Resources
Booking
Flights
Rewards
Payments
Fraud
@mogronalol 11
Resources
Booking
Flights
Rewards
Payments
Fraud
@mogronalol 11
Resources
Booking
Flights
Rewards
Payments
Fraud
Cost
@mogronalol 12
@mogronalol 13
Licensing
@mogronalol 13
Licensing
Consumer
@mogronalol 13
Licensing
Consumer
Producer
@mogronalol 13
Licensing
Consumer
Producer
Third party
@mogronalol 13
Licensing
Consumer
Producer
Consumer
Third party
@mogronalol 13
Licensing
Consumer
Producer
Consumer
Producer
Third party
@mogronalol 13
Licensing
Consumer
Producer
Consumer
Producer
Third party Cost
@mogronalol 14
Rate Limiting
@mogronalol
Consumer
14
Rate Limiting
@mogronalol
Consumer
14
Rate Limiting
Producer
@mogronalol
Consumer
14
Rate Limiting
Producer
@mogronalol
Consumer
14
Rate Limiting
Producer
Consumer
Rate Limited
Producer
@mogronalol 15
Flakey Dependencies
@mogronalol 15
Flakey Dependencies
Consumer
@mogronalol 15
Flakey Dependencies
Consumer
Producer
@mogronalol 15
Flakey Dependencies
Consumer
Producer
@mogronalol 15
Flakey Dependencies
Consumer
Producer
Consumer
Producer
@mogronalol 16
Doesn't exist
@mogronalol 16
Doesn't exist
Consumer
?
@mogronalol 17
Non Deterministic
@mogronalol 17
Non Deterministic
Consumer
Booking
Service
@mogronalol 17
Non Deterministic
Consumer
Booking
Service {
“date” : “2013-01-08”,
…
}
@mogronalol 17
Non Deterministic
assertThat(booking.getDate())
.isEqualTo(LocalDate.of(2013,1,8));
Consumer
Booking
Service {
“date” : “2013-01-08”,
…
}
@mogronalol 17
Non Deterministic
assertThat(booking.getDate())
.isEqualTo(LocalDate.of(2013,1,8));
Consumer
Booking
Service {
“date” : “2013-01-08”,
…
}
@mogronalol 17
Non Deterministic
assertThat(booking.getDate())
.isEqualTo(LocalDate.of(2013,1,8));
Consumer
Booking
Service {
“date” : “2016-02-07”,
…
}
@mogronalol 18
Fault Injection
@mogronalol 18
Fault Injection
Consumer
Producer
@mogronalol 18
Fault Injection
Consumer
Producer
Consumer
Producer
@mogronalol 18
Fault Injection
Consumer
Producer
Consumer
Producer
4xx, 5xx, timeouts
@mogronalol 18
Fault Injection
Consumer
Producer
Consumer
Producer
4xx, 5xx, timeouts
Operationally
challenging to trigger
faults
@mogronalol 19
Agenda
• The problems with testing API driven architectures
• Introduction to API simulation
• Applying API simulation patterns
• Data management
• Conclusion
@mogronalol 20
API Simulation
@mogronalol 20
API Simulation
• Emulation of real API
@mogronalol 20
API Simulation
• Emulation of real API
• Non-intrusive
@mogronalol 20
API Simulation
• Emulation of real API
• Non-intrusive
• Lightweight - or should be
@mogronalol 21
Open Source Tooling
@mogronalol 21
Open Source Tooling
@mogronalol 21
Open Source Tooling
@mogronalol 21
Open Source Tooling
@mogronalol 22
Architecture
@mogronalol 22
Architecture
Consumer
@mogronalol 22
Architecture
Consumer Producer
@mogronalol 22
Architecture
Consumer Producer
@mogronalol
Capture Mode
Intercept and store
requests & responses
22
Architecture
Consumer Producer
@mogronalol
Simulate Mode
22
Architecture
Consumer
Replay recorded
requests & responses
@mogronalol 23
Creating Data
@mogronalol 24
Creating Data
@mogronalol 25
Forward Proxy
@mogronalol 25
Forward Proxy
Consumer
@mogronalol 25
Forward Proxy
Consumer Producer
@mogronalol 25
Forward Proxy
Consumer Producer
Proxy Setting
@mogronalol 26
Reverse Proxy
@mogronalol 26
Reverse Proxy
Consumer
@mogronalol 26
Reverse Proxy
Consumer Producer
@mogronalol 26
Reverse Proxy
Consumer Producer
Points to Hoverfly
@mogronalol 26
Reverse Proxy
Consumer Producer
Reverse Proxy SettingPoints to Hoverfly
@mogronalol 27
Not Mocking
Service Under Test
Dependant Service
Http
@mogronalol 27
Not Mocking
Service Under Test
Mocking
Dependant Service
Http
@mogronalol 27
Not Mocking
Service Under Test
Mocking
@mogronalol 27
Not Mocking
Service Under Test
Virtual Service
@mogronalol 27
Not Mocking
Service Under Test
Virtual Service
Mocks bleed into the
architectural boundary of
your application
@mogronalol 28
Agenda
• The problems with testing API driven architectures
• Introduction to API simulation
• Applying API simulation patterns
• Data management
• Conclusion
@mogronalol 29
Record and replay
@mogronalol 29
Record and replay
Consumer
@mogronalol 29
Record and replay
Consumer
External
Producer
@mogronalol 29
Record and replay
Consumer
External
Producer
Intercept
@mogronalol 29
Record and replay
Consumer
External
Producer
Intercept
@mogronalol 29
Record and replay
Consumer
Simulate
@mogronalol 30
JUnit Example
@mogronalol 30
JUnit Example
@Test

public void shouldBeAbleToRetrieveABooking() throws URISyntaxException {

// Given

final int bookingId = 1;



// When

final Booking booking = bookingServiceGateway.getBooking(bookingId);



// Then

assertThat(booking.getCustomer()).isEqualTo(“Andrew Morgan”);
assertThat(booking.getDate()).isEqualTo(LocalDate.of(2016,3,1));

}
@mogronalol 30
JUnit Example
@Rule
public HoverflyRule hoverflyRule = HoverflyRule.inCaptureMode(“src/test/
resources/external.json”);
@Test

public void shouldBeAbleToRetrieveABooking() throws URISyntaxException {

// Given

final int bookingId = 1;



// When

final Booking booking = bookingServiceGateway.getBooking(bookingId);



// Then

assertThat(booking.getCustomer()).isEqualTo(“Andrew Morgan”);
assertThat(booking.getDate()).isEqualTo(LocalDate.of(2016,3,1));

}
@mogronalol 31
JUnit Example
{

"data": [

{

"request": {

"path": "/api/bookings/1",

"method": "GET",

"destination": "www.my-test.com",

"query": null,

"body": ""

},

"response": {

"status": 200,

"body": “{”customer”:”Andrew Morgan", ”date”:
”2016-03-01”}}}”,

"headers": {

"Content-Type": [

"application/json"

]

}

}

}

]

}
@mogronalol 32
JUnit Example
@Test

public void shouldBeAbleToRetrieveABooking() throws URISyntaxException {

// Given

final int bookingId = 1;



// When

final Booking booking = bookingServiceGateway.getBooking(bookingId);



// Then

assertThat(booking.getCustomer()).isEqualTo(“Andrew Morgan”);
assertThat(booking.getDate()).isEqualTo(LocalDate.of(2016,3,1));

}
@Rule
public HoverflyRule hoverflyRule =
HoverflyRule.inSimulationMode(classpath(“external.json”));
@mogronalol 33
Advantages
@mogronalol 33
Advantages
• Isolation
@mogronalol 33
Advantages
• Isolation
• Flaky dependencies
@mogronalol 33
Advantages
• Isolation
• Flaky dependencies
• Rate limiting
@mogronalol 33
Advantages
• Isolation
• Flaky dependencies
• Rate limiting
• Deterministic
@mogronalol 33
Advantages
• Isolation
• Flaky dependencies
• Rate limiting
• Deterministic
• Licensing
@mogronalol 34
Operations
@mogronalol 34
Operations
Consumer
External
Producer
@mogronalol 34
Operations
Consumer
External
Producer
Internal
Producer
Internal
Producer
Internal
Producer
@mogronalol 34
Operations
Consumer
Virtual
Service
Virtual
Service
Virtual
Service
Virtual
Service
@mogronalol 35
CLI Example
@mogronalol 35
CLI Example
$ hoverctl start —proxy-port 8080
@mogronalol 35
CLI Example
$ hoverctl start —proxy-port 8080
$ hoverctl import accounts-service-simulation.json
@mogronalol 35
CLI Example
$ hoverctl start —proxy-port 8080
$ hoverctl import accounts-service-simulation.json
$ hoverctl start —proxy-port 8081
@mogronalol 35
CLI Example
$ hoverctl start —proxy-port 8080
$ hoverctl import accounts-service-simulation.json
$ hoverctl start —proxy-port 8081
$ hoverctl import payments-service-simulation.json
@mogronalol 35
CLI Example
$ hoverctl start —proxy-port 8080
$ hoverctl import accounts-service-simulation.json
$ hoverctl start —proxy-port 8081
$ hoverctl import payments-service-simulation.json
$ curl http://www.account-service.com/api/v1/accounts/1 —proxy http://
localhost:8080
[{"name":"foo"}]
@mogronalol 35
CLI Example
$ hoverctl start —proxy-port 8080
$ hoverctl import accounts-service-simulation.json
$ hoverctl start —proxy-port 8081
$ hoverctl import payments-service-simulation.json
$ curl http://www.account-service.com/api/v1/accounts/1 —proxy http://
localhost:8080
[{"name":"foo"}]
$ curl http://www.payment-service.com/api/v1/payments/1 -proxy http://
localhost:8081
[{“amount":"£23.27"}]
@mogronalol 36
@mogronalol 37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol
Matchers
Method Destination Path Query
GET www.foo.com /miss ?token=foo
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
37
Matching
@mogronalol 38
Why Looser Matching?
@mogronalol
Matcher
Method Destination Path Query
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
38
Why Looser Matching?
@mogronalol
Matcher
Method Destination Path Query
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
38
Why Looser Matching?
@mogronalol
Matcher
Method Destination Path Query
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
38
Why Looser Matching?
?token=miss
@mogronalol
Matcher
Method Destination Path Query
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=foo
38
Why Looser Matching?
???
@mogronalol 39
Field Omission
@mogronalol 39
Field Omission
Matcher
Method Destination Path Query
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=bar
@mogronalol 39
Field Omission
Matcher
Method Destination Path Query
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=bar
@mogronalol 39
Field Omission
Matcher
Method Destination Path Query
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=bar
@mogronalol 39
Field Omission
Matcher
Method Destination Path Query
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=bar
@mogronalol 39
Field Omission
Matcher
Method Destination Path Query
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=bar
@mogronalol 39
Field Omission
Matcher
Method Destination Path Query
GET www.foo.com /login ?token=foo
Request
GET www.foo.com /login ?token=bar
@mogronalol 40
Regex Matching
@mogronalol 40
Regex Matching
Matcher
Method Destination Path
GET www.foo.com /name/john
Request
GET www.foo.com /name/tim
@mogronalol 40
Regex Matching
Matcher
Method Destination Path
GET www.foo.com /name/john
Request
GET www.foo.com /name/tim
@mogronalol 40
Regex Matching
Matcher
Method Destination Path
GET www.foo.com /name/john
Request
GET www.foo.com /name/tim
@mogronalol 40
Regex Matching
Matcher
Method Destination Path
GET www.foo.com /name/john
Request
GET www.foo.com /name/tim
@mogronalol 40
Regex Matching
Matcher
Method Destination Path
GET www.foo.com /name/john
Request
GET www.foo.com /name/tim
name/(.*)
Path Regex
@mogronalol 41
JSON Matching
@mogronalol 41
JSON Matching
Matcher
Body
{“foo” : “bar”}
Request
{“foo” : “bar”}
@mogronalol 41
JSON Matching
Matcher
Body
{“foo” : “bar”}
Request
{“foo” : “bar”}
@mogronalol 41
JSON Matching
Matcher
Body
{“foo” : “bar”}
Request
{“foo” : “bar”}
Body JSON
@mogronalol 42
JSON Matching
@mogronalol
Matcher
Body JSON
{“foo” : “bar”, “not” : “important”}
Request
{“foo” : “bar”}
42
JSON Matching
@mogronalol
Matcher
Body JSON
{“foo” : “bar”, “not” : “important”}
Request
{“foo” : “bar”}
42
JSON Matching
@mogronalol
Matcher
Body JSON
{“foo” : “bar”, “not” : “important”}
Request
{“foo” : “bar”}
Body JSON
loose=true
42
JSON Matching
@mogronalol 43
Additional Matchers
@mogronalol 43
Additional Matchers
• XML (Strict and Loose)
@mogronalol 43
Additional Matchers
• XML (Strict and Loose)
• JSONPath / XPath
@mogronalol 43
Additional Matchers
• XML (Strict and Loose)
• JSONPath / XPath
• …Anything
@mogronalol 44
Scoring
@mogronalol
Request
GET www.foo.com /name/tim ?token=bar
Matchers Match?
GET www.foo.com
GET www.foo.com /name/tim
GET www.foo.com /name/tim ?token=bar
44
Scoring
@mogronalol
Request
GET www.foo.com /name/tim ?token=bar
Matchers Match?
GET www.foo.com
GET www.foo.com /name/tim
GET www.foo.com /name/tim ?token=bar
44
Scoring
@mogronalol
Request
GET www.foo.com /name/tim ?token=bar
Matchers Match?
GET www.foo.com
GET www.foo.com /name/tim
GET www.foo.com /name/tim ?token=bar
44
Scoring
Score
@mogronalol
Request
GET www.foo.com /name/tim ?token=bar
Matchers Match?
GET www.foo.com
GET www.foo.com /name/tim
GET www.foo.com /name/tim ?token=bar
44
Scoring
Score
2
@mogronalol
Request
GET www.foo.com /name/tim ?token=bar
Matchers Match?
GET www.foo.com
GET www.foo.com /name/tim
GET www.foo.com /name/tim ?token=bar
44
Scoring
Score
2
3
@mogronalol
Request
GET www.foo.com /name/tim ?token=bar
Matchers Match?
GET www.foo.com
GET www.foo.com /name/tim
GET www.foo.com /name/tim ?token=bar
44
Scoring
Score
2
3
4
@mogronalol
Request
GET www.foo.com /name/tim ?token=bar
Matchers Match?
GET www.foo.com
GET www.foo.com /name/tim
GET www.foo.com /name/tim ?token=bar
44
Scoring
Score
2
3
4
@mogronalol 45
Debugging
@mogronalol
Request
GET www.foo.com /name/tim ?token=bar
Matchers Score Match?
MISS www.foo.com miss 1
MISS www.foo.com /name/tim 2
GET www.foo.com /name/tim miss 3
45
Debugging
@mogronalol
Request
GET www.foo.com /name/tim ?token=bar
Matchers Score Match?
MISS www.foo.com miss 1
MISS www.foo.com /name/tim 2
GET www.foo.com /name/tim miss 3
45
Debugging
@mogronalol
Request
GET www.foo.com /name/tim ?token=bar
Matchers Score Match?
MISS www.foo.com miss 1
MISS www.foo.com /name/tim 2
GET www.foo.com /name/tim miss 3
45
Debugging
Closest?
@mogronalol
Request
GET www.foo.com /name/tim ?token=bar
Matchers Score Match?
MISS www.foo.com miss 1
MISS www.foo.com /name/tim 2
GET www.foo.com /name/tim miss 3
45
Debugging
Closest?
@mogronalol 46
Templating
@mogronalol 46
Templating
@mogronalol
Path Matcher Response Body
46
Templating
@mogronalol
Path Matcher Response Body
/name/(.*) {“name”:”john”}
46
Templating
@mogronalol
Path Matcher Response Body
/name/(.*) {“name”:”john”}
Request Path Response Body
46
Templating
@mogronalol
Path Matcher Response Body
/name/(.*) {“name”:”john”}
Request Path Response Body
/name/john {“name”:”john”}
46
Templating
@mogronalol
Path Matcher Response Body
/name/(.*) {“name”:”john”}
Request Path Response Body
/name/john {“name”:”john”}
/name/peter {“name”:”john”}
46
Templating
@mogronalol
Path Matcher Response Body
/name/(.*) {“name”:”john”}
Request Path Response Body
/name/john {“name”:”john”}
/name/peter {“name”:”john”}
46
Templating
{“name”:”{{ Request.Path.[1] }}”}
@mogronalol
Path Matcher Response Body
/name/(.*) {“name”:”john”}
Request Path Response Body
/name/john {“name”:”john”}
/name/peter {“name”:”john”}
46
Templating
{“name”:”{{ Request.Path.[1] }}”}
{“name”:”peter”}
@mogronalol 47
Richer Templating
@mogronalol 47
Richer Templating
@mogronalol
Type Example URL Output
47
Richer Templating
@mogronalol
Type Example URL Output
Scheme {{ Request.Scheme }} http://www.foo.com http
47
Richer Templating
@mogronalol
Type Example URL Output
Scheme {{ Request.Scheme }} http://www.foo.com http
Query
Param
{{ Request.QueryParam.param }} http://www.foo.com?param=bar bar
47
Richer Templating
@mogronalol
Type Example URL Output
Scheme {{ Request.Scheme }} http://www.foo.com http
Query
Param
{{ Request.QueryParam.param }} http://www.foo.com?param=bar bar
Path
Param
{{ Request.Path.[1] }} http://www.foo.com/foo/ham ham
47
Richer Templating
@mogronalol 48
The Problem of State
@mogronalol 48
The Problem of State
@mogronalol
Request Response
48
The Problem of State
@mogronalol
Request Response
GET
www.shopping.com/
basket
{}
48
The Problem of State
@mogronalol
Request Response
GET
www.shopping.com/
basket
{}
POST
www.shopping.com/
basket
{“item”:”eggs”} 200
48
The Problem of State
@mogronalol
Request Response
GET
www.shopping.com/
basket
{}
POST
www.shopping.com/
basket
{“item”:”eggs”} 200
GET
www.shopping.com/
basket
{}
48
The Problem of State
@mogronalol 49
State
@mogronalol 49
State
@mogronalol
Request Response
Requires
State
Transitions
State
49
State
@mogronalol
Request Response
Requires
State
Transitions
State
GET
www.shopping.com/
basket
{}
basket ==
empty
49
State
@mogronalol
Request Response
Requires
State
Transitions
State
GET
www.shopping.com/
basket
{}
basket ==
empty
POST
www.shopping.com/
basket
{“item”:”eggs
”}
200
basket =
eggs
49
State
@mogronalol
Request Response
Requires
State
Transitions
State
GET
www.shopping.com/
basket
{}
basket ==
empty
POST
www.shopping.com/
basket
{“item”:”eggs
”}
200
basket =
eggs
GET
www.shopping.com/
basket
{“item”:”eggs
”}
basket ==
eggs
49
State
@mogronalol 50
SSL Bump
@mogronalol
Consumer
50
SSL Bump
Producer
@mogronalol
Consumer
50
SSL Bump
SSL
Producer
@mogronalol
Consumer
50
SSL Bump
Needs to Decrypt
& Impersonate
SSL
Producer
@mogronalol
Consumer
50
SSL Bump
Needs to Decrypt
& Impersonate
SSL
Producer
SSL Again
@mogronalol
Consumer
50
SSL Bump
Needs to Decrypt
& Impersonate
SSL
Producer
SSL Again
Generate Fake Self Signed
Certificate
@mogronalol
Consumer
50
SSL Bump
SSL
Producer
SSL Again
MITM Attack
Generate Fake Self Signed
Certificate
@mogronalol 51
Fault Injection
@mogronalol 51
Fault Injection
Consumer
External
Producer
@mogronalol 51
Fault Injection
Consumer
External
Producer
Middleware
@mogronalol 52
Fault Injection
@mogronalol 53
Agenda
• The problems with testing API driven architectures
• Introduction to API simulation
• Applying API simulation patterns
• Data management
• Conclusion
@mogronalol 54
Stale Data
@mogronalol 54
Stale Data
Consumer Virtual
Service
@mogronalol 54
Stale Data
ConsumerConsumer Virtual
Service
@mogronalol 54
Stale Data
ConsumerConsumerConsumer Real Service
@mogronalol 55
Ownership
@mogronalol 55
Ownership
Own Consumer Own Producer Strategy
@mogronalol 55
Ownership
Own Consumer Own Producer Strategy
Integration
Contract Testing
@mogronalol 56
Integration Contract Testing
http://martinfowler.com/bliki/IntegrationContractTest.html
@mogronalol 56
Integration Contract Testing
Scheduled
Build
http://martinfowler.com/bliki/IntegrationContractTest.html
@mogronalol 56
Integration Contract Testing
Scheduled
Build
Reproduce
Simulations
http://martinfowler.com/bliki/IntegrationContractTest.html
@mogronalol 56
Integration Contract Testing
Scheduled
Build
Reproduce
Simulations
Diff
http://martinfowler.com/bliki/IntegrationContractTest.html
@mogronalol 56
Integration Contract Testing
Scheduled
Build
Reproduce
Simulations
Diff
Integration Testing
or
Contract Diff
http://martinfowler.com/bliki/IntegrationContractTest.html
@mogronalol 56
Integration Contract Testing
Scheduled
Build
Reproduce
Simulations
Diff
No diff?
Integration Testing
or
Contract Diff
http://martinfowler.com/bliki/IntegrationContractTest.html
@mogronalol 56
Integration Contract Testing
Scheduled
Build
Reproduce
Simulations
Diff
No diff?
Diff?
Integration Testing
or
Contract Diff
http://martinfowler.com/bliki/IntegrationContractTest.html
@mogronalol 57
Ownership
Own Consumer Own Producer Strategy
Integration
Contract Testing
@mogronalol 57
Ownership
Own Consumer Own Producer Strategy
Integration
Contract Testing
Simulation as
First Class Citizen
@mogronalol 58
First Class Simulations
@mogronalol 58
First Class Simulations
Run and
Capture
Service Tests
@mogronalol 58
First Class Simulations
Run and
Capture
Service Tests
Transform to
simulation
@mogronalol 58
First Class Simulations
Run and
Capture
Service Tests
Transform to
simulation
Publish
Virtual
Service
@mogronalol 58
First Class Simulations
Run and
Capture
Service Tests
Parse
Contract
Transform to
simulation
Publish
Virtual
Service
@mogronalol 58
First Class Simulations
Run and
Capture
Service Tests
Parse
Contract
Transform to
simulation
Parse
Documentati
on
Publish
Virtual
Service
@mogronalol 59
Ownership
Own Consumer Own Producer Strategy
Integration
Contract Testing
Virtual Service as
First Class Citizen
@mogronalol 59
Ownership
Own Consumer Own Producer Strategy
Integration
Contract Testing
Consumer Driven
Contract Testing
Virtual Service as
First Class Citizen
@mogronalol 60
Consumer Driven Contracts
http://www.martinfowler.com/articles/consumerDrivenContracts.html
@mogronalol 60
Consumer Driven Contracts
Consumer
Defines
Contract
http://www.martinfowler.com/articles/consumerDrivenContracts.html
@mogronalol 60
Consumer Driven Contracts
Consumer
Defines
Contract
http://www.martinfowler.com/articles/consumerDrivenContracts.html
Generate
Producer
Stubs
@mogronalol 60
Consumer Driven Contracts
Consumer
Defines
Contract
http://www.martinfowler.com/articles/consumerDrivenContracts.html
Generate
Producer
Stubs
Implement
Consumer
@mogronalol 60
Consumer Driven Contracts
Consumer
Defines
Contract
http://www.martinfowler.com/articles/consumerDrivenContracts.html
Generate
Producer
Stubs
Implement
Consumer
@mogronalol 60
Consumer Driven Contracts
Consumer
Defines
Contract
http://www.martinfowler.com/articles/consumerDrivenContracts.html
Generate
Producer
Stubs
Generate
Producer
Contract
Tests
Implement
Consumer
@mogronalol 60
Consumer Driven Contracts
Consumer
Defines
Contract
Implement
Producer
http://www.martinfowler.com/articles/consumerDrivenContracts.html
Generate
Producer
Stubs
Generate
Producer
Contract
Tests
Implement
Consumer
@mogronalol 60
Consumer Driven Contracts
Consumer
Defines
Contract
Implement
Producer
http://www.martinfowler.com/articles/consumerDrivenContracts.html
Generate
Producer
Stubs
Generate
Producer
Contract
Tests
Implement
Consumer
Run
Consumer
Contract
Tests
@mogronalol 60
Consumer Driven Contracts
Consumer
Defines
Contract
Implement
Producer
http://www.martinfowler.com/articles/consumerDrivenContracts.html
Generate
Producer
Stubs
Generate
Producer
Contract
Tests
Implement
Consumer
Run
Consumer
Contract
Tests
@mogronalol 61
Consumer Driven Contracts
http://www.martinfowler.com/articles/consumerDrivenContracts.html
@mogronalol 61
Consumer Driven Contracts
Change
producer
http://www.martinfowler.com/articles/consumerDrivenContracts.html
@mogronalol 61
Consumer Driven Contracts
Change
producer
http://www.martinfowler.com/articles/consumerDrivenContracts.html
Run
Consumer
Contract
Tests
@mogronalol 61
Consumer Driven Contracts
Change
producer
http://www.martinfowler.com/articles/consumerDrivenContracts.html
Run
Consumer
Contract
Tests
@mogronalol 62
Tools
@mogronalol 62
Tools
@mogronalol 63
Testing Pyramid
End to end
Integration / Service Testing
Unit Testing
@mogronalol 63
Testing Pyramid
End to end
Integration / Service Testing
Unit Testing
Consumer Driven
Contract Testing
@mogronalol 63
Testing Pyramid
End to end
Integration / Service Testing
Unit Testing
Consumer Driven
Contract Testing
@mogronalol 64
Agenda
• The problems with testing API driven architectures
• Introduction to API simulation
• Applying API simulation patterns
• Data management
• Conclusion
@mogronalol 65
Conclusion
@mogronalol 65
Conclusion
• Reduced cost be replacing real resources
@mogronalol 65
Conclusion
• Reduced cost be replacing real resources
• Improved deployment time with API simulations
@mogronalol 65
Conclusion
• Reduced cost be replacing real resources
• Improved deployment time with API simulations
• Less dependance on end-to-end testing
@mogronalol 65
Conclusion
• Reduced cost be replacing real resources
• Improved deployment time with API simulations
• Less dependance on end-to-end testing
• Advanced patterns for simplifying API simulations
@mogronalol 65
Conclusion
• Reduced cost be replacing real resources
• Improved deployment time with API simulations
• Less dependance on end-to-end testing
• Advanced patterns for simplifying API simulations
• Improved feedback cycle
@mogronalol
Questions?
66
@mogronalol
andrewmorgan36@gmail.com
https://github.com/mogronalol
hoverfly.io

Mais conteúdo relacionado

Semelhante a Api Simulation Patterns for Better Testing

Simulating APIs for Effective Testing: (Micro)Service Virtualisation for the ...
Simulating APIs for Effective Testing: (Micro)Service Virtualisation for the ...Simulating APIs for Effective Testing: (Micro)Service Virtualisation for the ...
Simulating APIs for Effective Testing: (Micro)Service Virtualisation for the ...Andrew Morgan
 
Eradicate Flaky Tests
Eradicate Flaky TestsEradicate Flaky Tests
Eradicate Flaky TestsAnand Bagmar
 
Building Outside-in Planning Processes
Building Outside-in Planning ProcessesBuilding Outside-in Planning Processes
Building Outside-in Planning ProcessesLora Cecere
 
Supply Chain Insights Global Summit: Presentation on Outside-in Projects
Supply Chain Insights Global Summit: Presentation on Outside-in ProjectsSupply Chain Insights Global Summit: Presentation on Outside-in Projects
Supply Chain Insights Global Summit: Presentation on Outside-in ProjectsSupplychainInsights
 
Eradicate Flaky Tests - AppiumConf 2021
Eradicate Flaky Tests - AppiumConf 2021Eradicate Flaky Tests - AppiumConf 2021
Eradicate Flaky Tests - AppiumConf 2021Anand Bagmar
 
Conversionista : Conversion manager course - Stockholm 20 march 2013
Conversionista : Conversion manager course  - Stockholm 20 march 2013Conversionista : Conversion manager course  - Stockholm 20 march 2013
Conversionista : Conversion manager course - Stockholm 20 march 2013Craig Sullivan
 
Testing strategies in microservices
Testing strategies in microservicesTesting strategies in microservices
Testing strategies in microservicesGeekNightHyderabad
 
Space Camp - API Contract Testing
Space Camp - API Contract TestingSpace Camp - API Contract Testing
Space Camp - API Contract TestingPostman
 
Natural born conversion killers - Conversion Jam
Natural born conversion killers - Conversion JamNatural born conversion killers - Conversion Jam
Natural born conversion killers - Conversion JamCraig Sullivan
 
The Path to a Programmable Network
The Path to a Programmable NetworkThe Path to a Programmable Network
The Path to a Programmable NetworkMyNOG
 
Billgren - Product Summit Speed Layers v12.pdf
Billgren - Product Summit Speed Layers v12.pdfBillgren - Product Summit Speed Layers v12.pdf
Billgren - Product Summit Speed Layers v12.pdfISPMAIndia
 
The Business Value of Open Source
The Business Value of Open SourceThe Business Value of Open Source
The Business Value of Open SourceSimon Phipps
 
Supply Chain Risk Erau webinar march 2018
Supply Chain Risk Erau webinar march 2018 Supply Chain Risk Erau webinar march 2018
Supply Chain Risk Erau webinar march 2018 Bill Gibbs
 
Next Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy MobileNext Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy MobileC4Media
 
Webcast Presentation: Accelerate Continuous Delivery with Development Testing...
Webcast Presentation: Accelerate Continuous Delivery with Development Testing...Webcast Presentation: Accelerate Continuous Delivery with Development Testing...
Webcast Presentation: Accelerate Continuous Delivery with Development Testing...GRUC
 
Case Studies - Promotional supply optimization; procurement transformation
Case Studies - Promotional supply optimization; procurement transformationCase Studies - Promotional supply optimization; procurement transformation
Case Studies - Promotional supply optimization; procurement transformationJohn William
 
Scrum in Hardware
Scrum in HardwareScrum in Hardware
Scrum in HardwareTEST Huddle
 
Akamai case master
Akamai case masterAkamai case master
Akamai case masterSko Den
 
Software Testing for SEO
Software Testing for SEOSoftware Testing for SEO
Software Testing for SEOMichael King
 
Part of the pipeline-why continuous testing is essential - velocity conf
Part of the pipeline-why continuous testing is essential - velocity confPart of the pipeline-why continuous testing is essential - velocity conf
Part of the pipeline-why continuous testing is essential - velocity confTapabrata Pal
 

Semelhante a Api Simulation Patterns for Better Testing (20)

Simulating APIs for Effective Testing: (Micro)Service Virtualisation for the ...
Simulating APIs for Effective Testing: (Micro)Service Virtualisation for the ...Simulating APIs for Effective Testing: (Micro)Service Virtualisation for the ...
Simulating APIs for Effective Testing: (Micro)Service Virtualisation for the ...
 
Eradicate Flaky Tests
Eradicate Flaky TestsEradicate Flaky Tests
Eradicate Flaky Tests
 
Building Outside-in Planning Processes
Building Outside-in Planning ProcessesBuilding Outside-in Planning Processes
Building Outside-in Planning Processes
 
Supply Chain Insights Global Summit: Presentation on Outside-in Projects
Supply Chain Insights Global Summit: Presentation on Outside-in ProjectsSupply Chain Insights Global Summit: Presentation on Outside-in Projects
Supply Chain Insights Global Summit: Presentation on Outside-in Projects
 
Eradicate Flaky Tests - AppiumConf 2021
Eradicate Flaky Tests - AppiumConf 2021Eradicate Flaky Tests - AppiumConf 2021
Eradicate Flaky Tests - AppiumConf 2021
 
Conversionista : Conversion manager course - Stockholm 20 march 2013
Conversionista : Conversion manager course  - Stockholm 20 march 2013Conversionista : Conversion manager course  - Stockholm 20 march 2013
Conversionista : Conversion manager course - Stockholm 20 march 2013
 
Testing strategies in microservices
Testing strategies in microservicesTesting strategies in microservices
Testing strategies in microservices
 
Space Camp - API Contract Testing
Space Camp - API Contract TestingSpace Camp - API Contract Testing
Space Camp - API Contract Testing
 
Natural born conversion killers - Conversion Jam
Natural born conversion killers - Conversion JamNatural born conversion killers - Conversion Jam
Natural born conversion killers - Conversion Jam
 
The Path to a Programmable Network
The Path to a Programmable NetworkThe Path to a Programmable Network
The Path to a Programmable Network
 
Billgren - Product Summit Speed Layers v12.pdf
Billgren - Product Summit Speed Layers v12.pdfBillgren - Product Summit Speed Layers v12.pdf
Billgren - Product Summit Speed Layers v12.pdf
 
The Business Value of Open Source
The Business Value of Open SourceThe Business Value of Open Source
The Business Value of Open Source
 
Supply Chain Risk Erau webinar march 2018
Supply Chain Risk Erau webinar march 2018 Supply Chain Risk Erau webinar march 2018
Supply Chain Risk Erau webinar march 2018
 
Next Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy MobileNext Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy Mobile
 
Webcast Presentation: Accelerate Continuous Delivery with Development Testing...
Webcast Presentation: Accelerate Continuous Delivery with Development Testing...Webcast Presentation: Accelerate Continuous Delivery with Development Testing...
Webcast Presentation: Accelerate Continuous Delivery with Development Testing...
 
Case Studies - Promotional supply optimization; procurement transformation
Case Studies - Promotional supply optimization; procurement transformationCase Studies - Promotional supply optimization; procurement transformation
Case Studies - Promotional supply optimization; procurement transformation
 
Scrum in Hardware
Scrum in HardwareScrum in Hardware
Scrum in Hardware
 
Akamai case master
Akamai case masterAkamai case master
Akamai case master
 
Software Testing for SEO
Software Testing for SEOSoftware Testing for SEO
Software Testing for SEO
 
Part of the pipeline-why continuous testing is essential - velocity conf
Part of the pipeline-why continuous testing is essential - velocity confPart of the pipeline-why continuous testing is essential - velocity conf
Part of the pipeline-why continuous testing is essential - velocity conf
 

Último

Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 

Último (20)

Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 

Api Simulation Patterns for Better Testing