SlideShare a Scribd company logo
1 of 79
Download to read offline
Unit Testing
Special Cases
How to Test
UIViewControllers

How to TestUnit Testing
What Is Testing For? 
UIViewControllers

Block-based code

!
How to TestUnit Testing
What Is Testing For? 
UIViewControllers

Block-based code

CoreData	

How to TestUnit Testing
What Is Testing For? 
UIViewController
IBOutlets & IBActions

viewDidLoad

dealloc

UINavigationController
UIViewController
IBOutlets & IBActions
Outlet is connected
- (void)setUp {
[super setUp];
sut = [ConverterViewController new];
}
!
- (void)tearDown {
sut = nil;
[super tearDown];
}
Is Outlet Connected?
- (void)setUp {
[super setUp];
sut = [ConverterViewController new];
}
!
- (void)tearDown {
sut = nil;
[super tearDown];
}
!
- (void)testThatTextFieldOutletIsConnected {
XCTAssertNotNil(sut.textField, @"outlet should be connected");
}
Is Outlet Connected?
- (void)setUp {
[super setUp];
sut = [ConverterViewController new];
}
!
- (void)tearDown {
sut = nil;
[super tearDown];
}
!
- (void)testThatTextFieldOutletIsConnected {
XCTAssertNotNil(sut.textField, @"outlet should be connected");
}
Is Outlet Connected?
- (void)setUp {
[super setUp];
sut = [ConverterViewController new];
}
!
- (void)tearDown {
sut = nil;
[super tearDown];
}
!
- (void)testThatTextFieldOutletIsConnected {
[sut view];
XCTAssertNotNil(sut.textField, @"outlet should be connected");
}
Is Outlet Connected?
IBOutlets & IBActions
Outlet has a right action.
- (void)testButtonActionBinding {
[sut view];
NSArray* acts =
[sut.button actionsForTarget:sut
forControlEvent:UIControlEventTouchUpInside];
XCTAssert([acts containsObject:@"onButton:"], @"should use
correct action");
}
Is Action Connected?
IBOutlets & IBActions
The action does the right things.
viewDidLoad
Unit testing of a view controller
nearly always means writing the
view controller methods differently
viewDidLoad
- should call helper methods
viewDidLoad
- should call helper methods

- each of the helper methods should
do just one thing (SOLID principles)
viewDidLoad
- should call helper methods

- each of the helper methods should
do just one thing (SOLID principles)

- write tests for each of the helper
methods
viewDidLoad
- should call helper methods

- each of the helper methods should
do just one thing (SOLID principles)

- write tests for each of the helper
methods

- test viewDidLoad calls helper
methods (partial mock)
dealloc
setUp tearDown zombie
dealloc
❓hook dealloc method of SUT when
setup
dealloc
❓hook dealloc method of SUT when
setup

❓record calling of the hook
dealloc
❓hook dealloc method of SUT when
setup

❓record calling of the hook

❓verify if hook is called after teardown
Aspects
/// Adds a block of code before/instead/after the current
`selector` for a specific instance.
- (id<AspectToken>)aspect_hookSelector:(SEL)selector
withOptions:(AspectOptions)options
usingBlock:(id)block
error:(NSError **)error;
!
/// Called after the original implementation (default)
AspectPositionAfter,
!
/// Will replace the original implementation.
AspectPositionInstead,
!
/// Called before the original implementation.
AspectPositionBefore,
Aspects
dealloc
✅ hook dealloc method of SUT when
setup 

❓ record calling of the hook

❓ verify if hook is called after teardown
Aspects
dealloc
✅ hook dealloc method of SUT when
setup 

✅ record calling of the hook

❓ verify if hook is called after teardown
Aspects
instance var
dealloc
✅ hook dealloc method of SUT when
setup 

✅ record calling of the hook

✅ verify if hook is called after teardown
Aspects
instance var
XCTAssert
@interface ConverterViewControllerTests : XCTestCase {
ConverterViewController* sut;
BOOL _sutDeallocated;
}
@end
!
- (void)setUp {
[super setUp];
sut = [ConverterViewController new];
_sutDeallocated = NO;
[sut aspect_hookSelector:NSSelectorFromString(@"dealloc")
withOptions:AspectPositionBefore
usingBlock:^(id<AspectInfo> aspectInfo){
_sutDeallocated = YES;
} error:nil];
}
!
- (void)tearDown {
sut = nil;
XCTAssertTrue(_sutDeallocated, @"SUT is not deallocated");
[super tearDown];
}
dealloc
@interface
}
@end
!
- (
[
!
!
!
!
!
}
!
- (
[
}
dealloc
!
!
!
!
!
!
!
!
!
!
[sut aspect_hookSelector:NSSelectorFromString(@"dealloc")
withOptions:AspectPositionBefore
usingBlock:^(id<AspectInfo> aspectInfo){
_sutDeallocated = YES;
} error:nil];
UINavigationController
- test push view controller

- test pop view controller
UINavigationController
UINavigationController
But
UINavigationController
But
@interface UIViewController (UINavigationControllerItem)
!
@property(nonatomic,readonly,retain) UINavigationController*
navigationController;
!
@end
-(void)testTappingDetailsShouldDisplayDetails {
UINavigationController *nav = [[UINavigationController alloc]
initWithRootViewController:sut];
id mockNav = [OCMockObject partialMockForObject:nav];
[[mockNav expect] pushViewController:[OCMArg any]
animated:YES];
[sut onShowDetailsButton:nil];
[mockNav verify];
}
UINavigationController
Choosing not to test view controllers
is the decision not to test most of
your code.
UIViewController
Testing simple things is simple, and
testing complex things is complex
UIViewController
Block-based code
Why does test fail?
Block-based code
!
typedef void(^CompletionHandler)(NSArray * result);
!
- (void)runAsyncCode:(CompletionHandler)completion {
dispatch_async(dispatch_get_main_queue(), ^{
completion(nil);
});
}
- (void)testRunAsyncCode {
// arrange
__block BOOL hasCalledBack = NO;
!
// act
[sut runAsyncCode:^(NSArray *result) {
hasCalledBack = YES;
}];
// assert
XCTAssert(hasCalledBack, @"Test timed out");
}
Block-based code
- (void)testRunAsyncCode {
// arrange
__block BOOL hasCalledBack = NO;
!
// act
[sut runAsyncCode:^(NSArray *result) {
hasCalledBack = YES;
}];
// assert
XCTAssert(hasCalledBack, @"Test timed out");
}
Block-based code
- (void)testRunAsyncCode {
// arrange
__block BOOL hasCalledBack = NO;
!
// act
[sut runAsyncCode:^(NSArray *result) {
hasCalledBack = YES;
}];
// assert
XCTAssert(hasCalledBack, @"Test timed out");
}
Block-based code
- (void)testRunAsyncCode {
// arrange
__block BOOL hasCalledBack = NO;
!
// act
[sut runAsyncCode:^(NSArray *result) {
hasCalledBack = YES;
}];
// assert
XCTAssert(hasCalledBack, @"Test timed out");
}
Block-based code
- (void)testRunAsyncCode {
// arrange
__block BOOL hasCalledBack = NO;
!
// act
[sut runAsyncCode:^(NSArray *result) {
hasCalledBack = YES;
}];
// assert
XCTAssert(hasCalledBack, @"Test timed out");
}
Block-based code
- (void)testRunAsyncCode {
// arrange
__block BOOL hasCalledBack = NO;
!
// act
[sut runAsyncCode:^(NSArray *result) {
hasCalledBack = YES;
}];
// assert
XCTAssert(hasCalledBack, @"Test timed out");
}
Block-based code
Block-based code
What can we do?
Block-based code
- (void)testRunAsyncCode {
// arrange
__block BOOL hasCalledBack = NO;
!
// act
[sut runAsyncCode:^(NSArray *result) {
hasCalledBack = YES;
}];
// assert
XCTAssert(hasCalledBack, @"Test timed out");
}
Block-based code
- (void)testRunAsyncCode {
// arrange
__block BOOL hasCalledBack = NO;
!
// act
[sut runAsyncCode:^(NSArray *result) {
hasCalledBack = YES;
}];
// assert
!
!
!
!
!
XCTAssert(hasCalledBack, @"Test timed out");
}
Block-based code
- (void)testRunAsyncCode {
// arrange
__block BOOL hasCalledBack = NO;
!
// act
[sut runAsyncCode:^(NSArray *result) {
hasCalledBack = YES;
}];
// assert
NSDate *timeout = [NSDate dateWithTimeIntervalSinceNow:0.1];
while([timeout timeIntervalSinceNow] > 0 && hasCalledBack == NO) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:timeout];
}
XCTAssert(hasCalledBack, @"Test timed out");
}
Block-based code
- (void)testRunAsyncCode {
// arrange
__block BOOL hasCalledBack = NO;
!
// act
[sut runAsyncCode:^(NSArray *result) {
hasCalledBack = YES;
}];
// assert
NSDate *timeout = [NSDate dateWithTimeIntervalSinceNow:0.1];
while([timeout timeIntervalSinceNow] > 0 && hasCalledBack == NO) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:timeout];
}
XCTAssert(hasCalledBack, @"Test timed out");
}
Block-based code
Block-based code
Also we can use:
- (void)verifyWithDelay:(NSTimeInterval)delay
{
NSTimeInterval step = 0.01;
while(delay > 0)
{
if([expectations count] == 0)
break;
NSDate* until = [NSDate dateWithTimeIntervalSinceNow:step];
[[NSRunLoop currentRunLoop] runUntilDate:until];
delay -= step;
step *= 2;
}
[self verify];
}
OCMock
CoreData
CoreData
As long as you don't put business
logic in your models, you don't have
to test them.
CoreData
creates setters & getters in run-time
CoreData
creates setters & getters in run-time
we can’t mock CoreData models
CoreData
What can we do?
CoreData
- create protocol that has all model’s
properties defined
CoreData
- create protocol that has all model’s
properties defined

- conform NSManagedObject to the
protocol
CoreData
- create protocol that has all model’s
properties defined

- conform NSManagedObject to the
protocol

- create NSObject model just for
testing, conforms to the protocol
and @synthesize properties
CoreData
Protocol
Model<Protocol> TestModel<Protocol>
CoreData
Protocol
Model<Protocol> TestModel<Protocol>
CoreData
Have a better solution?
CoreData
Create own CoreData stack for each
test-case
- (void)setUp
{
[super setUp];
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"SimpleInvoice"
withExtension:@“momd"];
!
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc]
initWithContentsOfURL:modelURL];
!
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:mom];
!
XCTAssertNotNil([psc addPersistentStoreWithType:NSInMemoryStoreType
configuration:nil
URL:nil
options:nil
error:NULL], @"Should be able to
add in-memory store”);
!
_moc = [[NSManagedObjectContext alloc] init];
_moc.persistentStoreCoordinator = psc;
}
CoreData
- (void
{
[
!
initWithContentsOfURL
!
initWithManagedObjectModel
!
!
!
!
!
!
!
!
}
CoreData
- (void)setUp
{
!
!
!
!
!
!
!
!
!
!
XCTAssertNotNil([psc addPersistentStoreWithType:NSInMemoryStoreType
configuration:nil
URL:nil
options:nil
error:NULL], @"Should be able to
add in-memory store”);
!
!
!
}
CoreData
Advantages?
CoreData
Advantages?
- no additional classes
CoreData
Advantages?
- no additional classes

- no dependence on external state
CoreData
Advantages?
- no additional classes

- no dependence on external state

- close approximation to the
application environment
CoreData
Advantages?
- no additional classes

- no dependence on external state

- close approximation to the
application environment

- we are able to create base test
class with a stack and subclass it
where we need
CoreData
Advantages?
- no additional classes

- no dependence on external state

- close approximation to the
application environment

- we are able to create base test
class with a stack and subclass it
where we need
- (void)testFullNameReturnsСorrectString {
Person* ps;
ps = [NSEntityDescription insertNewObjectForEntityForName:@"Person"
inManagedObjectContext:_moc];
ps.firstName = @"Tom";
ps.lastName = @“Lol";
!
STAssertTrue([[ps fullName] isEqualToString:@"Lol Tom"],
@"should have matched full name");
}
CoreData
CoreData
- test model’s additional business-logic

- test ManagedObjectModel for an
entity

- create and use models as a mocks
✅ UIViewControllers

✅ Block-based code

✅ CoreData	

How to Test
Video is coming!
https://github.com/maksum
!
maksum.ko
contact me:
Sources
http://www.amazon.com/Test-Driven-iOS-Development-Developers-Library/dp/
0321774183
!
http://www.objc.io/issue-1/testing-view-controllers.html
http://www.silverbaytech.com/2013/02/25/ios-testing-part-3-testing-view-controller/
http://iosunittesting.com/unit-testing-view-controllers/
http://blog.carbonfive.com/2010/03/10/testing-view-controllers/
!
http://iosunittesting.com/how-to-unit-test-completion-blocks/
!
http://iosunittesting.com/unit-testing-core-data/
http://ashfurrow.com/blog/unit-testing-with-core-data-models
http://www.sicpers.info/2010/06/template-class-for-unit-testing-core-data-entities/
http://iamleeg.blogspot.com/2010/01/unit-testing-core-data-driven-apps-fit.html
Unit Testing: Special Cases

More Related Content

What's hot

33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests
Tomek Kaczanowski
 
Software Testing - Invited Lecture at UNSW Sydney
Software Testing - Invited Lecture at UNSW SydneySoftware Testing - Invited Lecture at UNSW Sydney
Software Testing - Invited Lecture at UNSW Sydney
julien.ponge
 
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
julien.ponge
 

What's hot (20)

Rx java testing patterns
Rx java testing patternsRx java testing patterns
Rx java testing patterns
 
Testing the waters of iOS
Testing the waters of iOSTesting the waters of iOS
Testing the waters of iOS
 
Introduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicoxIntroduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicox
 
33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests
 
Software Testing - Invited Lecture at UNSW Sydney
Software Testing - Invited Lecture at UNSW SydneySoftware Testing - Invited Lecture at UNSW Sydney
Software Testing - Invited Lecture at UNSW Sydney
 
Stop Making Excuses and Start Testing Your JavaScript
Stop Making Excuses and Start Testing Your JavaScriptStop Making Excuses and Start Testing Your JavaScript
Stop Making Excuses and Start Testing Your JavaScript
 
10 Typical Problems in Enterprise Java Applications
10 Typical Problems in Enterprise Java Applications10 Typical Problems in Enterprise Java Applications
10 Typical Problems in Enterprise Java Applications
 
Introduzione al TDD
Introduzione al TDDIntroduzione al TDD
Introduzione al TDD
 
Qunit Java script Un
Qunit Java script UnQunit Java script Un
Qunit Java script Un
 
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
 
Java 7 LavaJUG
Java 7 LavaJUGJava 7 LavaJUG
Java 7 LavaJUG
 
ReactJS for Programmers
ReactJS for ProgrammersReactJS for Programmers
ReactJS for Programmers
 
Code generation for alternative languages
Code generation for alternative languagesCode generation for alternative languages
Code generation for alternative languages
 
Unit testing patterns for concurrent code
Unit testing patterns for concurrent codeUnit testing patterns for concurrent code
Unit testing patterns for concurrent code
 
Building unit tests correctly
Building unit tests correctlyBuilding unit tests correctly
Building unit tests correctly
 
Tdd iPhone For Dummies
Tdd iPhone For DummiesTdd iPhone For Dummies
Tdd iPhone For Dummies
 
Agile Android
Agile AndroidAgile Android
Agile Android
 
Agile Swift
Agile SwiftAgile Swift
Agile Swift
 
Testing logging in asp dot net core
Testing logging in asp dot net coreTesting logging in asp dot net core
Testing logging in asp dot net core
 
Migrating to JUnit 5
Migrating to JUnit 5Migrating to JUnit 5
Migrating to JUnit 5
 

Similar to Unit Testing: Special Cases

Fault tolerance made easy
Fault tolerance made easyFault tolerance made easy
Fault tolerance made easy
Uwe Friedrichsen
 
Keep your Wicket application in production
Keep your Wicket application in productionKeep your Wicket application in production
Keep your Wicket application in production
Martijn Dashorst
 

Similar to Unit Testing: Special Cases (20)

Taking a Test Drive
Taking a Test DriveTaking a Test Drive
Taking a Test Drive
 
iOS Unit Testing
iOS Unit TestingiOS Unit Testing
iOS Unit Testing
 
Unit testing on mobile apps
Unit testing on mobile appsUnit testing on mobile apps
Unit testing on mobile apps
 
Javascript tdd byandreapaciolla
Javascript tdd byandreapaciollaJavascript tdd byandreapaciolla
Javascript tdd byandreapaciolla
 
Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...
Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...
Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...
 
Testing (eng)
Testing (eng)Testing (eng)
Testing (eng)
 
Fault tolerance made easy
Fault tolerance made easyFault tolerance made easy
Fault tolerance made easy
 
Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516
 
2013-01-10 iOS testing
2013-01-10 iOS testing2013-01-10 iOS testing
2013-01-10 iOS testing
 
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
 
Live Updating Swift Code
Live Updating Swift CodeLive Updating Swift Code
Live Updating Swift Code
 
Java Concurrency, Memory Model, and Trends
Java Concurrency, Memory Model, and TrendsJava Concurrency, Memory Model, and Trends
Java Concurrency, Memory Model, and Trends
 
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Formacion en movilidad: Conceptos de desarrollo en iOS (IV) Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
 
Unit Testing - The Whys, Whens and Hows
Unit Testing - The Whys, Whens and HowsUnit Testing - The Whys, Whens and Hows
Unit Testing - The Whys, Whens and Hows
 
Odoo's Test Framework - Learn Best Practices
Odoo's Test Framework - Learn Best PracticesOdoo's Test Framework - Learn Best Practices
Odoo's Test Framework - Learn Best Practices
 
iOS testing
iOS testingiOS testing
iOS testing
 
Java Concurrency
Java ConcurrencyJava Concurrency
Java Concurrency
 
How Testability Inspires AngularJS Design / Ran Mizrahi
How Testability Inspires AngularJS Design / Ran MizrahiHow Testability Inspires AngularJS Design / Ran Mizrahi
How Testability Inspires AngularJS Design / Ran Mizrahi
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
Keep your Wicket application in production
Keep your Wicket application in productionKeep your Wicket application in production
Keep your Wicket application in production
 

More from Ciklum Ukraine

Introduction to amazon web services for developers
Introduction to amazon web services for developersIntroduction to amazon web services for developers
Introduction to amazon web services for developers
Ciklum Ukraine
 
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
Ciklum Ukraine
 

More from Ciklum Ukraine (20)

"How keep normal blood pressure using TDD" By Roman Loparev
"How keep normal blood pressure using TDD" By Roman Loparev"How keep normal blood pressure using TDD" By Roman Loparev
"How keep normal blood pressure using TDD" By Roman Loparev
 
"Through the three circles of the it hell" by Roman Liashenko
"Through the three circles of the it hell" by Roman Liashenko"Through the three circles of the it hell" by Roman Liashenko
"Through the three circles of the it hell" by Roman Liashenko
 
Alex Pazhyn: Google_Material_Design
Alex Pazhyn: Google_Material_DesignAlex Pazhyn: Google_Material_Design
Alex Pazhyn: Google_Material_Design
 
Introduction to amazon web services for developers
Introduction to amazon web services for developersIntroduction to amazon web services for developers
Introduction to amazon web services for developers
 
Your 1st Apple watch Application
Your 1st Apple watch ApplicationYour 1st Apple watch Application
Your 1st Apple watch Application
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
Back to the future: ux trends 2015
Back to the future: ux trends 2015Back to the future: ux trends 2015
Back to the future: ux trends 2015
 
Developing high load systems using C++
Developing high load systems using C++Developing high load systems using C++
Developing high load systems using C++
 
Collection view layout
Collection view layoutCollection view layout
Collection view layout
 
Introduction to auto layout
Introduction to auto layoutIntroduction to auto layout
Introduction to auto layout
 
Groovy on Android
Groovy on AndroidGroovy on Android
Groovy on Android
 
Material design
Material designMaterial design
Material design
 
Kanban development
Kanban developmentKanban development
Kanban development
 
Mobile sketching
Mobile sketching Mobile sketching
Mobile sketching
 
More UX in our life
More UX in our lifeMore UX in our life
More UX in our life
 
Model-View-Controller: Tips&Tricks
Model-View-Controller: Tips&TricksModel-View-Controller: Tips&Tricks
Model-View-Controller: Tips&Tricks
 
Unit Tesing in iOS
Unit Tesing in iOSUnit Tesing in iOS
Unit Tesing in iOS
 
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
 
Михаил Попчук "Cкрытые резервы команд или 1+1=3"
Михаил Попчук "Cкрытые резервы команд или 1+1=3"Михаил Попчук "Cкрытые резервы команд или 1+1=3"
Михаил Попчук "Cкрытые резервы команд или 1+1=3"
 
"To be, rather than to seem” interview with Ciklum VP of HR Marina Vyshegorod...
"To be, rather than to seem” interview with Ciklum VP of HR Marina Vyshegorod..."To be, rather than to seem” interview with Ciklum VP of HR Marina Vyshegorod...
"To be, rather than to seem” interview with Ciklum VP of HR Marina Vyshegorod...
 

Recently uploaded

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
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
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
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
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 

Unit Testing: Special Cases