testing in ios - mobile-warsaw.pl · tdd • test driven ... testing in ios 21 thursday, july 4,...
TRANSCRIPT
![Page 1: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/1.jpg)
Testing in iOSPaweł Dudek
1
Thursday, July 4, 13
![Page 2: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/2.jpg)
Why do we want to write tests?
2
Thursday, July 4, 13
![Page 3: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/3.jpg)
Reasons for testing
• Striving for better software
• Faster development cycles
• Being “confident” about your code
• Leads to better, more modularized codebase
• Less code to write
3
Thursday, July 4, 13
![Page 4: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/4.jpg)
Common misconceptions
4
Thursday, July 4, 13
![Page 5: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/5.jpg)
Common misconceptions
• “It will take longer to write code” or “Time spent writing/refactoring tests is time lost”
• “It will take more time to modify existing system”
5
Thursday, July 4, 13
![Page 6: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/6.jpg)
Reasons for testing
• Striving for better software
• Faster development cycles
• Being “confident” about your code
• Leads to better, more modularized codebase
• Less code to write
6
Thursday, July 4, 13
![Page 7: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/7.jpg)
Am I going to write poor software if I don’t
do tests?
7
Thursday, July 4, 13
![Page 8: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/8.jpg)
Are unit tests an invaluable tool for writing great software? Heck yes. Am I going to produce a poor product if I can’t unit test? Hell no.
Jonathan Rasmusson
8
Thursday, July 4, 13
![Page 9: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/9.jpg)
Now that we know that writing tests is a
good idea...
9
Thursday, July 4, 13
![Page 10: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/10.jpg)
How can we do it?
10
Thursday, July 4, 13
![Page 11: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/11.jpg)
• You will feel confused
• You won’t know how to start
• You will need help
• Conclusion: it’s not easy to start
11
Warning
Thursday, July 4, 13
![Page 12: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/12.jpg)
Tips
• Never think of tests as tests
• Think of a scenario, behavior, example
• Grab a mature project from github with tests included
• Find someone experienced and ask questions
12
Thursday, July 4, 13
![Page 13: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/13.jpg)
Get on with it!How can we test?
13
Thursday, July 4, 13
![Page 14: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/14.jpg)
TDD
• Test Driven Development
• Red, Green, Refactor
• Write failing test first
• Fix it
• Refactor
14
Thursday, July 4, 13
![Page 15: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/15.jpg)
BDDBehavior Driven Development
15
Thursday, July 4, 13
![Page 16: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/16.jpg)
How does BDD differ from TDD?
16
Thursday, July 4, 13
![Page 17: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/17.jpg)
BDD builds upon TDD by formalising the good habits of the best TDD practitioners.
Matt Wynne,XP Evangelist
17
Thursday, July 4, 13
![Page 18: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/18.jpg)
Good habits
18
• Work outside-in
• Use examples
• Use ubiquitous language
Thursday, July 4, 13
![Page 19: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/19.jpg)
A little bit of terminology...
19
Thursday, July 4, 13
![Page 20: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/20.jpg)
Terminology
20
• Mocking (mocks & stubs)
• Expecting
• Matching
• Faking
Thursday, July 4, 13
![Page 21: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/21.jpg)
Testing in iOS
21
Thursday, July 4, 13
![Page 22: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/22.jpg)
Unit Tests
22
Thursday, July 4, 13
![Page 23: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/23.jpg)
OCUnit
23
• Oldest Mac testing framework - officially supported by Apple since 2005
• Integrated with XCode
• Built-in assertion macros
Thursday, July 4, 13
![Page 24: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/24.jpg)
OCUnit Syntax
• All test classes inherit from SenTestCase
• All tests begin with test
• Setup and teardown method
• Everything else is ignored by testing framework
• Means you can use as additional setup methods!
24
Thursday, July 4, 13
![Page 25: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/25.jpg)
-(void)testFullName { Person *person = [Person person]; person.firstName = @"Mariusz"; person.secondName = @"Testowniczek"; NSString *fullName = [person fullName]; NSString *expectedName = @"Mariusz Testowniczek"; STAssertTrue([fullName isEqualToString:expectedName], @"");}
25
OCUnit
Thursday, July 4, 13
![Page 26: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/26.jpg)
Behavior “Tests”
26
Thursday, July 4, 13
![Page 27: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/27.jpg)
Kiwi and Cedar
27
• Nearly the same syntax
• Built-in stubs/mocks
• Built-in matchers
Thursday, July 4, 13
![Page 28: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/28.jpg)
28
SPEC_BEGIN(PersonSpec)
describe(@"Person", ^{ __block Person *person;
beforeEach(^{ person = [[Person alloc] init]; person.firstName = @"Mariusz"; person.lastName = @"Fixture Last Name"; });
describe(@"full name", ^{
__block NSString *fullName;
beforeEach(^{ fullName = [person fullName]; });
it(@"should return the full name", ^{ expect(fullName).to(equal(@"Mariusz Testowniczek")); }); });});
SPEC_END
Kiwi and Cedar Syntax
Thursday, July 4, 13
![Page 29: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/29.jpg)
29
SPEC_BEGIN(PersonSpec)
describe(@"Person", ^{ __block Person *person;
beforeEach(^{ person = [[Person alloc] init]; person.firstName = @"Mariusz"; person.lastName = @"Fixture Last Name"; });
describe(@"full name", ^{
__block NSString *fullName;
beforeEach(^{ fullName = [person fullName]; });
it(@"should return the full name", ^{ expect(fullName).to(equal(@"Mariusz Testowniczek")); }); });});
SPEC_ENDThursday, July 4, 13
![Page 30: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/30.jpg)
Example
30
Thursday, July 4, 13
![Page 31: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/31.jpg)
CedarTaptera Additions
31
Thursday, July 4, 13
![Page 32: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/32.jpg)
The action block
32
Thursday, July 4, 13
![Page 33: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/33.jpg)
The action block
33
• Syntax addition to previous blocks
• Executed after all beforeEach’s for given example are run
• Really useful when chaining behavior tests
Thursday, July 4, 13
![Page 34: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/34.jpg)
34
Describe
Describe
beforeEach
action
Describe
beforeEach
action
beforeEach
action
it
Thursday, July 4, 13
![Page 35: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/35.jpg)
Example
35
Thursday, July 4, 13
![Page 36: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/36.jpg)
Helper libraries
36
Thursday, July 4, 13
![Page 37: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/37.jpg)
Helper libraries
37
• Mocking: OCMock, OCMockito, LRMockey
• Expecting: Expecta
• Matching: OCHamcrest
Thursday, July 4, 13
![Page 38: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/38.jpg)
Most the presented libraries offer similar
functionalityIt all depends on syntax.
38
Thursday, July 4, 13
![Page 39: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/39.jpg)
iOS Testing Tips
39
Thursday, July 4, 13
![Page 40: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/40.jpg)
Testing UI Layout
40
• Hard to maintain (as can change rapidly when GD goes on a rampage)
• Gives little value (quickly noticed by QA if something is off)
Thursday, July 4, 13
![Page 41: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/41.jpg)
System Singletons
41
• Makes hard to test if accessed directly
• Nice candidate for putting in a property
[UIDevice currentDevice][UIScreen mainScreen]
Thursday, July 4, 13
![Page 42: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/42.jpg)
UIViewController transitions
42
• Pushing new view controllers on nav controller stack or using transitions API
• Use helper class
• Tests - check if a given method was called on the helper class
Thursday, July 4, 13
![Page 43: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/43.jpg)
Testing UIView animations
43
• Easiest way is to use the block-based API
• Helper class similar to transitions
• Tests - use fake to immediately call the animation block
Thursday, July 4, 13
![Page 44: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/44.jpg)
Common caveats
44
• Don’t set mocks on [UIViewController view]
• Avoid using categories to override system properties or existing behavior
• Keychain and most of system objects are unavailable when tests are run from command line w/o simulator
• iOS 5.x Simulator is broken for NSProxy subclasses in weak properties
Thursday, July 4, 13
![Page 45: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/45.jpg)
Things worth talking about but cut due to time limitations
45
• Frank / KIF - Application Tests
• Specta - yet another BDD style testing framework
• Dependency injection
Thursday, July 4, 13
![Page 46: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/46.jpg)
Summary
46
Thursday, July 4, 13
![Page 47: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/47.jpg)
Summary
• Testing is a great way to help developers
• Better codebase, faster iterations
• Invaluable for larger projects
47
Thursday, July 4, 13
![Page 48: Testing in iOS - mobile-warsaw.pl · TDD • Test Driven ... Testing in iOS 21 Thursday, July 4, 13. Unit Tests 22 Thursday, July 4, 13. OCUnit 23](https://reader033.vdocument.in/reader033/viewer/2022060600/6053b6506c946527c41e676a/html5/thumbnails/48.jpg)
Resources & Contact
@eldudi
github.com/paweldudek
Code Examples
Contact
48
Thursday, July 4, 13