SlideShare une entreprise Scribd logo
1  sur  18
XCode & Les Tests
ou
Des Tests au Code
Ekito - Cocoahead
Epitez - JF Marronnier
Sommaire
XCode 5 & XCTest
Nouvelle interface mettant en évidence les tests
 ajout d’un navigateur de tests (Copie d’écran ci
dessous)
o Contrôle d’exécution
o Visualise résultat de test
• Nouveau « framework » XCTest
• Les projets sont créés systématiquement avec une « cible »
test
Interface de Tests
•

Résultat global

Cas Test

Navigateur de
Cas Tests « Ko »
• Résultats
• Exécution
Tests : Pourquoi tester ?
• Trouver les erreurs de codage
• Vérifier que l’intégration du système
• Vérifier l’adéquation Spécification vs Logiciel
• Eviter/Détecter les régressions
Tests : On teste du code
Le tests s’exécutent sur du code existant,
n’est-ce pas ?
Mais :
•Imaginerons nous en tests ce qu’il n’a pas vu lors du codage ?
•Les bugs seront détectés tardivement (après le codage)
•En fin de projet, les budgets sont très limités ceci augment le risque
sur les tests et la correction des bugs détectés.
•Les tests sont liés au code et peut aux besoins utilisateur
Tests : TDD c’est quoi ?
C’est pourquoi que le TDD a été imaginé.
L’idée est décrire le tests avant le code. Le code
ne réponds qu’aux tests écris.
Ainsi :
•Le code ne répond qu’aux besoins exprimés ;
•Les erreurs sont détectés immédiatement ;
•Les tests sont automatiques
• Exécutable en permanence
• Permet de détecter les régressions ?
•…
Tests : TDD c’est quoi ?
Le cycle de travail est :
1.Écrire un tests qui est
2.Écrire le code minimal qui rend le
3.Récrire le code pour l’améliorer (« refactoring »)

Ecrire test
[Test Ko]

"Refactore"

Coder

[Test O k]

[test O k]

Test Ko
Test Ok
Test Ok
Tests : Règles de l’Oncle Bob
Ne pas oublier les règle de l’oncle Bob (Robert Martin)
•Vous n'êtes pas autorisé à écrire de code de production,
sauf si c'est pour faire une passe de test unitaire défaut.
•Vous n'êtes pas autorisé à écrire plus d'un test unitaire que
ce qui est suffisant pour faire faillite, et des erreurs de
compilation sont des échecs.
•Vous n'êtes pas autorisé à écrire de plus le code de
production que ce qui est suffisant pour passer d'une faute
de test unitaire.
TDD avec IOs : le MVC
Vue

Action
Utilisateur

Modifie

Notifie

Contrôleur

Modifie

Modèle
Tester un Modèle
Contrôleur -> Modèle

Model -> Controller

Le contrôleur accède directement à la classe
modèle.

Le modèle ne connais pas le contrôleur.
Il communique avec ses «   clients   » le
mécanisme de diffusion
NSNotificationCenter.

a. Le testeur instancie un objet « modèle » ;
b. Il le stimule ;
c. Il valide directement les données de cette objet.

a. Le testeur instancie un objet model ; s’abonne,
comme le contrôleur, au centre de notification du
model ;
b. Il stimule directement l’objet modèle ;
c. Il valide alors les notifications reçues.
TDD avec les Vues
Éléments du Storyboard
A partir de la class UIStoryBoard il est possible de charger un «  storyBoard  » à
partir de son nom.
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

Du storyBoard on peut récupérer le contrôleur associé.

// Pour récupérer le controller initial
monViewController * viewController = [storyboard instantiateInitialViewController];
//(ou) pour récupérer un controller par son nom
monViewController * viewController = [storyboard instantiateViewControllerWithIdentifier:@"controllerName"];
Tester composants vue
Pour respecter le TDD
a.Rédiger le test (composant non « nil »)
Définir le « IBOutlet » dans le contrôleur
 le test est Ko
b.Définir le composant dans la vue
Le relier avec le « IBOutlet » dans le contrôleur
 le test est Ok
Attributs composants
Noter que les attributs graphiques des
composants peuvent être défini avec le TDD (si
ceux-ci sont important pour le client).
Par exemple, le texte d’un label doit être verte:

a.XCTAssertEqualObjects([[viewController labelXX] textColor], [UIColor redColor], @"Bad label color")
b.Définir la couleur dans le storyBoard
TDD avec le contrôleur
Noter que l’objectif est de tester le contrôleur
« seul ». L’objectif n’est pas de tester ni la vue ni
le model.
Pour cela, nous allons utiliser des « Mocks ».
Plusieurs possibilités:
-Faire son propre mock (à la main)
-Utiliser un framework (OCMock, Mockito, …)
Notre propre mock
Pour cela, je créé une classe qui hérite de la classe à mockée.
Je redéveloppe les méthodes utilisées par la fonctionnalité du
contrôller testée. Dans ces fonction je sauvegarder les informations
que je veux testers (arguments, nombre d’appel, …)
Dans le contrôlleur je défini le modèle avec le mock. Pour cela, soit
:
•Utiliser un constructeur définissant le model
Model
•modifier l’attribut directement avec SetValue.
Contrôleur

Mock Model
Intégration continues
• Les tests peuvent être lancés en ligne de
commande. Cela permet d’exécuter le tests
avec jenkins.
xcodebuild test –scheme leprojet -destination "name=iPhone Retina (4-inch 64-bit) »

• Apple propose une solution. Pour cela il faut une
machine sous OSX Server. Et utiliser les
« bots ».
Le résultat ressemble à :
Références
Les sources de la démo sont ici :
 https://github.com/tijeff/tddIOSBlink
Bibliographie :
Test-Driven iOS Developpement de Graham Lee
Continous Integration in Xcode
Clean Code de Robert C. Martin
Refactoring Improving The Design of Existing code
de Martin Fowler

Contenu connexe

Tendances

NodeJS for Mobile App
NodeJS for Mobile AppNodeJS for Mobile App
NodeJS for Mobile App
Habib MAALEM
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
Hugo Hamon
 
Intégration continue & Qualité logicielle
Intégration continue & Qualité logicielleIntégration continue & Qualité logicielle
Intégration continue & Qualité logicielle
David Buros
 

Tendances (20)

Apple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey BocquetApple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey Bocquet
 
Partie 2: Angular
Partie 2: AngularPartie 2: Angular
Partie 2: Angular
 
SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)
 
Plugins Xcode
Plugins XcodePlugins Xcode
Plugins Xcode
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Partie1 TypeScript
Partie1 TypeScriptPartie1 TypeScript
Partie1 TypeScript
 
Hermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter MeuelHermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter Meuel
 
Transition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers StoryboardsTransition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers Storyboards
 
NodeJS for Mobile App
NodeJS for Mobile AppNodeJS for Mobile App
NodeJS for Mobile App
 
5 android web_service
5 android web_service5 android web_service
5 android web_service
 
Intro à angular
Intro à angularIntro à angular
Intro à angular
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mare
 
AngularJS et autres techno frontend
AngularJS et autres techno frontendAngularJS et autres techno frontend
AngularJS et autres techno frontend
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_thread
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?
 
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrenteCocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du temps
 
3D Touch
3D Touch3D Touch
3D Touch
 
Intégration continue & Qualité logicielle
Intégration continue & Qualité logicielleIntégration continue & Qualité logicielle
Intégration continue & Qualité logicielle
 

En vedette

Spec et test agile sur mobile @airfrance #at lille & cocoaheads tls
Spec et test agile sur mobile @airfrance #at lille & cocoaheads tlsSpec et test agile sur mobile @airfrance #at lille & cocoaheads tls
Spec et test agile sur mobile @airfrance #at lille & cocoaheads tls
ekito
 
Xcode formation-iphone-ipad-xcode-et-cocoa
Xcode formation-iphone-ipad-xcode-et-cocoaXcode formation-iphone-ipad-xcode-et-cocoa
Xcode formation-iphone-ipad-xcode-et-cocoa
CERTyou Formation
 

En vedette (20)

Spec et test agile sur mobile @airfrance #at lille & cocoaheads tls
Spec et test agile sur mobile @airfrance #at lille & cocoaheads tlsSpec et test agile sur mobile @airfrance #at lille & cocoaheads tls
Spec et test agile sur mobile @airfrance #at lille & cocoaheads tls
 
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsBuild automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
 
CocoaHeads Toulouse - iOS TechTalk - Mélanie Bessagnet
CocoaHeads Toulouse - iOS TechTalk - Mélanie BessagnetCocoaHeads Toulouse - iOS TechTalk - Mélanie Bessagnet
CocoaHeads Toulouse - iOS TechTalk - Mélanie Bessagnet
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
Xcode formation-iphone-ipad-xcode-et-cocoa
Xcode formation-iphone-ipad-xcode-et-cocoaXcode formation-iphone-ipad-xcode-et-cocoa
Xcode formation-iphone-ipad-xcode-et-cocoa
 
DevOps - Retour d’expérience - RivieraDev du 20 Octobre 2011
DevOps - Retour d’expérience - RivieraDev du 20 Octobre 2011DevOps - Retour d’expérience - RivieraDev du 20 Octobre 2011
DevOps - Retour d’expérience - RivieraDev du 20 Octobre 2011
 
Comment concilier Agilité et projet au forfait ?
Comment concilier Agilité et projet au forfait ?Comment concilier Agilité et projet au forfait ?
Comment concilier Agilité et projet au forfait ?
 
Automate your build on Android with Jenkins
Automate your build on Android with JenkinsAutomate your build on Android with Jenkins
Automate your build on Android with Jenkins
 
Présentation iBeacon (cocoaheads toulouse)
Présentation iBeacon (cocoaheads toulouse)Présentation iBeacon (cocoaheads toulouse)
Présentation iBeacon (cocoaheads toulouse)
 
Swift, opportunités et perspectives du dernier langage d'Apple
Swift, opportunités et perspectives du dernier langage d'AppleSwift, opportunités et perspectives du dernier langage d'Apple
Swift, opportunités et perspectives du dernier langage d'Apple
 
Use In IoT : l’objet connecté de la board au dashboard
Use In IoT : l’objet connecté de la board au dashboardUse In IoT : l’objet connecté de la board au dashboard
Use In IoT : l’objet connecté de la board au dashboard
 
Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?
 
Les différents design patterns pour CoreData par Emmanuel Furnon
Les différents design patterns pour CoreData par Emmanuel FurnonLes différents design patterns pour CoreData par Emmanuel Furnon
Les différents design patterns pour CoreData par Emmanuel Furnon
 
Presentation clean architecture
Presentation clean architecturePresentation clean architecture
Presentation clean architecture
 
Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.
 
Alamofire
AlamofireAlamofire
Alamofire
 
Firebase par nicolas lehovetzki
Firebase par nicolas lehovetzkiFirebase par nicolas lehovetzki
Firebase par nicolas lehovetzki
 
Safari app extensions cleared up by Sanaa Squalli
Safari app extensions cleared up by Sanaa SqualliSafari app extensions cleared up by Sanaa Squalli
Safari app extensions cleared up by Sanaa Squalli
 
MVC-RS par Grégoire Lhotelier
MVC-RS par Grégoire LhotelierMVC-RS par Grégoire Lhotelier
MVC-RS par Grégoire Lhotelier
 
Chainable datasource
Chainable datasourceChainable datasource
Chainable datasource
 

Similaire à CocoaHeads Toulouse - Xcode et les tests - Epitez

Présentation Alt.net - Tests unitaires automatisés
Présentation Alt.net - Tests unitaires automatisésPrésentation Alt.net - Tests unitaires automatisés
Présentation Alt.net - Tests unitaires automatisés
Djamel Zouaoui
 
La qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
La qualité logicielle et l'intégration continue - Cas concret du projet CytomineLa qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
La qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
Interface ULg, LIEGE science park
 
Anatomie du test
Anatomie du testAnatomie du test
Anatomie du test
Frederic Hardy
 
20131024 qualité de code et sonar - mug lyon
20131024   qualité de code et sonar - mug lyon20131024   qualité de code et sonar - mug lyon
20131024 qualité de code et sonar - mug lyon
Clement Bouillier
 

Similaire à CocoaHeads Toulouse - Xcode et les tests - Epitez (20)

Paris Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacyParis Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacy
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascript
 
Conformiq
ConformiqConformiq
Conformiq
 
Présentation Alt.net - Tests unitaires automatisés
Présentation Alt.net - Tests unitaires automatisésPrésentation Alt.net - Tests unitaires automatisés
Présentation Alt.net - Tests unitaires automatisés
 
Industrialisation des développements logiciels
Industrialisation des développements logicielsIndustrialisation des développements logiciels
Industrialisation des développements logiciels
 
Normandy JUG integration Continue
Normandy JUG integration ContinueNormandy JUG integration Continue
Normandy JUG integration Continue
 
Flex Unit Testing
Flex Unit TestingFlex Unit Testing
Flex Unit Testing
 
Agile tour 2015 alliés contre les défauts
Agile tour 2015   alliés contre les défautsAgile tour 2015   alliés contre les défauts
Agile tour 2015 alliés contre les défauts
 
Agile tour Lille 2015 allies ensemble contre les defauts
Agile tour Lille 2015 allies ensemble contre les defautsAgile tour Lille 2015 allies ensemble contre les defauts
Agile tour Lille 2015 allies ensemble contre les defauts
 
La qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
La qualité logicielle et l'intégration continue - Cas concret du projet CytomineLa qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
La qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
 
La qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
La qualité logicielle et l'intégration continue - Cas concret du projet CytomineLa qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
La qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
 
J Unit
J UnitJ Unit
J Unit
 
Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Présentation Rex GWT 2.0
Présentation Rex GWT 2.0
 
Anatomie du test
Anatomie du testAnatomie du test
Anatomie du test
 
RefCard Tests sur tous les fronts
RefCard Tests sur tous les frontsRefCard Tests sur tous les fronts
RefCard Tests sur tous les fronts
 
20081023 - Paris Vi Master STL TA - Initiation Maven
20081023 - Paris Vi Master STL TA - Initiation Maven20081023 - Paris Vi Master STL TA - Initiation Maven
20081023 - Paris Vi Master STL TA - Initiation Maven
 
Test driven development v0.2 20121221
Test driven development v0.2 20121221Test driven development v0.2 20121221
Test driven development v0.2 20121221
 
Azure DevOps Tests Plan
Azure DevOps Tests PlanAzure DevOps Tests Plan
Azure DevOps Tests Plan
 
Bbl sur les tests
Bbl sur les testsBbl sur les tests
Bbl sur les tests
 
20131024 qualité de code et sonar - mug lyon
20131024   qualité de code et sonar - mug lyon20131024   qualité de code et sonar - mug lyon
20131024 qualité de code et sonar - mug lyon
 

Plus de CocoaHeads France

Plus de CocoaHeads France (20)

Mutation testing for a safer Future
Mutation testing for a safer FutureMutation testing for a safer Future
Mutation testing for a safer Future
 
iOS App Group for Debugging
iOS App Group for DebuggingiOS App Group for Debugging
iOS App Group for Debugging
 
Asynchronous swift
Asynchronous swiftAsynchronous swift
Asynchronous swift
 
Visual accessibility in iOS11
Visual accessibility in iOS11Visual accessibility in iOS11
Visual accessibility in iOS11
 
My script - One year of CocoaHeads
My script - One year of CocoaHeadsMy script - One year of CocoaHeads
My script - One year of CocoaHeads
 
Ui testing dealing with push notifications
Ui testing dealing with push notificationsUi testing dealing with push notifications
Ui testing dealing with push notifications
 
CONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANE
 
L'intégration continue avec Bitrise
L'intégration continue avec BitriseL'intégration continue avec Bitrise
L'intégration continue avec Bitrise
 
Super combinators
Super combinatorsSuper combinators
Super combinators
 
Design like a developer
Design like a developerDesign like a developer
Design like a developer
 
Handle the error
Handle the errorHandle the error
Handle the error
 
Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3
 
SwiftyGPIO
SwiftyGPIOSwiftyGPIO
SwiftyGPIO
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
 
Programme MFI retour d'expérience
Programme MFI retour d'expérienceProgramme MFI retour d'expérience
Programme MFI retour d'expérience
 
How to communicate with Smart things?
How to communicate with Smart things?How to communicate with Smart things?
How to communicate with Smart things?
 
Build a lego app with CocoaPods
Build a lego app with CocoaPodsBuild a lego app with CocoaPods
Build a lego app with CocoaPods
 
Let's migrate to Swift 3.0
Let's migrate to Swift 3.0Let's migrate to Swift 3.0
Let's migrate to Swift 3.0
 
Project Entourage
Project EntourageProject Entourage
Project Entourage
 
What's new in iOS9
What's new in iOS9What's new in iOS9
What's new in iOS9
 

CocoaHeads Toulouse - Xcode et les tests - Epitez

  • 1. XCode & Les Tests ou Des Tests au Code Ekito - Cocoahead Epitez - JF Marronnier
  • 3. XCode 5 & XCTest Nouvelle interface mettant en évidence les tests  ajout d’un navigateur de tests (Copie d’écran ci dessous) o Contrôle d’exécution o Visualise résultat de test • Nouveau « framework » XCTest • Les projets sont créés systématiquement avec une « cible » test Interface de Tests • Résultat global Cas Test Navigateur de Cas Tests « Ko » • Résultats • Exécution
  • 4. Tests : Pourquoi tester ? • Trouver les erreurs de codage • Vérifier que l’intégration du système • Vérifier l’adéquation Spécification vs Logiciel • Eviter/Détecter les régressions
  • 5. Tests : On teste du code Le tests s’exécutent sur du code existant, n’est-ce pas ? Mais : •Imaginerons nous en tests ce qu’il n’a pas vu lors du codage ? •Les bugs seront détectés tardivement (après le codage) •En fin de projet, les budgets sont très limités ceci augment le risque sur les tests et la correction des bugs détectés. •Les tests sont liés au code et peut aux besoins utilisateur
  • 6. Tests : TDD c’est quoi ? C’est pourquoi que le TDD a été imaginé. L’idée est décrire le tests avant le code. Le code ne réponds qu’aux tests écris. Ainsi : •Le code ne répond qu’aux besoins exprimés ; •Les erreurs sont détectés immédiatement ; •Les tests sont automatiques • Exécutable en permanence • Permet de détecter les régressions ? •…
  • 7. Tests : TDD c’est quoi ? Le cycle de travail est : 1.Écrire un tests qui est 2.Écrire le code minimal qui rend le 3.Récrire le code pour l’améliorer (« refactoring ») Ecrire test [Test Ko] "Refactore" Coder [Test O k] [test O k] Test Ko Test Ok Test Ok
  • 8. Tests : Règles de l’Oncle Bob Ne pas oublier les règle de l’oncle Bob (Robert Martin) •Vous n'êtes pas autorisé à écrire de code de production, sauf si c'est pour faire une passe de test unitaire défaut. •Vous n'êtes pas autorisé à écrire plus d'un test unitaire que ce qui est suffisant pour faire faillite, et des erreurs de compilation sont des échecs. •Vous n'êtes pas autorisé à écrire de plus le code de production que ce qui est suffisant pour passer d'une faute de test unitaire.
  • 9. TDD avec IOs : le MVC Vue Action Utilisateur Modifie Notifie Contrôleur Modifie Modèle
  • 10. Tester un Modèle Contrôleur -> Modèle Model -> Controller Le contrôleur accède directement à la classe modèle. Le modèle ne connais pas le contrôleur. Il communique avec ses «   clients   » le mécanisme de diffusion NSNotificationCenter. a. Le testeur instancie un objet « modèle » ; b. Il le stimule ; c. Il valide directement les données de cette objet. a. Le testeur instancie un objet model ; s’abonne, comme le contrôleur, au centre de notification du model ; b. Il stimule directement l’objet modèle ; c. Il valide alors les notifications reçues.
  • 11. TDD avec les Vues
  • 12. Éléments du Storyboard A partir de la class UIStoryBoard il est possible de charger un «  storyBoard  » à partir de son nom. UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; Du storyBoard on peut récupérer le contrôleur associé. // Pour récupérer le controller initial monViewController * viewController = [storyboard instantiateInitialViewController]; //(ou) pour récupérer un controller par son nom monViewController * viewController = [storyboard instantiateViewControllerWithIdentifier:@"controllerName"];
  • 13. Tester composants vue Pour respecter le TDD a.Rédiger le test (composant non « nil ») Définir le « IBOutlet » dans le contrôleur  le test est Ko b.Définir le composant dans la vue Le relier avec le « IBOutlet » dans le contrôleur  le test est Ok
  • 14. Attributs composants Noter que les attributs graphiques des composants peuvent être défini avec le TDD (si ceux-ci sont important pour le client). Par exemple, le texte d’un label doit être verte: a.XCTAssertEqualObjects([[viewController labelXX] textColor], [UIColor redColor], @"Bad label color") b.Définir la couleur dans le storyBoard
  • 15. TDD avec le contrôleur Noter que l’objectif est de tester le contrôleur « seul ». L’objectif n’est pas de tester ni la vue ni le model. Pour cela, nous allons utiliser des « Mocks ». Plusieurs possibilités: -Faire son propre mock (à la main) -Utiliser un framework (OCMock, Mockito, …)
  • 16. Notre propre mock Pour cela, je créé une classe qui hérite de la classe à mockée. Je redéveloppe les méthodes utilisées par la fonctionnalité du contrôller testée. Dans ces fonction je sauvegarder les informations que je veux testers (arguments, nombre d’appel, …) Dans le contrôlleur je défini le modèle avec le mock. Pour cela, soit : •Utiliser un constructeur définissant le model Model •modifier l’attribut directement avec SetValue. Contrôleur Mock Model
  • 17. Intégration continues • Les tests peuvent être lancés en ligne de commande. Cela permet d’exécuter le tests avec jenkins. xcodebuild test –scheme leprojet -destination "name=iPhone Retina (4-inch 64-bit) » • Apple propose une solution. Pour cela il faut une machine sous OSX Server. Et utiliser les « bots ». Le résultat ressemble à :
  • 18. Références Les sources de la démo sont ici :  https://github.com/tijeff/tddIOSBlink Bibliographie : Test-Driven iOS Developpement de Graham Lee Continous Integration in Xcode Clean Code de Robert C. Martin Refactoring Improving The Design of Existing code de Martin Fowler