SlideShare une entreprise Scribd logo
Tests unitaires
 Tests unitaires en Java pendant 2ans

 Tests unitaires iOS pendant 2ans

La transition pique un peu…
Il était une fois un débutant…

Je passe 90% de mon temps à essayer de faire marcher
UIKit comment les tests unitaires vont ils m’aider ?




                              =
Qui débuggait tout le temps...
J’utilise le debugger, et des logs
Et puis un jour…
Développer avec le debugger devient un frein



 Debugger d’Xcode peu efficace (pas
  d’évaluation, variables non accessibles)

 Faire du pas à pas dans le simulateur n’est pas productif

 Comment détecter les impacts quand on refactor une
  méthode ?
Il se rend compte que :




 Les tests unitaires sur iOS finalement ça marche

 Et ça fait gagner du temps
C’est quoi le test unitaire de cette session ?




Sortirez vous d’ici prêt à écrire au moins un test d’ici la fin de
                            l’année ?
AGENDA

Quel framework choisir ?
Un test simple
Où tester ?
Cas réel : appel de Web Service
Pour aller plus loin
Conclusion
Retour d’expérience
 Des projets de bout en bout en TDD avec 3 différents
  Framework :



    OCUnit

    GTM

    GHUnit
OCUnit, les pour

 Intégré à Xcode

 Stable

 Pas de configuration

 Se lance avec un raccourci clavier
OCUnit, les contre


 Utilisation d’un bundle différent de l’application

 Points d’arrêt en dehors des classes de tests

 Impossible de lancer un seul test

 Lance les tests en même temps que l’application
OCUnit, test de recette
 Given :

    developper.level = kBeginner;
    developper.objectives = kLow;


 When

    Framework *result = [develepper chooseUnitTestingFramework];


 Then

    assertThat(result, equalTo(OCUnit));
GTM, les pour


 Target d’application pour les tests

 Bien intégré à Xcode

 Communauté active

 Peu de limitations
GTM, les contres




 Logs très difficilement exploitables

 Ne gère pas bien les exceptions
GTM, test de recette
 Given :

    developper.level = kHigh;
    developper.objectives = kHigh;


 When

    Framework *result = [develepper chooseUnitTestingFramework];


 Then

    assertThat(result, equalTo(GTM));
GHUnit, les pours


 Supporte les test écrits pour OCUnit et GTM

 Logs sexy

 Possibilité de lancé les tests individuellement

 Très simple à mettre en place
GHUnit, les contres

 Pas d’intégration à Xcode

 Difficilement automatisable

 S’exécute dans context de l’application sur un autre
  Thread
    Tried to obtain the web lock from a thread other than the main
     thread or the web thread. This may be a result of calling to
     UIKit from a secondary thread. Crashing now...
GHUnit, test de recette
 Given :

    developper.level = kMedium;
    developper.objectives = kMedium;


 When

    Framework *result = [develepper chooseUnitTestingFramework];


 Then

    assertThat(result, equalTo(GHUnit));
AGENDA

Quel framework choisir ?
Un test simple
Où tester ?
Cas réel : appel de Web Service
Pour aller plus loin
Conclusion
Configurer OCUnit
Comment OCUnit fonctionne
 Xcode créé :
    Une « application target »
    Un « test bundle target »
Faire attention aux choix de targets
Template standard : ce que l’on ne veut pas…
Interface
Template standard : ce que l’on ne veut pas…
Implementation
Template custom : ce que l’on veut !

Interface
Template custom : ce que l’on veut !
Implementation
Un template de méthode de test
Un exemple de test
AGENDA

Quel framework choisir ?
Un test simple
Où tester ?
Cas réel : appel de Web Service
Pour aller plus loin
Conclusion
Notre application
                 Model
                                           Délégation

                                           Requêtes
Objets métiers                             asynchrone




        Controller
                                           View




ViewControllers
                                           Views




     Services            JSON Parser




ASIHTTPRequest
Tester quoi ?




Model    Controller           View




facile                       Complexe
Tester quoi ?
                 Model



Objets métiers




        Controller
                                       View




ViewControllers
                                       Views




     Services            JSON Parser




 ASIHTTPRequest
Où tester ?

Controller                                             Service                                     ASI
                 -(void) loadArticlesFrom:To:



                                                 Préparation de
                                                   la requete

                                                                   -(void) startAsynchronous




                                                                    -(void) requestFinished:


                                                Traitement de la
                                                    réponse




             -(void) service:didSucceedWithArticles:
Où tester ?
 Préparation de la requête :


    Est ce que la bonne url est appelée avec les bons paramètres ?


    Est ce que les bons paramètres sont envoyés dans le body ?


    Eventuellement validation des paramètres
Où tester ?
 Traitement de la réponse :


    A partir du JSON est ce que j’alimente bien les objets de mon
     modèle ?


    Les règles et la logique de traitement des articles est respectée ?
       • Si le status de l’article est … alors …


    Si je reçois des liens est ce que je télécharge bien les données ?
       • Images, pdf, etc
Où tester ?
 Chaine globale :

    Est ce que j’appelle bien ASI ?


    Est ce que je reçois la réponse de ASI ?


    Est ce que j’appelle bien la méthode didSucceed / didFail de mon
     delegate ?
AGENDA

Quel framework choisir ?
Un test simple
Où tester ?
Cas réel : appel de Web Service
Pour aller plus loin
Conclusion
Tests des méthodes privées

Test                                           Service


            -(Request*) requestForArticles
                                             Préparation de
                                               la requete




       -(NSArray*) parseData:(NSData*)
                                             Traitement du
                                                 retour
Tests des méthodes privées
 Une implémentation complexe à tester :
Tests des méthodes privées
 Pas de valeur de retour
Tests des méthodes privées
 Appels de singletons
Tests des méthodes privées

 Créer des méthodes qui prennent des paramètres simples
   à créer dans vos tests

 Créer des méthodes qui retournent des objets simple à
   tester dans vos tests

 Gérer l’asynchrone en dehors de ces méthodes

 Pour plus d’informations voir le pattern « dependency
   injection »
http://spin.atomicobject.com/2010/12/09/objection-dependency-injection-in-obj-c/
Comment modifier légèrement votre code pour créer des
            situations faciles à tester
Tests des méthodes privées
 Une méthode facile à tester :
Tests des méthodes privées
 Une méthode facile à tester :
Tests des méthodes privées
 Un exemple de test :
AGENDA

Quel framework choisir ?
Un test simple
Où tester ?
Cas réel : appel de Web Service
Pour aller plus loin
Conclusion
Pour aller plus loin

 Une autre session ?


 OCMock

 Tests des méthodes assynchrones

 CoreData
AGENDA

Quel framework choisir ?
Un test simple
Où tester ?
Cas réel : appel de Web Service
Pour aller plus loin
Conclusion
Conclusion
 Privilégiez un Framework simple à un Framework complet

 Peu de tests vaut mieux que pas de tests du tout

 Dans certains cas développer en TDD est plus productif
  qu’avec le simulateur

 Modifier légèrement votre code pour créer des
  situations faciles à tester
Take away
 Pour récapituler :

   Sortez la logique de vos controller

   Identifier le code que vous souhaitez tester

   Sortez le dans une méthode spécifique

   Faites en sorte que cette méthode soit simple à tester

Contenu connexe

Tendances

PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
Cyrille Grandval
 
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
Antoine Rey
 
Les Aventures d'Alice - la Révolte des Tests
Les Aventures d'Alice - la Révolte des TestsLes Aventures d'Alice - la Révolte des Tests
Les Aventures d'Alice - la Révolte des Tests
Ly-Jia Goldstein
 
SWTBot
SWTBotSWTBot
L'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringL'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoring
Pascal Laurin
 
Bean Validation - Cours v 1.1
Bean Validation - Cours v 1.1Bean Validation - Cours v 1.1
Bean Validation - Cours v 1.1
Laurent Guérin
 
Programmation des Threads en java
Programmation des Threads en javaProgrammation des Threads en java
Programmation des Threads en java
Ezéquiel Tsagué
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
Antoine Rey
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
Franck SIMON
 
Multithreading
MultithreadingMultithreading
Multithreading
Ghazouani Mahdi
 
Intro sur les tests unitaires
Intro sur les tests unitairesIntro sur les tests unitaires
Intro sur les tests unitairesPHPPRO
 
Jprofiler
JprofilerJprofiler
Jprofiler
Khalid ALLILI
 
#5 Java EE5 Client Lourd et Smart Client
#5 Java EE5  Client Lourd  et Smart Client#5 Java EE5  Client Lourd  et Smart Client
#5 Java EE5 Client Lourd et Smart Client
Guillaume Sauthier
 
Jasmine : tests unitaires en JavaScript - Human Talks Grenoble 14.05.2013
Jasmine : tests unitaires en JavaScript - Human Talks Grenoble 14.05.2013Jasmine : tests unitaires en JavaScript - Human Talks Grenoble 14.05.2013
Jasmine : tests unitaires en JavaScript - Human Talks Grenoble 14.05.2013
Xavier NOPRE
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Antoine Rey
 
Deux ans de développement Agile, erreurs et succès
Deux ans de développement Agile, erreurs et succèsDeux ans de développement Agile, erreurs et succès
Deux ans de développement Agile, erreurs et succès
Agile Tour 2009 Québec
 
05 visual basic .net - variables, procedures, arguments et structures de cont...
05 visual basic .net - variables, procedures, arguments et structures de cont...05 visual basic .net - variables, procedures, arguments et structures de cont...
05 visual basic .net - variables, procedures, arguments et structures de cont...
Hamza SAID
 

Tendances (20)

PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
 
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
 
Les Aventures d'Alice - la Révolte des Tests
Les Aventures d'Alice - la Révolte des TestsLes Aventures d'Alice - la Révolte des Tests
Les Aventures d'Alice - la Révolte des Tests
 
SWTBot
SWTBotSWTBot
SWTBot
 
L'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringL'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoring
 
Bean Validation - Cours v 1.1
Bean Validation - Cours v 1.1Bean Validation - Cours v 1.1
Bean Validation - Cours v 1.1
 
Threads
ThreadsThreads
Threads
 
Programmation des Threads en java
Programmation des Threads en javaProgrammation des Threads en java
Programmation des Threads en java
 
Test unitaire
Test unitaireTest unitaire
Test unitaire
 
Les tests-unitaires-en-java
Les tests-unitaires-en-javaLes tests-unitaires-en-java
Les tests-unitaires-en-java
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
 
Multithreading
MultithreadingMultithreading
Multithreading
 
Intro sur les tests unitaires
Intro sur les tests unitairesIntro sur les tests unitaires
Intro sur les tests unitaires
 
Jprofiler
JprofilerJprofiler
Jprofiler
 
#5 Java EE5 Client Lourd et Smart Client
#5 Java EE5  Client Lourd  et Smart Client#5 Java EE5  Client Lourd  et Smart Client
#5 Java EE5 Client Lourd et Smart Client
 
Jasmine : tests unitaires en JavaScript - Human Talks Grenoble 14.05.2013
Jasmine : tests unitaires en JavaScript - Human Talks Grenoble 14.05.2013Jasmine : tests unitaires en JavaScript - Human Talks Grenoble 14.05.2013
Jasmine : tests unitaires en JavaScript - Human Talks Grenoble 14.05.2013
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
 
Deux ans de développement Agile, erreurs et succès
Deux ans de développement Agile, erreurs et succèsDeux ans de développement Agile, erreurs et succès
Deux ans de développement Agile, erreurs et succès
 
05 visual basic .net - variables, procedures, arguments et structures de cont...
05 visual basic .net - variables, procedures, arguments et structures de cont...05 visual basic .net - variables, procedures, arguments et structures de cont...
05 visual basic .net - variables, procedures, arguments et structures de cont...
 

Similaire à Cocoaheads Paris Nombembre Test unitaires

Valider par des tests - Blend
Valider par des tests - BlendValider par des tests - Blend
Valider par des tests - Blend
Christophe Villeneuve
 
Performance ug#1
Performance ug#1Performance ug#1
Performance ug#1
Marc Bojoly
 
Automatisation des tests - objectifs et concepts - partie 2
Automatisation des tests  - objectifs et concepts - partie 2Automatisation des tests  - objectifs et concepts - partie 2
Automatisation des tests - objectifs et concepts - partie 2
Christophe Rochefolle
 
Cerberus Testing
Cerberus TestingCerberus Testing
Cerberus Testing
CIVEL Benoit
 
RefCard Tests sur tous les fronts
RefCard Tests sur tous les frontsRefCard Tests sur tous les fronts
RefCard Tests sur tous les fronts
OCTO Technology
 
Conformiq
ConformiqConformiq
Conformiq
Soukaina Boujadi
 
Flex Unit Testing
Flex Unit TestingFlex Unit Testing
Flex Unit Testing
Christophe Keromen
 
Test unitaires
Test unitairesTest unitaires
Test unitaires
Mohamed Akrouh
 
Formation Extreme Programming, Tests unitaires, travail collaboratif
Formation Extreme Programming, Tests unitaires, travail collaboratifFormation Extreme Programming, Tests unitaires, travail collaboratif
Formation Extreme Programming, Tests unitaires, travail collaboratif
kemenaran
 
CocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeadsRNS
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
Paris Salesforce Developer Group
 
Industrialisation des développements logiciels
Industrialisation des développements logicielsIndustrialisation des développements logiciels
Industrialisation des développements logiciels
Sylvain Leroy
 
Tests Dinterface SWT
Tests Dinterface SWTTests Dinterface SWT
Tests Dinterface SWT
Eric Le Merdy
 
Test driven development v0.2 20121221
Test driven development v0.2 20121221Test driven development v0.2 20121221
Test driven development v0.2 20121221
Frédéric Delorme
 
Octo Technology - Refcard Tests Web front-end
Octo Technology - Refcard Tests Web front-endOcto Technology - Refcard Tests Web front-end
Octo Technology - Refcard Tests Web front-end
François Petitit
 
Octo RefCard test front-end
Octo RefCard test front-endOcto RefCard test front-end
Octo RefCard test front-end
Clément Dubois
 
ALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowMathias Kluba
 
Les tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet coreLes tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet core
Arnaud Auroux
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
badrfathallah2
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
seydou4devops
 

Similaire à Cocoaheads Paris Nombembre Test unitaires (20)

Valider par des tests - Blend
Valider par des tests - BlendValider par des tests - Blend
Valider par des tests - Blend
 
Performance ug#1
Performance ug#1Performance ug#1
Performance ug#1
 
Automatisation des tests - objectifs et concepts - partie 2
Automatisation des tests  - objectifs et concepts - partie 2Automatisation des tests  - objectifs et concepts - partie 2
Automatisation des tests - objectifs et concepts - partie 2
 
Cerberus Testing
Cerberus TestingCerberus Testing
Cerberus Testing
 
RefCard Tests sur tous les fronts
RefCard Tests sur tous les frontsRefCard Tests sur tous les fronts
RefCard Tests sur tous les fronts
 
Conformiq
ConformiqConformiq
Conformiq
 
Flex Unit Testing
Flex Unit TestingFlex Unit Testing
Flex Unit Testing
 
Test unitaires
Test unitairesTest unitaires
Test unitaires
 
Formation Extreme Programming, Tests unitaires, travail collaboratif
Formation Extreme Programming, Tests unitaires, travail collaboratifFormation Extreme Programming, Tests unitaires, travail collaboratif
Formation Extreme Programming, Tests unitaires, travail collaboratif
 
CocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOS
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 
Industrialisation des développements logiciels
Industrialisation des développements logicielsIndustrialisation des développements logiciels
Industrialisation des développements logiciels
 
Tests Dinterface SWT
Tests Dinterface SWTTests Dinterface SWT
Tests Dinterface SWT
 
Test driven development v0.2 20121221
Test driven development v0.2 20121221Test driven development v0.2 20121221
Test driven development v0.2 20121221
 
Octo Technology - Refcard Tests Web front-end
Octo Technology - Refcard Tests Web front-endOcto Technology - Refcard Tests Web front-end
Octo Technology - Refcard Tests Web front-end
 
Octo RefCard test front-end
Octo RefCard test front-endOcto RefCard test front-end
Octo RefCard test front-end
 
ALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - Specflow
 
Les tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet coreLes tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet core
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 

Plus de CocoaHeads France

Mutation testing for a safer Future
Mutation testing for a safer FutureMutation testing for a safer Future
Mutation testing for a safer Future
CocoaHeads France
 
iOS App Group for Debugging
iOS App Group for DebuggingiOS App Group for Debugging
iOS App Group for Debugging
CocoaHeads France
 
Asynchronous swift
Asynchronous swiftAsynchronous swift
Asynchronous swift
CocoaHeads France
 
Visual accessibility in iOS11
Visual accessibility in iOS11Visual accessibility in iOS11
Visual accessibility in iOS11
CocoaHeads France
 
My script - One year of CocoaHeads
My script - One year of CocoaHeadsMy script - One year of CocoaHeads
My script - One year of CocoaHeads
CocoaHeads France
 
Ui testing dealing with push notifications
Ui testing dealing with push notificationsUi testing dealing with push notifications
Ui testing dealing with push notifications
CocoaHeads France
 
CONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANE
CocoaHeads France
 
L'intégration continue avec Bitrise
L'intégration continue avec BitriseL'intégration continue avec Bitrise
L'intégration continue avec Bitrise
CocoaHeads France
 
Super combinators
Super combinatorsSuper combinators
Super combinators
CocoaHeads France
 
Design like a developer
Design like a developerDesign like a developer
Design like a developer
CocoaHeads France
 
Handle the error
Handle the errorHandle the error
Handle the error
CocoaHeads France
 
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
CocoaHeads France
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
CocoaHeads France
 
SwiftyGPIO
SwiftyGPIOSwiftyGPIO
SwiftyGPIO
CocoaHeads France
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
CocoaHeads France
 
Programme MFI retour d'expérience
Programme MFI retour d'expérienceProgramme MFI retour d'expérience
Programme MFI retour d'expérience
CocoaHeads France
 
How to communicate with Smart things?
How to communicate with Smart things?How to communicate with Smart things?
How to communicate with Smart things?
CocoaHeads France
 
Build a lego app with CocoaPods
Build a lego app with CocoaPodsBuild a lego app with CocoaPods
Build a lego app with CocoaPods
CocoaHeads France
 
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
CocoaHeads France
 
Project Entourage
Project EntourageProject Entourage
Project Entourage
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
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
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
 

Cocoaheads Paris Nombembre Test unitaires

  • 2.
  • 3.  Tests unitaires en Java pendant 2ans  Tests unitaires iOS pendant 2ans La transition pique un peu…
  • 4. Il était une fois un débutant… Je passe 90% de mon temps à essayer de faire marcher UIKit comment les tests unitaires vont ils m’aider ? =
  • 5. Qui débuggait tout le temps... J’utilise le debugger, et des logs
  • 6. Et puis un jour… Développer avec le debugger devient un frein  Debugger d’Xcode peu efficace (pas d’évaluation, variables non accessibles)  Faire du pas à pas dans le simulateur n’est pas productif  Comment détecter les impacts quand on refactor une méthode ?
  • 7. Il se rend compte que :  Les tests unitaires sur iOS finalement ça marche  Et ça fait gagner du temps
  • 8. C’est quoi le test unitaire de cette session ? Sortirez vous d’ici prêt à écrire au moins un test d’ici la fin de l’année ?
  • 9. AGENDA Quel framework choisir ? Un test simple Où tester ? Cas réel : appel de Web Service Pour aller plus loin Conclusion
  • 10. Retour d’expérience  Des projets de bout en bout en TDD avec 3 différents Framework :  OCUnit  GTM  GHUnit
  • 11. OCUnit, les pour  Intégré à Xcode  Stable  Pas de configuration  Se lance avec un raccourci clavier
  • 12. OCUnit, les contre  Utilisation d’un bundle différent de l’application  Points d’arrêt en dehors des classes de tests  Impossible de lancer un seul test  Lance les tests en même temps que l’application
  • 13. OCUnit, test de recette  Given :  developper.level = kBeginner;  developper.objectives = kLow;  When  Framework *result = [develepper chooseUnitTestingFramework];  Then  assertThat(result, equalTo(OCUnit));
  • 14. GTM, les pour  Target d’application pour les tests  Bien intégré à Xcode  Communauté active  Peu de limitations
  • 15. GTM, les contres  Logs très difficilement exploitables  Ne gère pas bien les exceptions
  • 16. GTM, test de recette  Given :  developper.level = kHigh;  developper.objectives = kHigh;  When  Framework *result = [develepper chooseUnitTestingFramework];  Then  assertThat(result, equalTo(GTM));
  • 17. GHUnit, les pours  Supporte les test écrits pour OCUnit et GTM  Logs sexy  Possibilité de lancé les tests individuellement  Très simple à mettre en place
  • 18. GHUnit, les contres  Pas d’intégration à Xcode  Difficilement automatisable  S’exécute dans context de l’application sur un autre Thread  Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...
  • 19. GHUnit, test de recette  Given :  developper.level = kMedium;  developper.objectives = kMedium;  When  Framework *result = [develepper chooseUnitTestingFramework];  Then  assertThat(result, equalTo(GHUnit));
  • 20. AGENDA Quel framework choisir ? Un test simple Où tester ? Cas réel : appel de Web Service Pour aller plus loin Conclusion
  • 22. Comment OCUnit fonctionne  Xcode créé :  Une « application target »  Un « test bundle target »
  • 23. Faire attention aux choix de targets
  • 24. Template standard : ce que l’on ne veut pas… Interface
  • 25. Template standard : ce que l’on ne veut pas… Implementation
  • 26. Template custom : ce que l’on veut ! Interface
  • 27. Template custom : ce que l’on veut ! Implementation
  • 28. Un template de méthode de test
  • 30. AGENDA Quel framework choisir ? Un test simple Où tester ? Cas réel : appel de Web Service Pour aller plus loin Conclusion
  • 31. Notre application Model Délégation Requêtes Objets métiers asynchrone Controller View ViewControllers Views Services JSON Parser ASIHTTPRequest
  • 32. Tester quoi ? Model Controller View facile Complexe
  • 33. Tester quoi ? Model Objets métiers Controller View ViewControllers Views Services JSON Parser ASIHTTPRequest
  • 34. Où tester ? Controller Service ASI -(void) loadArticlesFrom:To: Préparation de la requete -(void) startAsynchronous -(void) requestFinished: Traitement de la réponse -(void) service:didSucceedWithArticles:
  • 35. Où tester ?  Préparation de la requête :  Est ce que la bonne url est appelée avec les bons paramètres ?  Est ce que les bons paramètres sont envoyés dans le body ?  Eventuellement validation des paramètres
  • 36. Où tester ?  Traitement de la réponse :  A partir du JSON est ce que j’alimente bien les objets de mon modèle ?  Les règles et la logique de traitement des articles est respectée ? • Si le status de l’article est … alors …  Si je reçois des liens est ce que je télécharge bien les données ? • Images, pdf, etc
  • 37. Où tester ?  Chaine globale :  Est ce que j’appelle bien ASI ?  Est ce que je reçois la réponse de ASI ?  Est ce que j’appelle bien la méthode didSucceed / didFail de mon delegate ?
  • 38. AGENDA Quel framework choisir ? Un test simple Où tester ? Cas réel : appel de Web Service Pour aller plus loin Conclusion
  • 39. Tests des méthodes privées Test Service -(Request*) requestForArticles Préparation de la requete -(NSArray*) parseData:(NSData*) Traitement du retour
  • 40. Tests des méthodes privées  Une implémentation complexe à tester :
  • 41. Tests des méthodes privées  Pas de valeur de retour
  • 42. Tests des méthodes privées  Appels de singletons
  • 43. Tests des méthodes privées  Créer des méthodes qui prennent des paramètres simples à créer dans vos tests  Créer des méthodes qui retournent des objets simple à tester dans vos tests  Gérer l’asynchrone en dehors de ces méthodes  Pour plus d’informations voir le pattern « dependency injection » http://spin.atomicobject.com/2010/12/09/objection-dependency-injection-in-obj-c/
  • 44. Comment modifier légèrement votre code pour créer des situations faciles à tester
  • 45. Tests des méthodes privées  Une méthode facile à tester :
  • 46. Tests des méthodes privées  Une méthode facile à tester :
  • 47. Tests des méthodes privées  Un exemple de test :
  • 48. AGENDA Quel framework choisir ? Un test simple Où tester ? Cas réel : appel de Web Service Pour aller plus loin Conclusion
  • 49. Pour aller plus loin  Une autre session ?  OCMock  Tests des méthodes assynchrones  CoreData
  • 50. AGENDA Quel framework choisir ? Un test simple Où tester ? Cas réel : appel de Web Service Pour aller plus loin Conclusion
  • 51. Conclusion  Privilégiez un Framework simple à un Framework complet  Peu de tests vaut mieux que pas de tests du tout  Dans certains cas développer en TDD est plus productif qu’avec le simulateur  Modifier légèrement votre code pour créer des situations faciles à tester
  • 52. Take away  Pour récapituler :  Sortez la logique de vos controller  Identifier le code que vous souhaitez tester  Sortez le dans une méthode spécifique  Faites en sorte que cette méthode soit simple à tester