1. Sven Günther – it-agile GmbH
iOS-Entwicklung –
der agile Weg
2. Softwareentwickler seit 1997
Objective-C seit 2007
iOS Entwicklung seit 2009
Entwickler und Coach für agile Softwareentwicklung bei it-agile
Twitter: @iNevs
3.
4. Als Nutzer möchte ich eine Suche
nach einem Fahrzeug ausführen
und als Ergebnis die Anzahl der
Treffer sehen, um zu prüfen, ob
die Suche weiter eingeschränkt
werden kann.
5. Als Nutzer möchte ich eine Suche
nach einem Fahrzeug ausführen
und als Ergebnis die Anzahl der
Treffer sehen, um zu prüfen, ob
die Suche weiter eingeschränkt
werden kann.
Walking Skeleton
21. Testgetriebene Entwicklung - TDD
neue Funktionalität wird durch Test beschrieben
Test
Green
Funktionalität wird
implementiert
22. Testgetriebene Entwicklung - TDD
neue Funktionalität wird durch Test beschrieben
Test
Funktionalität wird
Code wird Refactor Green
implementiert
aufgeräumt
24. Unit Tests
it
SenT estingK
OCUnit / pple.co
m)
per.a
(develo
25. Unit Tests
it
SenT estingK (gith G
ub.co HUnit
OCUnit / pple.co
m) m/ga
per.a briel/
(develo gh-u
nit )
26. Unit Tests
it
SenT estingK (gith G
ub.co HUnit
OCUnit / pple.co
m) m/ga
per.a briel/
(develo gh-u
nit )
GTMTest
(code.google.com)
27. Unit Tests
it
SenT estingK (gith G
ub.co HUnit
OCUnit / pple.co
m) m/ga
per.a briel/
(develo gh-u
nit )
GTMTest
(code.google.com)
Treiben Dein Design während der Entwicklung
Geben Dir ein Sicherheitsnetz für Änderungen
Beugen Regression vor
Erlauben Refactorings
28. Testen im iOS-SDK
Logic-Tests
Testen einzelne Funktionalität
isoliert von anderen
NIB-Files werden nicht
instantiiert
ViewController werden nicht
vollständig initialisiert
CoreData (ManagedObjects)
nicht testbar
29. Testen im iOS-SDK
Logic-Tests Application-Tests
Testen einzelne Funktionalität Tests laufen gegen die
isoliert von anderen gesamte App
NIB-Files werden nicht App wird zur Laufzeit gegen
instantiiert das TestBundle gelinkt
ViewController werden nicht Tests laufen nur auf dem
vollständig initialisiert Device
CoreData (ManagedObjects) für Unit-Tests nicht geeignet
nicht testbar
33. Mocking
OCMock
(ocmock.org)
Stellvertreterobjekte in Tests
dienen als Stellvertreter für reale Objekte
sind essentiell zum Entkoppeln von Abhängigkeiten
Simulieren Interaktionen mit anderen Objekten (z.B. Netzwerk)
Mocks = Stellvertreter die erwartetes Verhalten überprüfen
Stubs = Stellvertreter mit einem definierten Ein- / Ausgabeverhalten
34. Beispiel
#import <SenTestingKit/SenTestingKit.h>
#import <UIKit/UIKit.h>
#import <OCMock/OCMock.h>
@interface SmokeTest : SenTestCase
@end
@implementation SmokeTest
-(void) testThatUsesMocks {
! id mock = [OCMockObject mockForClass:[NSString class]];
! [[[mock stub] andReturn:@"i am a mock"] lowercaseString];
!
! STAssertEqualObjects(@"i am a mock", [mock lowercaseString], nil);
}
@end
39. Automatische Akzeptanztests
tion
UI A utoma KIF
Apple m) (githu
per.apple.co b.c om/sq
(develo uare /KIF)
Frank
(github.com/moredip/Frank)
40. Automatische Akzeptanztests
tion
UI A utoma KIF
Apple m) (githu
per.apple.co b.c om/sq
(develo uare /KIF)
Frank
(github.com/moredip/Frank)
Testen die fachliche Funktionalität der App
Treiben die fachliche Weiterentwicklung
Akzeptanzkriterien werden durch ProductOwner beschrieben
Tests bilden die Akzeptanzkriterien ab
41. Frank
App wird um HTTP-Server erweitert
Abb. (c) github.com/moredip/Frank
42. Frank
App wird um HTTP-Server erweitert
Über FrankDriver wird die UI angesteuert
Abb. (c) github.com/moredip/Frank
43. Frank
App wird um HTTP-Server erweitert
Über FrankDriver wird die UI angesteuert
Testscripte werden mit cucumber geschrieben
Abb. (c) github.com/moredip/Frank
44. Frank
App wird um HTTP-Server erweitert
Über FrankDriver wird die UI angesteuert
Testscripte werden mit cucumber geschrieben
Tests laufen gegen die App im Simulator
Abb. (c) github.com/moredip/Frank
45. Frank
App wird um HTTP-Server erweitert
Über FrankDriver wird die UI angesteuert
Testscripte werden mit cucumber geschrieben
Tests laufen gegen die App im Simulator
Abb. (c) github.com/moredip/Frank
Views mit Accessibility-Label werden erkannt
47. Cucumber
http://cukes.info/
BDD: Behaviour Driven Development
Verhalten beschreiben im Plain Text
Step Definition in Ruby schreiben
Ausführen und sehen dass es fehlschlägt
Code schreiben um Test zum Erfolg zu bringen
Test erneut ausführen
Wiederholen
48. Cucumber
http://cukes.info/
BDD: Behaviour Driven Development
Verhalten beschreiben im Plain Text
Step Definition in Ruby schreiben
Ausführen und sehen dass es fehlschlägt
Code schreiben um Test zum Erfolg zu bringen
Test erneut ausführen
Wiederholen
kommt urspünglich aus Webentwicklung
49. Cucumber
http://cukes.info/
BDD: Behaviour Driven Development
Verhalten beschreiben im Plain Text
Step Definition in Ruby schreiben
Ausführen und sehen dass es fehlschlägt
Code schreiben um Test zum Erfolg zu bringen
Test erneut ausführen
Wiederholen
kommt urspünglich aus Webentwicklung
Viele Portierungen u.a. für Java, .Net, ...
52. Integrations-Server
Continuous Integration
Frühes Feedback und weniger Risiko durch ständige Integration
Vermeidet Big-Bang-Integration
Potentiell auslieferbare Software zu jeder Zeit
Build läuft immer auf dem letzten Stand im SourceCodeRepository
Mac Mini (c) www.apple.com
Jenkins-Logo (c) www.jenkins-ci.org
53. Integrations-Server
Continuous Integration
Frühes Feedback und weniger Risiko durch ständige Integration
Vermeidet Big-Bang-Integration
Potentiell auslieferbare Software zu jeder Zeit
Build läuft immer auf dem letzten Stand im SourceCodeRepository
Mac Mini (c) www.apple.com
Jenkins-Logo (c) www.jenkins-ci.org
54. Integrations-Server
Continuous Integration
Frühes Feedback und weniger Risiko durch ständige Integration
Vermeidet Big-Bang-Integration
Potentiell auslieferbare Software zu jeder Zeit
Build läuft immer auf dem letzten Stand im SourceCodeRepository
Mac Mini (c) www.apple.com
Jenkins-Logo (c) www.jenkins-ci.org
55. Xcode auf der Console
xcodebuild
xcodebuild -target "myapp" -configuration "debug" build
58. Jenkins
www.jenkins-ci.org
führt Jobs aus und zeigt Zustand der Jobs an
Java-Webanwendung
Configuration
pollt git-Repository auf Änderungen (alle 5 min)
bei Änderungen wird aktueller Stand geladen
führt make aus (compile, test, deploy)
59. Jenkins
www.jenkins-ci.org
führt Jobs aus und zeigt Zustand der Jobs an
Java-Webanwendung
Configuration
pollt git-Repository auf Änderungen (alle 5 min)
bei Änderungen wird aktueller Stand geladen
führt make aus (compile, test, deploy)
Wichtig
➡ Parallelität der Build-Queue auf 1 setzen
60.
61. One Click Deployments
manuelle Buildschritte vermeiden
leicht installierbare Version erzeugen
Over the Air Deployment
Betabuilder (http://www.hanchorllc.com/2010/08/24/introducing-ios-beta-builder/)
Testflight (http://testflightapp.com/)
67. Betabuilder
Ruby-Gem von Luke Redpath
https://github.com/lukeredpath/betabuilder
Distribution-Zertifikate müssen auf CI-Server verfügbar sein
68. Betabuilder
Ruby-Gem von Luke Redpath
https://github.com/lukeredpath/betabuilder
Distribution-Zertifikate müssen auf CI-Server verfügbar sein
Gute Möglichkeit Apps für Betatest zu deployen ist TestFlight
https://testflightapp.com/