SlideShare a Scribd company logo
1 of 52
Download to read offline
FLYING STARTINTOFLYING STARTINTOFLYING STARTINTOFLYING STARTINTOFLYING STARTINTOFLYING STARTINTOFLYING STARTINTOFLYING STARTINTOFLYING STARTINTOFLYING STARTINTOFLYING STARTINTOFLYING STARTINTO
CONTRACTTESTINGCONTRACTTESTINGCONTRACTTESTINGCONTRACTTESTINGCONTRACTTESTINGCONTRACTTESTINGCONTRACTTESTINGCONTRACTTESTINGCONTRACTTESTINGCONTRACTTESTINGCONTRACTTESTINGCONTRACTTESTING
Piotr Kubowicz
 @pkubowicz
$ whois piotr-kubowicz
Java/JVM since 2007
pact-jvm contributor 
Planner app
How many forklifts to move
supplies arriving tomorrow?
Supplies system
tomorrow: 300 apples,
45 kg
tomorrow: 40 bottles of
water, 60 kg
+2 days: 600 carrots,
36 kg
TESTING WITHREAL DEPENDENCIES
('integration testing')
MOCKING DEPENDENCIES
Planner Supplies
Planner tests
Planner Fake Supplies
Supplies tests
Fake Planner Supplies
TYPICAL PROBLEM
{
"count": 15,
"status": "CANCELED"
}
{
"count": 15,
"status": "CANCELLED"
}
CONTRACTTESTING
Planner Contract Supplies
enforced in an automatic way
TERMINOLOGY
Planner Supplies
REST call
Consumer Provider
LET'S SEEITWORKING
SPEED
Consumer: 220 test cases per minute
Provider: 2400 test cases per minute
PACTWORKFLOW
1. Consumer test
2. Play with API
3. Share contract
4. Adopt Provider
PACTWORKFLOW
No waiting until Provider features are ready
You can start without Provider itself
SHARING PACTCONTRACTS
Attach to an e-mail then commit to Git
Publish to your artifact repository (Maven)
Dedicated Pact Broker server
LANGUAGES SUPPORTED
JVM
JS
Ruby
.NET
Go
Swift
PHP
any (for provider)
PACT ONTHE PROVIDER SIDE
Pact Provider
Verifier Your Provider
Docker any language
PACTONTHEPROVIDER SIDE
Planner Shop
Supplies
WHATTO TEST
no assertions
@Test @PactTestFor(pactMethod = "twoSupplies")
fun getsSupplies() {
client.getFor(LocalDate.of(2018, 12, 23))
}
WHATTO TEST
only check client
val received = client.getFor(LocalDate.of(2018, 12, 23))
assertThat(received).hasSize(2)
assertThat(received[1])
.hasFieldOrPropertyWithValue("count", 4)
.hasFieldOrPropertyWithValue("status", ACTIVE)
.hasFieldOrPropertyWithValue("totalWeight", 20)
WHATTO TEST
check client and logic
val averageWeight =
SuppliesAnalyser().countAverageItemWeight(
client.getFor(LocalDate.of(2018, 12, 23))
);
assertThat(averageWeight).isEqualTo(5.0);
WHATTO TEST
isolated client contract test
isolated logic test
var supplies = client.getFor(LocalDate.of(2018, 12, 23))
assertThat(supplies.get(0))
.hasFieldOrPropertyWithValue("status", ACTIVE)
var supplies = listOf(
Supply(2, 12, ACTIVE), Supply(3, 13, ACTIVE))
assertThat(analyser.countAverageItemWeight(supplies))
.isEqualTo(5.0)
WHATTO TEST
logic implementation
requirement: canceled supplies not counted
val sumWeights = supplies.map { it.totalWeight }.sum()
var supplies = listOf(
Supply(2, 12, ACTIVE), Supply(3, 13, ACTIVE))
assertThat(analyser.countAverageItemWeight(supplies))
.isEqualTo(5.0)
CONTROLLING PROVIDER BEHAVIOUR
test 1
test 2
.uponReceiving("request for a canceled supply")
.uponReceiving("request for two supplies")
CONTROLLING PROVIDER BEHAVIOUR
/supplies?day=2018-12-23
→ one canceled supply
/supplies?day=2018-12-01
→ one canceled and one active supply
CONTROLLING PROVIDER BEHAVIOUR
/current-user-details
→ {"admin": false}
/current-user-details
→ {"admin": true}
DEFINING STATE
test 1
test 2
.given("one canceled supply")
.uponReceiving("request for a canceled supply")
.given("one canceled and one active supply")
.uponReceiving("request for two supplies")
STATES DEMO
SPECIFYING BODY
.body(newJsonBody { o ->
o.stringValue("status", "CANCELED")
})
Missing required creator property 'count' (index 0)
at [Source: (String)"[{"status":"CANCELED"}]"; line: 1, column: 18
SPECIFYING BODY
Consumer: return 50
Provider: verify 50 is returned
.body(newJsonBody { o ->
o.stringValue("status", "CANCELED")
o.numberValue("count", 50)
})
SPECIFYING BODY
Consumer: return 50
Provider: verify any number is returned
o.numberValue("count", 50)
o.numberType("count", 50)
o.numberType("count", "totalWeight")
SPECIFYING BODY
o.stringMatcher("checksum", "w{8}", "a421ef07")
CONTRACTTESTS USECASES
backend-frontend in one team
teams in different locations
project handover
message queues
VISUALISATION
VISUALISATION
ALTERNATIVETOOLS
Spring Cloud Contract
Consumer test
Contract
Provider test
Provider test
Stubs
Consumer test
Contract
Provider test
Stubs
Consumer test
Contract
Gradle/Maven
JUnit 4/5
Spock
Maven repo
Stub runner
Groovy
Provider test
Stubs
Consumer test
Contract
Docker
Maven repo/Git
Docker
YAML
CONTRACTINSPRING CLOUDCONTRACT
org.springframework.cloud.contract.spec.Contract.make {
request {
method 'GET'
url('/supplies') {
queryParameters {
parameter day: '2018-12-23'
}
}
}
response {
status OK()
body([status: "CANCELED"])
headers { contentType('application/json') }
}
}
Generated test
Base class you need to write
public class ManySuppliesTest extends ContractVerifierBase {
@Test
public void validate_returnsManySupplies() throws Exception {
Response response = given().spec(request)
.queryParam("day","2018-12-23").get("/supplies");
// ...
assertThatJson(parsedJson).array()
.contains("['status']").isEqualTo("CANCELED");
abstract class ContractVerifierBase {
@Before
fun startServer() {
RestAssured.port = 9053
MyServer().start(9053)
}
Test 1: request for two supplies
Test 2: request for a canceled supply
contracts/
manySupplies/
oneSupply/
returnsManySupplies.groovy
returnsOneSupply.groovy
contracts/
manySupplies/
oneSupply/
returnsManySupplies.groovy
returnsOneSupply.groovy
generated/
ManySuppliesTest
OneSupplyTest
base/
ManySuppliesBase
OneSupplyBase
QUIRKS
Accepts 3 items
response {
body([
[status: "CANCELED"],
[count: 4, totalWeight: 20, status: "ACTIVE"],
])
}
[
{"status": "CANCELED"},
{"count": 4, "totalWeight": 20, "status": "ACTIVE"},
{"count": 151, "totalWeight": 980, "status": "ACTIVE"}
]
QUIRKS
Accepted response
response {
body([
[status: "CANCELED"],
[count: 4, totalWeight: 20, status: "ACTIVE"],
])
}
[
{"count": 4, "totalWeight": 980, "status": "CANCELED"},
{"count": 151, "totalWeight": 20, "status": "ACTIVE"}
]
Spring Cloud Contract can work with Pact contracts
NO TIMEFOR THIS —I'MTOO BUSY
writing tests for code sending HTTP requests
asking other team what data they send
thinking about edge cases
testing my DB queries return what I want
CONTRACTTESTS
test correct form of Consumer requests
document requests/responses
share test data and edge cases
verify full stack of Provider
THANK YOU!THANK YOU!THANK YOU!THANK YOU!THANK YOU!THANK YOU!THANK YOU!THANK YOU!THANK YOU!THANK YOU!THANK YOU!THANK YOU!
ATTRIBUTION
Photo by on Unsplash
Icons used under CC BY 3.0 license are made by
Explosion icon by
Question mark icon by
dylan nolte
icon nder.com/user/atifarshad
icon nder.com/im04
icon nder.com/CreativeCorp
icon nder.com/korawan_m
icon nder.com/Field5
Q & A
piotr.kubowicz@gmail.com
Twitter @pkubowicz
github.com/pkubowicz/contract-testing-samples
pact.io
cloud.spring.io/spring-cloud-contract/

More Related Content

Similar to Flying Start into Contract Testing

Kick Your Database to the Curb
Kick Your Database to the CurbKick Your Database to the Curb
Kick Your Database to the CurbBill Bejeck
 
MongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-esMongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-esMongoDB
 
Delightful steps to becoming a functioning user of Step Functions
Delightful steps to becoming a functioning user of Step FunctionsDelightful steps to becoming a functioning user of Step Functions
Delightful steps to becoming a functioning user of Step FunctionsYan Cui
 
Programming proxies to do what we need so we don't have to talk to the networ...
Programming proxies to do what we need so we don't have to talk to the networ...Programming proxies to do what we need so we don't have to talk to the networ...
Programming proxies to do what we need so we don't have to talk to the networ...Lori MacVittie
 
Liquid Stream Processing Across Web Browsers and Web Servers
Liquid Stream Processing Across Web Browsers and Web ServersLiquid Stream Processing Across Web Browsers and Web Servers
Liquid Stream Processing Across Web Browsers and Web ServersMasiar Babazadeh
 
Industroyer: biggest threat to industrial control systems since Stuxnet by An...
Industroyer: biggest threat to industrial control systems since Stuxnet by An...Industroyer: biggest threat to industrial control systems since Stuxnet by An...
Industroyer: biggest threat to industrial control systems since Stuxnet by An...CODE BLUE
 
JS Fest 2019. Anjana Vakil. Serverless Bebop
JS Fest 2019. Anjana Vakil. Serverless BebopJS Fest 2019. Anjana Vakil. Serverless Bebop
JS Fest 2019. Anjana Vakil. Serverless BebopJSFestUA
 
Aaron Bedra - Effective Software Security Teams
Aaron Bedra - Effective Software Security TeamsAaron Bedra - Effective Software Security Teams
Aaron Bedra - Effective Software Security Teamscentralohioissa
 
SMC304 Serverless Orchestration with AWS Step Functions
SMC304 Serverless Orchestration with AWS Step FunctionsSMC304 Serverless Orchestration with AWS Step Functions
SMC304 Serverless Orchestration with AWS Step FunctionsAmazon Web Services
 
Real-Time Stream Processing with KSQL and Apache Kafka
Real-Time Stream Processing with KSQL and Apache KafkaReal-Time Stream Processing with KSQL and Apache Kafka
Real-Time Stream Processing with KSQL and Apache Kafkaconfluent
 
Windowing in Kafka Streams and Flink SQL
Windowing in Kafka Streams and Flink SQLWindowing in Kafka Streams and Flink SQL
Windowing in Kafka Streams and Flink SQLHostedbyConfluent
 
Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"Fwdays
 
Beyond the current state
Beyond the current stateBeyond the current state
Beyond the current stateArmin Pašalić
 
Compose Async with RxJS
Compose Async with RxJSCompose Async with RxJS
Compose Async with RxJSKyung Yeol Kim
 
REST API に疲れたあなたへ贈る GraphQL 入門
REST API に疲れたあなたへ贈る GraphQL 入門REST API に疲れたあなたへ贈る GraphQL 入門
REST API に疲れたあなたへ贈る GraphQL 入門Keisuke Tsukagoshi
 
GraphQL - an elegant weapon... for more civilized age
GraphQL - an elegant weapon... for more civilized ageGraphQL - an elegant weapon... for more civilized age
GraphQL - an elegant weapon... for more civilized ageBartosz Sypytkowski
 
Madrid JAM limitaciones - dificultades
Madrid JAM limitaciones - dificultadesMadrid JAM limitaciones - dificultades
Madrid JAM limitaciones - dificultadesJavier Delgado Garrido
 
"Reactive Programming in Java" at Froscon 2017 by Vadym Kazulkin/Rodion Alukh...
"Reactive Programming in Java" at Froscon 2017 by Vadym Kazulkin/Rodion Alukh..."Reactive Programming in Java" at Froscon 2017 by Vadym Kazulkin/Rodion Alukh...
"Reactive Programming in Java" at Froscon 2017 by Vadym Kazulkin/Rodion Alukh...Vadym Kazulkin
 
An Introduction to Property Based Testing
An Introduction to Property Based TestingAn Introduction to Property Based Testing
An Introduction to Property Based TestingC4Media
 
Getting Started with MongoDB and NodeJS
Getting Started with MongoDB and NodeJSGetting Started with MongoDB and NodeJS
Getting Started with MongoDB and NodeJSMongoDB
 

Similar to Flying Start into Contract Testing (20)

Kick Your Database to the Curb
Kick Your Database to the CurbKick Your Database to the Curb
Kick Your Database to the Curb
 
MongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-esMongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-es
 
Delightful steps to becoming a functioning user of Step Functions
Delightful steps to becoming a functioning user of Step FunctionsDelightful steps to becoming a functioning user of Step Functions
Delightful steps to becoming a functioning user of Step Functions
 
Programming proxies to do what we need so we don't have to talk to the networ...
Programming proxies to do what we need so we don't have to talk to the networ...Programming proxies to do what we need so we don't have to talk to the networ...
Programming proxies to do what we need so we don't have to talk to the networ...
 
Liquid Stream Processing Across Web Browsers and Web Servers
Liquid Stream Processing Across Web Browsers and Web ServersLiquid Stream Processing Across Web Browsers and Web Servers
Liquid Stream Processing Across Web Browsers and Web Servers
 
Industroyer: biggest threat to industrial control systems since Stuxnet by An...
Industroyer: biggest threat to industrial control systems since Stuxnet by An...Industroyer: biggest threat to industrial control systems since Stuxnet by An...
Industroyer: biggest threat to industrial control systems since Stuxnet by An...
 
JS Fest 2019. Anjana Vakil. Serverless Bebop
JS Fest 2019. Anjana Vakil. Serverless BebopJS Fest 2019. Anjana Vakil. Serverless Bebop
JS Fest 2019. Anjana Vakil. Serverless Bebop
 
Aaron Bedra - Effective Software Security Teams
Aaron Bedra - Effective Software Security TeamsAaron Bedra - Effective Software Security Teams
Aaron Bedra - Effective Software Security Teams
 
SMC304 Serverless Orchestration with AWS Step Functions
SMC304 Serverless Orchestration with AWS Step FunctionsSMC304 Serverless Orchestration with AWS Step Functions
SMC304 Serverless Orchestration with AWS Step Functions
 
Real-Time Stream Processing with KSQL and Apache Kafka
Real-Time Stream Processing with KSQL and Apache KafkaReal-Time Stream Processing with KSQL and Apache Kafka
Real-Time Stream Processing with KSQL and Apache Kafka
 
Windowing in Kafka Streams and Flink SQL
Windowing in Kafka Streams and Flink SQLWindowing in Kafka Streams and Flink SQL
Windowing in Kafka Streams and Flink SQL
 
Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"
 
Beyond the current state
Beyond the current stateBeyond the current state
Beyond the current state
 
Compose Async with RxJS
Compose Async with RxJSCompose Async with RxJS
Compose Async with RxJS
 
REST API に疲れたあなたへ贈る GraphQL 入門
REST API に疲れたあなたへ贈る GraphQL 入門REST API に疲れたあなたへ贈る GraphQL 入門
REST API に疲れたあなたへ贈る GraphQL 入門
 
GraphQL - an elegant weapon... for more civilized age
GraphQL - an elegant weapon... for more civilized ageGraphQL - an elegant weapon... for more civilized age
GraphQL - an elegant weapon... for more civilized age
 
Madrid JAM limitaciones - dificultades
Madrid JAM limitaciones - dificultadesMadrid JAM limitaciones - dificultades
Madrid JAM limitaciones - dificultades
 
"Reactive Programming in Java" at Froscon 2017 by Vadym Kazulkin/Rodion Alukh...
"Reactive Programming in Java" at Froscon 2017 by Vadym Kazulkin/Rodion Alukh..."Reactive Programming in Java" at Froscon 2017 by Vadym Kazulkin/Rodion Alukh...
"Reactive Programming in Java" at Froscon 2017 by Vadym Kazulkin/Rodion Alukh...
 
An Introduction to Property Based Testing
An Introduction to Property Based TestingAn Introduction to Property Based Testing
An Introduction to Property Based Testing
 
Getting Started with MongoDB and NodeJS
Getting Started with MongoDB and NodeJSGetting Started with MongoDB and NodeJS
Getting Started with MongoDB and NodeJS
 

More from Piotr Kubowicz

Mutation testing: Too good to be true? (Devoxx)
Mutation testing: Too good to be true? (Devoxx)Mutation testing: Too good to be true? (Devoxx)
Mutation testing: Too good to be true? (Devoxx)Piotr Kubowicz
 
Mutation testing: Too good to be true? (4Developers)
Mutation testing: Too good to be true? (4Developers)Mutation testing: Too good to be true? (4Developers)
Mutation testing: Too good to be true? (4Developers)Piotr Kubowicz
 
Lotny start z testami kontraktowymi 4Developers
Lotny start z testami kontraktowymi 4DevelopersLotny start z testami kontraktowymi 4Developers
Lotny start z testami kontraktowymi 4DevelopersPiotr Kubowicz
 
Problem sprytnego programisty
Problem sprytnego programistyProblem sprytnego programisty
Problem sprytnego programistyPiotr Kubowicz
 
Czego oczekiwać od modułów w Javie 9
Czego oczekiwać od modułów w Javie 9Czego oczekiwać od modułów w Javie 9
Czego oczekiwać od modułów w Javie 9Piotr Kubowicz
 
Programista wychodzi z piwnicy
Programista wychodzi z piwnicy Programista wychodzi z piwnicy
Programista wychodzi z piwnicy Piotr Kubowicz
 

More from Piotr Kubowicz (7)

Mutation testing: Too good to be true? (Devoxx)
Mutation testing: Too good to be true? (Devoxx)Mutation testing: Too good to be true? (Devoxx)
Mutation testing: Too good to be true? (Devoxx)
 
Mutation testing: Too good to be true? (4Developers)
Mutation testing: Too good to be true? (4Developers)Mutation testing: Too good to be true? (4Developers)
Mutation testing: Too good to be true? (4Developers)
 
Lotny start z testami kontraktowymi 4Developers
Lotny start z testami kontraktowymi 4DevelopersLotny start z testami kontraktowymi 4Developers
Lotny start z testami kontraktowymi 4Developers
 
Po co nam RSocket?
Po co nam RSocket?Po co nam RSocket?
Po co nam RSocket?
 
Problem sprytnego programisty
Problem sprytnego programistyProblem sprytnego programisty
Problem sprytnego programisty
 
Czego oczekiwać od modułów w Javie 9
Czego oczekiwać od modułów w Javie 9Czego oczekiwać od modułów w Javie 9
Czego oczekiwać od modułów w Javie 9
 
Programista wychodzi z piwnicy
Programista wychodzi z piwnicy Programista wychodzi z piwnicy
Programista wychodzi z piwnicy
 

Recently uploaded

Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024BookNet Canada
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Unlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsUnlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsPrecisely
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 

Recently uploaded (20)

Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Unlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsUnlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power Systems
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 

Flying Start into Contract Testing