6. 3 niveaux de tests automatisés
• unitaire,
• intégration,
• de bout en bout. unitaire
intégration
qualité du feeback bout en bout
qualité externe qualité interne
Steve Freeman, Nat Pryce. Growing Object-oriented software, Guided by tests, p11
7. Back to basics (POO)
➡ Responsabilité : obligation d’accomplir une tâche ou de
détenir une information
➡ Rôle : ensemble de responsabilités liées entre elles
➡ Objet : implémentation d’un ou plusieurs rôles
➡ Collaboration : interactions d’ objets ou de rôles
8. C’est à dire
Webservice Client
Responsabilités Collaborateurs
➡ construire les requêtes HTTP ➡ client HTTP
➡ traiter les erreurs HTTP/svc ➡ parser
➡ informer du résultat ➡ observateur
14. objets factices (dummy object)
➡ vient remplacer «bêtement» l’objet de production
➡ mais pas de comportements
15. objets bouchon (stub object)
➡ vient remplacer un objet de production
➡ retourne des valeurs
➡ comportement souvent partiel
16. objets allégés (fake object)
➡ vient remplacer un objet de production
➡ contient une implémentation fonctionnelle mais non adaptée à
la production
17. mocks objects (mock object)
➡ vient remplacer un objet de production
➡ peut retourner des valeurs (comme les objets bouchons)
➡ contrôle les messages reçus par rapport au contrat prévu
➡ Première phase : enregistrement du contrat
➡ Deuxième phase : enregistrement des messages pendant
l’exécution du cas de test
26. id mockClient = [OCMockObject mockForClass:[HTTPClient class]];
➡ permet de préciser les appels de méthodes que l’on attend
➡ ne supporte aucun appel en dehors de ceux définis
[[mockClient expect] prepare];
[[[mockClient stub] andReturn:@"tournament"] getBaseUrl];
[[[mockClient stub] andReturn:@"HTTPS"] getProtocol];
[[[mockClient stub] setTimeout:10];
27. id mockClient = [OCMockObject niceMockForClass:[HTTPClient class]];
➡ permet de préciser les appels de méthodes que l’on attend
➡ ignore tous les appels de méthodes non prévus
[[mock expect] prepare]
[[mock reject] badMethod]
28. id mockClient = [OCMockObject partialMockForObject:httpClient];
➡ permet de préciser les appels de méthodes que l’on attend
➡ tout en conservant le comportement de l’objet remplacé
[[[mock expect] andForwardToRealObject] prepare]
29. id mockObserver = [OCMockObject observerMock];
➡ permet d’observer des notifications
[notificationCenter addMockObserver:mockObserver
name:notificationName
object:nil];
[[mockObserver expect] notificationWithName:notificationName
object:[OCMArg any]]
35. Pourquoi les utiliser ?
➡ minimisation des interactions
➡ minimisation de l’exposition de l’état de l’objet testé
➡ tests plus rapide
36. Ce qu’il m’ont apporté ?
➡ différencier les tests d’état des tests de collaboration
➡ nouvel angle d’analyse d’un design : l’interaction VS la
classification
➡ l’importance d’avoir des dépendances explicites