52
Tests unitaires

Cocoaheads Paris Nombembre Test unitaires

Embed Size (px)

Citation preview

Page 1: Cocoaheads Paris Nombembre Test unitaires

Tests unitaires

Page 2: Cocoaheads Paris Nombembre Test unitaires
Page 3: Cocoaheads Paris Nombembre Test unitaires

Tests unitaires en Java pendant 2ans

Tests unitaires iOS pendant 2ans

La transition pique un peu…

Page 4: Cocoaheads Paris Nombembre Test unitaires

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 ?

Page 5: Cocoaheads Paris Nombembre Test unitaires

Qui débuggait tout le temps...

J’utilise le debugger, et des logs

Page 6: Cocoaheads Paris Nombembre Test unitaires

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 ?

Page 7: Cocoaheads Paris Nombembre Test unitaires

Il se rend compte que :

Les tests unitaires sur iOS finalement ça marche

Et ça fait gagner du temps

Page 8: Cocoaheads Paris Nombembre Test unitaires

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 ?

Page 9: Cocoaheads Paris Nombembre Test unitaires

AGENDA

Quel framework choisir ?

Un test simple

Où tester ?

Cas réel : appel de Web Service

Pour aller plus loin

Conclusion

Page 10: Cocoaheads Paris Nombembre Test unitaires

Retour d’expérience

Des projets de bout en bout en TDD avec 3 différents Framework :

OCUnit

GTM

GHUnit

Page 11: Cocoaheads Paris Nombembre Test unitaires

OCUnit, les pour

Intégré à Xcode

Stable

Pas de configuration

Se lance avec un raccourci clavier

Page 12: Cocoaheads Paris Nombembre Test unitaires

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

Page 13: Cocoaheads Paris Nombembre Test unitaires

OCUnit, test de recette

Given :

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

When

Framework *result = [develepper chooseUnitTestingFramework];

Then

assertThat(result, equalTo(OCUnit));

Page 14: Cocoaheads Paris Nombembre Test unitaires

GTM, les pour

Target d’application pour les tests

Bien intégré à Xcode

Communauté active

Peu de limitations

Page 15: Cocoaheads Paris Nombembre Test unitaires

GTM, les contres

Logs très difficilement exploitables

Ne gère pas bien les exceptions

Page 16: Cocoaheads Paris Nombembre Test unitaires

GTM, test de recette

Given :

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

When

Framework *result = [develepper chooseUnitTestingFramework];

Then

assertThat(result, equalTo(GTM));

Page 17: Cocoaheads Paris Nombembre Test unitaires

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

Page 18: Cocoaheads Paris Nombembre Test unitaires

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...

Page 19: Cocoaheads Paris Nombembre Test unitaires

GHUnit, test de recette

Given :

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

When

Framework *result = [develepper chooseUnitTestingFramework];

Then

assertThat(result, equalTo(GHUnit));

Page 20: Cocoaheads Paris Nombembre Test unitaires

AGENDA

Quel framework choisir ?

Un test simple

Où tester ?

Cas réel : appel de Web Service

Pour aller plus loin

Conclusion

Page 21: Cocoaheads Paris Nombembre Test unitaires

Configurer OCUnit

Page 22: Cocoaheads Paris Nombembre Test unitaires

Comment OCUnit fonctionne

Xcode créé : Une « application target » Un « test bundle target »

Page 23: Cocoaheads Paris Nombembre Test unitaires

Faire attention aux choix de targets

Page 24: Cocoaheads Paris Nombembre Test unitaires

Template standard : ce que l’on ne veut pas…

Interface

Page 25: Cocoaheads Paris Nombembre Test unitaires

Template standard : ce que l’on ne veut pas…

Implementation

Page 26: Cocoaheads Paris Nombembre Test unitaires

Template custom : ce que l’on veut !

Interface

Page 27: Cocoaheads Paris Nombembre Test unitaires

Template custom : ce que l’on veut !

Implementation

Page 28: Cocoaheads Paris Nombembre Test unitaires

Un template de méthode de test

Page 29: Cocoaheads Paris Nombembre Test unitaires

Un exemple de test

Page 30: Cocoaheads Paris Nombembre Test unitaires

AGENDA

Quel framework choisir ?

Un test simple

Où tester ?

Cas réel : appel de Web Service

Pour aller plus loin

Conclusion

Page 31: Cocoaheads Paris Nombembre Test unitaires

ControllerView

Model

Views

ASIHTTPRequest

ViewControllers

Notre application

Objets métiers

Délégation

Requêtes asynchrone

JSON ParserServices

Page 32: Cocoaheads Paris Nombembre Test unitaires

Tester quoi ?

Model Controller View

facile Complexe

Page 33: Cocoaheads Paris Nombembre Test unitaires

ControllerView

Model

Views

JSON Parser

ASIHTTPRequest

ViewControllers

Tester quoi ?

Objets métiers

Services

Page 34: Cocoaheads Paris Nombembre Test unitaires

Où tester ?

ServiceController-(void) loadArticlesFrom:To:

-(void) service:didSucceedWithArticles:

ASI

-(void) startAsynchronous

-(void) requestFinished:

Préparation de la requete

Traitement de la réponse

Page 35: Cocoaheads Paris Nombembre Test unitaires

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

Page 36: Cocoaheads Paris Nombembre Test unitaires

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

Page 37: Cocoaheads Paris Nombembre Test unitaires

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 ?

Page 38: Cocoaheads Paris Nombembre Test unitaires

AGENDA

Quel framework choisir ?

Un test simple

Où tester ?

Cas réel : appel de Web Service

Pour aller plus loin

Conclusion

Page 39: Cocoaheads Paris Nombembre Test unitaires

Tests des méthodes privées

ServiceTest

-(Request*) requestForArticlesPréparation de

la requete

Traitement du retour

-(NSArray*) parseData:(NSData*)

Page 40: Cocoaheads Paris Nombembre Test unitaires

Tests des méthodes privées

Une implémentation complexe à tester :

Page 41: Cocoaheads Paris Nombembre Test unitaires

Tests des méthodes privées

Pas de valeur de retour

Page 42: Cocoaheads Paris Nombembre Test unitaires

Tests des méthodes privées

Appels de singletons

Page 43: Cocoaheads Paris Nombembre Test unitaires

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/

Page 44: Cocoaheads Paris Nombembre Test unitaires

Comment modifier légèrement votre code pour créer des situations faciles à tester

Page 45: Cocoaheads Paris Nombembre Test unitaires

Tests des méthodes privées

Une méthode facile à tester :

Page 46: Cocoaheads Paris Nombembre Test unitaires

Tests des méthodes privées

Une méthode facile à tester :

Page 47: Cocoaheads Paris Nombembre Test unitaires

Tests des méthodes privées

Un exemple de test :

Page 48: Cocoaheads Paris Nombembre Test unitaires

AGENDA

Quel framework choisir ?

Un test simple

Où tester ?

Cas réel : appel de Web Service

Pour aller plus loin

Conclusion

Page 49: Cocoaheads Paris Nombembre Test unitaires

Pour aller plus loin

Une autre session ?

OCMock

Tests des méthodes assynchrones

CoreData

Page 50: Cocoaheads Paris Nombembre Test unitaires

AGENDA

Quel framework choisir ?

Un test simple

Où tester ?

Cas réel : appel de Web Service

Pour aller plus loin

Conclusion

Page 51: Cocoaheads Paris Nombembre Test unitaires

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

Page 52: Cocoaheads Paris Nombembre Test unitaires

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