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

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 iOSKremizas Kostas
 
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 @drpicoxDavid Rodenas
 
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 TestsTomek 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 Sydneyjulien.ponge
 
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 JavaScriptRyan Anklam
 
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 ApplicationsEberhard Wolff
 
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
 
ReactJS for Programmers
ReactJS for ProgrammersReactJS for Programmers
ReactJS for ProgrammersDavid Rodenas
 
Code generation for alternative languages
Code generation for alternative languagesCode generation for alternative languages
Code generation for alternative languagesRafael Winterhalter
 
Unit testing patterns for concurrent code
Unit testing patterns for concurrent codeUnit testing patterns for concurrent code
Unit testing patterns for concurrent codeDror Helper
 
Building unit tests correctly
Building unit tests correctlyBuilding unit tests correctly
Building unit tests correctlyDror Helper
 
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 coreRajesh Shirsagar
 

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

Taking a Test Drive
Taking a Test DriveTaking a Test Drive
Taking a Test DriveGraham Lee
 
iOS Unit Testing
iOS Unit TestingiOS Unit Testing
iOS Unit Testingsgleadow
 
Javascript tdd byandreapaciolla
Javascript tdd byandreapaciollaJavascript tdd byandreapaciolla
Javascript tdd byandreapaciollaAndrea Paciolla
 
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...DroidConTLV
 
Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516SOAT
 
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 2014Fábio Pimentel
 
Java Concurrency, Memory Model, and Trends
Java Concurrency, Memory Model, and TrendsJava Concurrency, Memory Model, and Trends
Java Concurrency, Memory Model, and TrendsCarol McDonald
 
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) Mobivery
 
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 Howsatesgoral
 
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 PracticesOdoo
 
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 MizrahiRan Mizrahi
 
Keep your Wicket application in production
Keep your Wicket application in productionKeep your Wicket application in production
Keep your Wicket application in productionMartijn 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

"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 LoparevCiklum Ukraine
 
"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 LiashenkoCiklum Ukraine
 
Alex Pazhyn: Google_Material_Design
Alex Pazhyn: Google_Material_DesignAlex Pazhyn: Google_Material_Design
Alex Pazhyn: Google_Material_DesignCiklum 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 developersCiklum Ukraine
 
Your 1st Apple watch Application
Your 1st Apple watch ApplicationYour 1st Apple watch Application
Your 1st Apple watch ApplicationCiklum Ukraine
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven DevelopmentCiklum Ukraine
 
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 2015Ciklum Ukraine
 
Developing high load systems using C++
Developing high load systems using C++Developing high load systems using C++
Developing high load systems using C++Ciklum Ukraine
 
Collection view layout
Collection view layoutCollection view layout
Collection view layoutCiklum Ukraine
 
Introduction to auto layout
Introduction to auto layoutIntroduction to auto layout
Introduction to auto layoutCiklum Ukraine
 
Model-View-Controller: Tips&Tricks
Model-View-Controller: Tips&TricksModel-View-Controller: Tips&Tricks
Model-View-Controller: Tips&TricksCiklum 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
 
Михаил Попчук "Cкрытые резервы команд или 1+1=3"
Михаил Попчук "Cкрытые резервы команд или 1+1=3"Михаил Попчук "Cкрытые резервы команд или 1+1=3"
Михаил Попчук "Cкрытые резервы команд или 1+1=3"Ciklum Ukraine
 
"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...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

Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDGMarianaLemus7
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
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
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
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
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
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
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 

Recently uploaded (20)

Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDG
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
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...
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
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
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
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
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 

Unit Testing: Special Cases