SlideShare ist ein Scribd-Unternehmen logo
1 von 88
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Mehr von 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
 

Mehr von 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
 

Kürzlich hochgeladen

Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionOnePlan Solutions
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplatePresentation.STUDIO
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is insideshinachiaurasa2
 
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburgmasabamasaba
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech studentsHimanshiGarg82
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesVictorSzoltysek
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park masabamasaba
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfVishalKumarJha10
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfproinshot.com
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...Nitya salvi
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...masabamasaba
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrainmasabamasaba
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 

Kürzlich hochgeladen (20)

Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 

Property based testing - MageTestFest 2019