SlideShare a Scribd company logo
1 of 88
Download to read offline
Property
BasedTesting
❤(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
ExampleScenario:
MultiSourceInventory
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Iwantit!
Isitready?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
!
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Let'stest!
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Whatdowetest?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Scenario
1 website
1 source
1 stock
1 product qty 1
1 order qty 1
assertTrue($isItemSoldOut)
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Itworks!
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
...butdoesit?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Scenario2
2 website
2 sources
2 stocks
1 product, qty 1 in each source
1 order from source 1, qty 1
assertTrue($isItemSoldOutForStock1)
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Howconfidentareyou?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Okay,afewmorecases...
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Eachofthepriortestsbutwith:
2 products
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Oh,andalsowith:
2 orders
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Whataboutbackorders?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Butwhataboutqtythresholds?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Butwhataboutpositive&
negativeqtythresholds?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Anddecimalquantities?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Andshouldn'twetestthat
ifaproductisnotsoldout
itstillissalable?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Aretherenewedgecasesthatare
introducedby
interactingfeatures?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
!
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
...It'simpossible!
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Let'sjustforgetabout
automatedtesting.
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
kthxbye
Questions?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Realhero:JohnHughes
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Don't write tests,
generate them!
-- John Hughes
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Instead of examples...
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
We describe the full range of valid inputs
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
1+ websites
1+ sources
1+ products assigned to sources at random
Each with a qty in of -max_int to max_int
Each with or without backorders enabled
Each with a threshold of -max_int to max_int
Each with or without decimal quantities
1+ orders per product with a total qty from .0001
to the salable amount
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Let the test framework
generate
a random sample for each input
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
And we do that hundreds of times.
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
And we do that hundreds N times.
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Unrealistic!
It takes too much time.
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
1-5 websites
1-5 sources
1-100 products assigned to sources at random
Each with a qty of -100 to 100
Each with or without backorders enabled
Each with a threshold of -10 to 10
Each with or without decimal quantities
n orders per product with a total qty from .0001
to the salable amount
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
S.S.A.F.
(stillslowashell)
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
2 fix websites
2 fix sources
1 product
Stock qty of -100 - 100
With a threshold of -10 to 10
With backorders enabled if threshold < 0
With decimal quantities
1 - 10 orders per product
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Thatmightwork
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Howexactly?
Details please
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
$check = $this->forAll(...$generators);
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
And ...$generators is what?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
$simpleProducts = GeneratorsimpleProduct();
$inStockQtys = GeneratorchooseFloat(-100, 100);
$minQtyThresholds = GeneratorchooseFloat(-100, 100);
$nOrdersForProduct = Generatorchoose(1, 10);
$check = $this->forAll(
$simpleProducts,
$inStockQtys,
$minQtyThresholds,
$nOrdersForProduct
);
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Generatorsdescribethe
rangeofvalidinputs
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Generators
are
Composeable
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Generatorint(); // => 29384
Generatorneg(); // => -6
Generatornat(); // => 0
Generatorpos(); // => 15
Generatorfloat(); // => 21.92836
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Generatorstring(); // => Jx@
Generatornames(); // Alice
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Generatorchoose(1, 1000) // => 55
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Generatorvec(4, Generatornames());
// => ["Zénobin", "Dee", "Allen", "Theophania" ],
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
public static function skuGenerator(): Generator
{
return GeneratorsuchThat(
function (string $s) {
return $s !== '' && strlen($s) <= 64;
},
Generatorstring()
);
}
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
public static function simpleProductGenerator(): Generator
{
return Generatorbind(
Generatortuple(
self::skuGenerator(),
self::productNameGenerator()
),
function (array $skuAndName) {
[$sku, $name] = $skuAndName;
$product = self::createSimpleProduct($sku, $name);
return Generatorconstant($product);
}
);
}
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
public static function simpleProductsGenerator(): Generator
{
return Generatorseq(
self::simpleProductGenerator()
);
// => array of zero or more products
}
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Generating interdependent values is
a bit more complex...
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Generatorbind(
GeneratorsuchThat(
function (array $tuple) {
[$inStockQty, $minInStockQty] = $tuple;
return $minInStockQty <= 0 || $minInStockQty > $inStockQty;
},
Generatortuple(
$this->chooseFloat(0, 100), // inStockQty
$this->chooseFloat(-100, 100) // minInStockQty
)
),
function (array $tuple): Generator {
[$inStockQty, $minInStockQty] = $tuple;
$salableQty = $inStockQty - $minInStockQty;
return Generatorassociative([
'inStockQty' => Generatorconstant($inStockQty),
'minQtyThreshold' => Generatorconstant($minInStockQty),
'orderQty' => Generatorfrequency(
[1, $salableQty], // place orders for full purchasable quantity
[2, $this->chooseFloat(0, $salableQty - 0.0001)] // purchase below salable quantity
)]
);
}
);
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Generatorsdescribethefullscope
ofvalidinputs
$check = $this->forAll(...$generators);
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
andthen?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Declare
System
Properties
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Property:
Something that is always true
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
$check = $this->forAll(Generatorint(), Generatorint());
$check(function (int $a, int $b) {
$this->assertSame(
$a + $b,
$b + $a
);
});
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
How about something Magento related?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
QuoteMerging:
(customer quote item qty) + (guest quote item qty)
== merged quote item qty
(customer quote item count) + (guest quote item count)
>= merged quote item count
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
$check = $this->forAll(
$this->simpleProducts(),
$this->simpleProducts()
);
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
$check(function (array $inCustomerQuote, array $inGuestQuote) {
$customerQuote = $this->createQuote();
$guestQuote = $this->createQuote();
$this->addProductsToQuote($customerQuote, $inCustomerQuote);
$this->addProductsToQuote($guestQuote, $inGuestQuote);
$customerQuoteItemQtyBefore = $customerQuote->getItemsQty();
$guestQuoteItemQtyBefore = $guestQuote->getItemsQty();
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
$customerQuote->merge($guestQuote);
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
$this->assertSame(
$customerQuoteItemQtyBefore + $guestQuoteItemQtyBefore
$customerQuote->getItemsQty()
);
$this->assertLessThanOrEqual(
count($inCustomerQuote) + count($inGuestQuote),
count($customerQuote->getAllVisibleItems()
);
});
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
FindingProperties
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Reversible algorithms
$this->assertSame(
$input,
json_decode(json_encode($input), true)
);
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Algorithms with algebraic properties
$this->assertEquals(
$quoteC->merge($quoteB->merge($quoteA));
$quoteA->merge($quoteB->merge($quoteC));
);
// $quoteC . ($quoteB . $quoteA)
// ($quoteC . $quoteB) . $quoteA
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Generative smoke tests
$check = $this->forAll(Generatorstring());
$check(function(string $requestPayload) use ($api) {
$response = $api->post($requestPayload);
$this->assertContains(
$response->status(),
[200, 201, 202, 203, 204, 205, 206]
);
$this->assertNotNull(
json_decode($response->body(), true)
);
});
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Alternative implementation
$this->assertSame(
$system->process($a, $b),
$otherImplementation->process($a, $b)
);
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Testing stateful systems
$check = $this->forAll(
Generatorseq(GeneratordomainAction())
);
$check(function(array $actions)) use ($system, $model) {
foreach ($actions as $takeAction) {
$takeAction($system);
$takeAction($model);
}
$this->assertSame($system->getState(), $model->getState());
});
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Inanutshell:
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
1. Define valid inputs with generators
2. Write tests for properties
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Howfastisit?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
As fast as the system under test
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Howhardisit?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Ittakeseffort
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Isitworththetime?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Doesitfindbugs?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Itdoesindeed.
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
While preparing this talk...
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Decimal qtys
Backorders enabled
Negative min qty threshold
O!en impossible to purchase the complete
salable quantity when multiple decimal orders
are used.
ApiGetProductSalableQtyInterface reports
that only -8.3266726846887E-17 are in stock.
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Zero product stock qty
Backorders enabled
Negative min qty threshold
Wrong salable quantity
ApiGetProductSalableQtyInterface reports
salable quantity as zero
instead of the min qty threshold
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Propertybasedtesting
isbetterthanhumans
atfindingedgecases
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
So...isitworthit?
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Thanks to
John Hughes  QuickCheck
Sebastian Bergman  PHPUnit
Giorgio Sironi  Eris
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019
Pleasecomeandchat!
IRL RIGHT HERE
twitter://@VinaiKopp
slack://vinai@magentocommeng.slack.com
slack self signup: http://tinyurl.com/engcom-slack
(c) Vinai Kopp - http://vinaikopp.com - twitter://@VinaiKopp - #MageTesFest 2019

More Related Content

More from vinaikopp

Magento 2 TDD Code Kata
Magento 2 TDD Code KataMagento 2 TDD Code Kata
Magento 2 TDD Code Katavinaikopp
 
Magento 2 TDD Code Kata Intro
Magento 2 TDD Code Kata IntroMagento 2 TDD Code Kata Intro
Magento 2 TDD Code Kata Introvinaikopp
 
Testing Magento 2
Testing Magento 2Testing Magento 2
Testing Magento 2vinaikopp
 
ClojureScript in Magento 2 - MageTitansMCR 2017
ClojureScript in Magento 2 - MageTitansMCR 2017ClojureScript in Magento 2 - MageTitansMCR 2017
ClojureScript in Magento 2 - MageTitansMCR 2017vinaikopp
 
Lizards & Pumpkins Catalog Replacement at mm17de
Lizards & Pumpkins Catalog Replacement at mm17deLizards & Pumpkins Catalog Replacement at mm17de
Lizards & Pumpkins Catalog Replacement at mm17devinaikopp
 
Stories from the other side
Stories from the other sideStories from the other side
Stories from the other sidevinaikopp
 
Writing Testable Code (for Magento 1 and 2) 2016 Romaina
Writing Testable Code (for Magento 1 and 2)  2016 RomainaWriting Testable Code (for Magento 1 and 2)  2016 Romaina
Writing Testable Code (for Magento 1 and 2) 2016 Romainavinaikopp
 
Writing Testable Code (for Magento 1 and 2)
Writing Testable Code (for Magento 1 and 2)Writing Testable Code (for Magento 1 and 2)
Writing Testable Code (for Magento 1 and 2)vinaikopp
 
Writing testable Code (MageTitans Mini 2016)
Writing testable Code (MageTitans Mini 2016)Writing testable Code (MageTitans Mini 2016)
Writing testable Code (MageTitans Mini 2016)vinaikopp
 
Getting your Hands Dirty Testing Magento 2 (at London Meetup)
Getting your Hands Dirty Testing Magento 2 (at London Meetup)Getting your Hands Dirty Testing Magento 2 (at London Meetup)
Getting your Hands Dirty Testing Magento 2 (at London Meetup)vinaikopp
 
Getting your hands dirty testing Magento 2 (at MageTitansIT)
Getting your hands dirty testing Magento 2 (at MageTitansIT)Getting your hands dirty testing Magento 2 (at MageTitansIT)
Getting your hands dirty testing Magento 2 (at MageTitansIT)vinaikopp
 
Architecture in-the-small-slides
Architecture in-the-small-slidesArchitecture in-the-small-slides
Architecture in-the-small-slidesvinaikopp
 
Modern Module Architecture
Modern Module ArchitectureModern Module Architecture
Modern Module Architecturevinaikopp
 
The beautiful Magento module - MageTitans 2014
The beautiful Magento module - MageTitans 2014The beautiful Magento module - MageTitans 2014
The beautiful Magento module - MageTitans 2014vinaikopp
 

More from vinaikopp (14)

Magento 2 TDD Code Kata
Magento 2 TDD Code KataMagento 2 TDD Code Kata
Magento 2 TDD Code Kata
 
Magento 2 TDD Code Kata Intro
Magento 2 TDD Code Kata IntroMagento 2 TDD Code Kata Intro
Magento 2 TDD Code Kata Intro
 
Testing Magento 2
Testing Magento 2Testing Magento 2
Testing Magento 2
 
ClojureScript in Magento 2 - MageTitansMCR 2017
ClojureScript in Magento 2 - MageTitansMCR 2017ClojureScript in Magento 2 - MageTitansMCR 2017
ClojureScript in Magento 2 - MageTitansMCR 2017
 
Lizards & Pumpkins Catalog Replacement at mm17de
Lizards & Pumpkins Catalog Replacement at mm17deLizards & Pumpkins Catalog Replacement at mm17de
Lizards & Pumpkins Catalog Replacement at mm17de
 
Stories from the other side
Stories from the other sideStories from the other side
Stories from the other side
 
Writing Testable Code (for Magento 1 and 2) 2016 Romaina
Writing Testable Code (for Magento 1 and 2)  2016 RomainaWriting Testable Code (for Magento 1 and 2)  2016 Romaina
Writing Testable Code (for Magento 1 and 2) 2016 Romaina
 
Writing Testable Code (for Magento 1 and 2)
Writing Testable Code (for Magento 1 and 2)Writing Testable Code (for Magento 1 and 2)
Writing Testable Code (for Magento 1 and 2)
 
Writing testable Code (MageTitans Mini 2016)
Writing testable Code (MageTitans Mini 2016)Writing testable Code (MageTitans Mini 2016)
Writing testable Code (MageTitans Mini 2016)
 
Getting your Hands Dirty Testing Magento 2 (at London Meetup)
Getting your Hands Dirty Testing Magento 2 (at London Meetup)Getting your Hands Dirty Testing Magento 2 (at London Meetup)
Getting your Hands Dirty Testing Magento 2 (at London Meetup)
 
Getting your hands dirty testing Magento 2 (at MageTitansIT)
Getting your hands dirty testing Magento 2 (at MageTitansIT)Getting your hands dirty testing Magento 2 (at MageTitansIT)
Getting your hands dirty testing Magento 2 (at MageTitansIT)
 
Architecture in-the-small-slides
Architecture in-the-small-slidesArchitecture in-the-small-slides
Architecture in-the-small-slides
 
Modern Module Architecture
Modern Module ArchitectureModern Module Architecture
Modern Module Architecture
 
The beautiful Magento module - MageTitans 2014
The beautiful Magento module - MageTitans 2014The beautiful Magento module - MageTitans 2014
The beautiful Magento module - MageTitans 2014
 

Recently uploaded

Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Cizo Technology Services
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...confluent
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalLionel Briand
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsSafe Software
 
Software Coding for software engineering
Software Coding for software engineeringSoftware Coding for software engineering
Software Coding for software engineeringssuserb3a23b
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commercemanigoyal112
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfkalichargn70th171
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmSujith Sukumaran
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 

Recently uploaded (20)

Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive Goal
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data Streams
 
Software Coding for software engineering
Software Coding for software engineeringSoftware Coding for software engineering
Software Coding for software engineering
 
Advantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your BusinessAdvantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your Business
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commerce
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalm
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
Odoo Development Company in India | Devintelle Consulting Service
Odoo Development Company in India | Devintelle Consulting ServiceOdoo Development Company in India | Devintelle Consulting Service
Odoo Development Company in India | Devintelle Consulting Service
 

Property Based Testing of Multi-Source Inventory Systems