31
Anatomie du test — ForumPHP'12 Histoire Présentation

Anatomie du test

Embed Size (px)

DESCRIPTION

Le test, qu'il soit unitaire ou fonctionnel, est à la mode dans le monde du développement logiciel, suite entre autre à la mise en œuvre croissante des méthodes agiles et notamment de l'intégration continue ou des méthodes de développement telles que le TDD, le BDD ou la programmation par contrat. Récemment, ce phénomène a encore été amplifié au sein de la communauté PHP par l'apparition aux côtés de l'incontournable PHPUnit d'outils plus originaux tels que Behat, Praspel ou atoum qui permettent au développeur de rédiger des tests plus simplement. Pourtant, nous constatons tous les jours que le test conserve une grande part de mystère pour la plupart des développeurs, Bien souvent, ces derniers ne savent pas quoi tester, et encore moins comment écrire un test efficace ou mettre en place une politique de test pertinente. Certains s'interrogent par exemple sur la pertinence de leurs tests, se demandent s'il faut absolument tout tester, d'autres s'il est possible de tester la création d'un fichier, voir même s'il est intéressant de le faire, tandis que d'autres se demandent où se situe la frontière entre le test unitaire et le test fonctionnel ou s'il est nécessaire de tester toutes les méthodes d'une classe, alors que d'autres encore ne savent tout simplement pas par où commencer. Durant cette conférence, nous allons tenter, à l'aide de nos expériences respectives de créateur de framework de tests et de doctorat en informatique spécialisé dans le test, de répondre aux questions récurrentes que se pose une personne confrontée à la mise en place d'une politique de qualité logicielle en général et à l'écriture d'un test logiciel en particulier. À l'issue de cette foire aux questions didactique et interactive, vous devriez être capable d'aborder le test, indépendamment de sa nature, de manière plus sereine et efficace et produire ainsi un logiciel de la qualité que vous désirez.

Citation preview

Page 1: Anatomie du test

Anatomie du test — ForumPHP'12

Histoire

Présentation

Page 2: Anatomie du test

Bonjour à tous ! Je m'appelle Frédéric Hardy. J'ai commencé à mettre en œeuvre des tests sans le sa-voir en 1995 lorsque j'ai débuté ma formation universitaire, avant de commencer à réellement lesmettre en œeuvre en 2005. J'ai donc appris le test empiriquement, en les mettant en pratique dans lecadre de projets plus ou moins complexes. Depuis, j'ai créé le framework de tests unitaires atoum etj'en suis le développeur principal.

Bonjour à tous ! Je m'appelle Ivan Enderlin. Je prépare actuellement une thèse en Informatique, spé-

Page 3: Anatomie du test

Introduction

cialée dans la sécurité et sûreté du logiciel. Je suis également contributeur de divers logicielsopen-source comme PHP, Mozilla, Debian etc. Je suis enfin auteur et développeur principal de Hoa,un ensemble de bibliothèques PHP.

Aujourd'hui, le test devient à la mode dans le monde industriel. Les outils permettant de les mettre enœuvre sont de plus en plus nombreux et toujours plus évolués ; les techniques de travail changenttout comme les mentalités ; bref le test se démocratise gentiment. Cependant, l'information à leur su-jet est souvent fragmentée et parcellaire, si bien que la plupart des développeurs ont des difficultés àles appréhender correctement de manière globale et se posent beaucoup de questions.

L'histoire que nous allons vous raconter a pour but d'apporter quelques réponses aux questions quinous ont été le plus souvent posées.

Page 4: Anatomie du test

Il était une fois une équipe de développeurs qui souhaitait concevoir un programme répondant à unbesoin avec la meilleure qualité et assurance possible, et afin d'y arriver, ils décidèrent d'utiliser lestests.

Définition

Un test permet de confronter deux mondes : théorique et pratique. L'objectif est d'exécuter un SUT

Page 5: Anatomie du test

pour système sous test sous certaines conditions et contraintes, pour à la fin vérifier la sortie ou l'étatde ce SUT.

Dans le test dit manuel, c'est le testeur qui va écrire toutes les conditions d'exécution du SUT.

Et les oracles permettent de calculer les verdicts des tests : tout simplement si les tests ont été un suc-cès ou un échec.

Page 6: Anatomie du test

Les tests suivent tous ce processus à quelques nuances près.

Cependant, il est nettement plus confortable pour le développeur de faire exécuter les tests par unemachine, car elle est capable de les exécuter aussi souvent que nécessaire, automatiquement, et beau-coup plus efficacement et rapidement.

À ce stade, on parle de vérification de programme.

Page 7: Anatomie du test

Test unitaire

Et avant de tester le programme dans sa totalité, il est plus évident de tester des petites parties, lesunes après les autres. Nous allons donc chercher quelles sont les parties « atomiques » de notre pro-gramme, et le plus souvent, ce seront les fonctions ou les méthodes des classes. Pour faire une méta-phore, ce serait comme construire une maison sans avoir confiance dans ces fondations.

Nous parlons alors de tests unitaires, puisqu'ils ont pour but de vérifier le fonctionnement de la pluspetite unité de code existante, qui est alors le SUT évoqué précédemment.

Notre équipe de développeurs a donc commencé à écrire du code, puis ensuite à rédiger les tests cor-respondants afin de les exécuter régulièrement. Cela leur a été d'autant plus facile qu'un test unitaires'écrit souvent dans le même langage que celui utilisé pour écrire le code.

Page 8: Anatomie du test

Et pour se faciliter encore plus la tâche, ils ont utilisé un framework de tests unitaires, car c'est un ou-til dont le but est d'organiser, faciliter et simplifier l'écriture et l'exécution de un ou plusieurs tests(dans ce cas, on parle de suite de tests). Un tel framework doit également être capable de produiredes rapports dans différents formats qui permettront aux développeurs de pouvoir localiser avec pré-cision les tests qui ont échoué et la raison de cet échec.

Ces rapports peuvent également contenir d'autres informations, notamment des métriques permettant

Page 9: Anatomie du test

de qualifier la qualité des tests. Tout ces facteurs nous permettent de savoir quelle confiance avoirdans notre code.

Le choix d'un framework de test unitaires a été relativement simple pour notre équipe de développeurcar ils ont tout simplement expérimentés ceux qui leur semblaient intéressants. Leur choix a été tota-lement subjectif, mais ce n'est pas un mal car l'important n'est pas tant l'outil choisi que le fait d'êtreefficace avec.

Toutefois, le choix n'est pas anodin car ces outils sont en général très peu compatibles entre eux, etpar conséquence, il n'y a pas de solution simple et rapide permettant d'en changer.

Page 10: Anatomie du test

Notre équipe écrit donc des tests a posteriori de la rédaction de leur code avec leur framework detests unitaires favori. Cependant, ils n'ont pas tardé à réaliser que cette façon de faire présentait desinconvénients significatifs.

Testabilité

Tout d'abord, ils se sont aperçus que pour être testable, leur code devait forcément suivre un certainnombre de bonnes pratiques de développement, et le fait d'écrire leurs tests a posteriori rendait cettecontrainte difficile à satisfaire. Ils étaient alors obligé de modifier le code concerné et de faire plu-sieurs fois le même travail.

Page 11: Anatomie du test

De plus, ils se sont aperçus qu'ils développaient des fonctionnalités dont ils n'avaient pas besoin, cequi leur faisait encore perdre plus de temps.

Enfin, lors de la mise en œuvre de leur code au sein des tests, ils se rendaient parfois compte qu'iln'était pas pratique à utiliser, du fait d'une API mal pensée ou peu adaptée au contexte d'utilisation.

Ces trois problèmes étant induits par le fait d'écrire les tests unitaires après avoir écrit le code. À

Page 12: Anatomie du test

Test Driven Development

l'avenir, nos développeurs ont décidé de faire l'inverse : écrire les tests unitaires a priori.

Ce faisant, ils ont donc commencé à appliquer une méthode de développement connue sous l'acro-nyme TDD pour Test Driven Development.

Page 13: Anatomie du test

Cette méthode impose un développement itératif qui facilite la conception du code. Lorsque l'un denos développeurs veut écrire du code, il commence par écrire le test le plus simple possible permet-tant de le décrire, et en général il consiste à instancier une classe et à appeler la méthode devant êtretestée. Le développeur exécute alors ce test unitaire, qui aboutit forcément sur un échec puisque lecode correspondant n'existe pas encore.

La plupart des frameworks de tests matérialise l'échec sous la forme d'un message écrit en rouge,d'où l'expression « la barre est rouge ».

Page 14: Anatomie du test

C'est le signal qui autorise le développeur a écrire du code mais juste ce qui est nécessaire pour exé-cuter le test avec succès et que la « barre devienne verte ».

Comme la méthode de travail est itérative, le développeur recommence ce processus en écrivant unnouveau test et ainsi de suite jusqu'à ce que le code réponde à ses besoins.

Régression

Page 15: Anatomie du test

Évidemment, au cours de ce processus, une modification du code peut invalider un test déjà existant.Nous parlons de régression. Cependant, grâce aux tests justement, ces régressions sont détectées im-médiatement et peuvent être corriger rapidement grâce aux rapports générés par notre outil de test.

Malheureusement, il peut arriver que des régressions aient été introduites sans que les tests nepuissent les détecter immédiatement. Nos développeurs se sont demandés comment être sûr qu'untest soit de bonne qualité ? Dans un premier temps, les tests doivent représenter les exigences denotre code ou de notre projet. Mais nous voulons que les tests apportent un élément de sûreté (notam-ment avec la détection de régression).

Pour cela, nos développeurs ont écrit des tests positifs qui symbolisent un comportement normal,mais aussi des tests négatifs qui symbolisent un comportement anormal. Cette approche ajoute de lasûreté : le code fait ce qu'il doit faire et ne fait pas ce qu'il ne doit pas faire.

Couverture

Les résultats étaient nettement plus satisfaisant et leur code était devenu de bien meilleur qualité.Mais ce n'était pas suffisant car dans certains cas, ils découvraient encore des erreurs inattendues etdifficiles à détecter. Ils ont voulu qualifier la qualité des tests, savoir à quel point ils pouvaient avoirconfiance dans leurs tests.

Page 16: Anatomie du test

Heureusement, une métrique très utile dans le cas des tests unitaires est la couverture du code. Du-rant l'exécution d'un test, le framework utilisé va analyser quelle partie du code a été atteinte ou cou-verte. Une fois la suite de tests exécutée en entier, l'outil agrège toutes ces données et nous fournit unrapport détaillé sur la couverture. Plus elle est importante et plus nos tests sont de qualité.

A

B C

D

E F

G

x <= 0 x > 0

x := -x x := 1 - x

x := -1 x /= -1

x := 1 x := x + 1

writeln(x)

Il existe plusieurs niveaux de couverture. En réalité, nous pouvons représenter un code par son CFGpour Control Flow Graph. Chaque nœud dans ce graphe représente un bloc de code et chaque arc

Page 17: Anatomie du test

ping-pong

(orienté) représente un saut d'un nœud vers un autre. Une exécution d'un test sera représenté par unchemin dans ce graphe. Des couvertures évidentes apparaissent comme par exemple tous-les-arcs.D'autres sont plus difficiles comme par exemple tous-les-chemins. En effet, si notre code comporteune boucle, peut-être qu'une partie sera atteignable uniquement après i passages dans cette boucle ;c'est la couverture tous-les-i-chemins.

tous-les-chemins

tous-les-i-chemins

tous-les-arcs

tous-les-nœuds

toutes-les-c-utilisations

toutes-les-p-utilisations

toutes-les-DU-chemins

toutes-les-utilisations

toutes-les-définitions

Nous pouvons aussi prendre en compte la dépendance entre les variables, leurs utilisations etc., maisl'objectif ultime étant la couverture tous-les-chemins.

Malheureusement, selon les langages, rares sont les frameworks capables de détecter toutes les cou-vertures. La couverture la plus utilisée est tous-les-nœuds, elle reste faible mais c'est toujours uneavancée !

Mais nos développeurs ont trouvé une solution supplémentaire pour améliorer la qualité de leur codedirectement à la source : travailler en binôme.

Page 18: Anatomie du test

Ils se partagent ainsi le même écran, le même clavier et la même souris.

En dehors de l'équipe, certain ont pensé que c'était du gaspillage de ressources et qu'il fallait enconséquence arrêter immédiatement. Cependant, il leur a suffit de regarder attentivement les binômesen train de travailler pour qu'ils reconnaissent que la paire travaille bien simultanément et en équipe.En effet, lorsque l'un a le clavier, l'autre porte un regard critique sur le code qui est écrit, ce qui luipermet de répérer les erreurs de syntaxe, le non respect des conventions de codage et de faire dessuggestions souvent bienvenues pour améliorer la lisibilité, la maintenance ou l'efficacité du code oudes tests. De plus, deux cerveaux sont bien plus à même de répertorier l'ensemble des cas d'utilisa-tion possibles pour du code.

Page 19: Anatomie du test

Et d'ailleurs, pour y parvenir au mieux, nos développeurs pratiquent de temps à autre le ping-pong.L'un des deux rédige alors le test tandis que l'autre écrit le code permettant de l'exécuter avec succès.Les rôles sont régulièrement permutés afin d'éviter la lassitude et détecter plus d'erreurs.

Les résultats sont très impressionnants mais cette façon de travailler est éprouvante car elle ne laisseaucun répit aux deux développeurs, et elle ne doit donc être utilisée qu'à bon escient. Un dernieravantage du binômage : chaque membre est amené à travailler sur l'ensemble du code, car les bi-

Page 20: Anatomie du test

Mock

nômes sont très souvent modifiés et le partage des connaissances se fait donc au fil de l'eau de ma-nière transparente. Les membres de l'équipe ont tous une vision globale du code du programme.

Une vision globale mais pas totale. Dans certains cas, nos amis devaient travailler sur du code quinécessitait des parties encore non développées ou non finalisées, car le code a des dépendances. Parexemple, il arrive fréquemment qu'un test ait besoin d'accéder à un système de fichiers, à une base dedonnées ou bien encore à une connexion réseau, un Web service etc.

Or, si ce composant n'existe pas, cela est bloquant pour la tâche, et même s'il existe, il n'est pasévident de simuler un dysfonctionnement pour avoir une suite de test complète. C'est pourquoi nosdéveloppeurs ont décidé d'utiliser les mocks.

Page 21: Anatomie du test

Un mock est capable de simuler une dépendance. Son comportement est spécifié par le testeur. Grâceaux mocks, il devient possible de simuler des erreurs lors d'une sauvegarde dans un fichier ou lorsd'une connexion à une base de données ou encore à un réseau, tout en améliorant la portabilité destests. Un mock fait parti intégrante du test et il sera en conséquence toujours disponible indépendam-ment de son environnement d'exécution.

Nous remarquons aussi que les mocks améliorent la vitesse d'exécution des tests car, étant virtuels,

Page 22: Anatomie du test

Test d'intégration

ils ne dépendent d'aucune contrainte technique et s'exécutent beaucoup plus rapidement que leurséquivalents du monde réel. Lorsqu'un mock simule une connexion à un réseau, la latence du réseauou des serveurs n'a donc plus aucune influence sur la vitesse d'exécution des tests (sauf si le mock lespécifie bien entendu).

La mise en œuvre des tests unitaires et plus particulièrement du TDD ont permis à notre équipe nonseulement de gagner en qualité, ce qui était l'objectif de départ, mais aussi en productivité et enconfiance. D'autres effets positifs n'avaient même pas été anticipés. Par exemple, au début du projet,ils avaient alloué du temps pour la rédaction des test a posteriori, temps qui s'était révélé bien sou-vent insuffisant.

Or, avec le TDD, l'écriture des tests revient à développer le code du programme, ce qui revient à direque le coût d'écriture des tests est confondu avec le coût du développement. Et cerise sur le gâteaux,les développeurs ont réalisé que les tests peuvent servir de documentation ! Il est donc devenu totale-ment inutile d'allouer du temps spécifique à l'écriture des tests ou d'une catégorie de documentation,ce qui facilite la planification du projet et a permis d'améliorer la maîtrise des délais. Mais aussi, àchaque instant, notre équipe était certaine que l'existant fonctionnait.

Page 23: Anatomie du test

Toutefois, même si les parties unitaires étaient de qualité, des erreurs pouvaient apparaître au mo-ment d'assembler ces parties. Pour reprendre la métaphore sur la maison, les briques sont toutes bienréalisées mais personne n'a pensé à regarder si elles sont compatibles entre elles.

Pour cela, une technique complémentaire au test unitaire est le test d'intégration. Le test d'intégrationn'est pas très différent d'un test unitaire car le SUT est un agrégat d'unités de code.

Page 24: Anatomie du test

Test structurel

Test fonctionnel

En fait, nous manipulons toujours du code, nous avons toujours accès au code source. Et quand noustestons à partir du code, nous appelons ça le test structurel ou le test white-box (qui comprend la no-tion de couverture, de CFG etc.). Des outils adaptés au test unitaire seront probablement adaptés autest d'intégration.

Mais attention, les métriques pour qualifier la qualité d'un test d'intégration ne seront pas les mêmes.

C'est normal car les tests d'intégrations viennent compléter les tests unitaires, ils offrent une valida-tion à un niveau supérieur. Un test d'intégration se déroule dans un environnement très proche de ce-lui du monde réel une fois que toutes les dépendances ont été mises en place, a contrario des testsunitaires qui se basent sur des mocks. Le code peut se comporter différemment et dans ce contextedes bugs peuvent apparaîtrent. La complémentarité entre les techniques de tests est importante.

Armés de leurs tests unitaires et d'intégrations, notre équipe est donc maintenant certaine de disposerde briques élémentaires fiables et compatibles, nécessaires à la construction de leur programme. Ce-pendant, ces tests ne leur permettent pas de vérifier que le programme construit à partir de cesbriques de base répondra aux besoins de ses utilisateurs. Pour reprendre notre métaphore, la maisonest construite mais est-ce que la porte à 3 mètres du sol est pratique à utiliser ? Or, c'est justement lerôle des tests fonctionnels de vérifier que le code du programme répond aux besoin de l'utilisateur.

Page 25: Anatomie du test

Intégration continue

A l'instar du test unitaire ou d'intégration, le test fonctionnel doit valider le comportement du pro-gramme mais, une fois de plus, à un niveau supérieur. Cependant, il est très différent dans sa formecar il doit permettre de valider un comportement fonctionnel et non technique. C'est pourquoi il esttotalement indépendant à tout point de vue du langage utilisé pour le développement du programme.Il se présente le plus souvent comme un script essayant d'exprimer des séquences de manière simpleet naturelle permettant d'amener le système dans un état particulier pour ensuite valider cet état.L'objectif est de simuler un comportement type d'un utilisateur.

Évidemment, pour que tout ça soit réalisable, il faut la dernière version disponible du programme,compilée, assemblée et utilisable par les outils de test. Or, réunir tous ces paramètres à chaque modi-fication du code est une tâche longue et fastidieuse !

Page 26: Anatomie du test

Conclusion

C'est la raison pour laquelle notre équipe a mis en place une plateforme d'intégration continue qui ré-cupère les versions successives du code à tester, exécute les tests, compile et assemble le programmesi tous les indicateurs sont au vert. Le cas échéant, des notifications sont émises rapidement afind'avoir un retour immédiat. Ainsi, nos programmeurs gagnent vraiment en productivité et peuventcorriger leurs erreurs au plus tôt.

Cependant, les tests fonctionnels ont posé un problème à nos développeurs car, par habitude, ils onteu tout d'abord tendance à y décrire techniquement plutôt que fonctionnellement la façon dont le pro-gramme devrait fonctionner. Leurs premiers tests fonctionnels étaient étroitement lié au fonctionne-ment de leur code, et leur maintenance est vite devenue fastidieuse car chaque modification du codedevait obligatoirement être répercutée sur les tests concernées. Il leur a cependant suffit de se direque les tests fonctionnels devaient continuer à passer même après une refonte complète du code pourrésoudre ce problème. Les tests fonctionnels leur ont également permis de tester plusieurs interfacesutilisateur pour leur programme. En effet, un programme doit se comporter de la même façon indé-pendamment de la façon dont l'utilisateur l'utilise : en ligne de commande, via une interface gra-phique ou encore un navigateur Web.

Notre équipe de développement est donc aujourd'hui heureuse et à donner naissance à beaucoup deprogrammes depuis ses premiers pas dans l'univers du test. Grâce à la mise en œuvre du TDD et destests unitaires, d'intégration et fonctionnels, elle est aujourd'hui parfaitement à même de livrer ducode fiable et répondant aux besoins de ses utilisateurs en toute confiance. Grâce au binômage, cha-cun d'eux a une vision plus globale du code et aucun membre de l'équipe n'est l'expert exclusif d'unepartie du code. L'intégration continue leur permet de surveiller automatiquement que les modifica-tions ou les évolutions effectuées sur leur code n'a pas d'influence négative.

Page 27: Anatomie du test

Pour cela, il leur a fallu mettre en œuvre trois types de tests différents, chacun d'entre eux étant dédiéà un objectif clair et étant complémentaire des autres.

Notre histoire aurait pu être très différente car il n'y a pas qu'une seule façon de mettre en œuvre cor-rectement des tests. Il existe d'autres méthodes que le TDD, tout aussi pertinente, et différentes fa-çons de rédiger des tests, indépendamment de leur nature. De plus, notre histoire se déroule au paysdes « bisounours », où tout problème a une solution rapide et efficace avec un coût temporel ou fi-nancier nul, ce qui est très éloigné de la réalité. Dans le « vrai monde », il est en effet parfois néces-saire de devoir s'adapter pour faire face à des contraintes temporelles ou financières qui ne nous per-mettent pas de mettre en œuvre la totalité des tests que l'on souhaiterait utiliser. Dans ce contexte, leplus important est de garder à l'esprit que même faire un unique test, à la condition qu'il soit bienécrit évidemment, est bien plus pertinent que de ne pas faire de test du tout. Enfin, en fonction dulangage de programmation utilisé et des outils employés, les problèmes rencontrés et leur solutionpeuvent être très différents.

Page 28: Anatomie du test

One more thing : test automatique

Tout ce qui précède n'est donc pas une recette magique permettant d'écrire des tests pertinents et debonne qualité car il faut de toute façon du temps et de l'expérience pour y parvenir. Écrire un test estun métier.

On a surtout parlé de white-box mais vous aurez deviné qu'il existe aussi le black-box. En réalité,

Page 29: Anatomie du test

One more thing2 : quelques outils

c'est le test fonctionnel ! Quand on ne connaît pas le code ou que l'on n'y a pas accès, on est en boîtenoire. On a évoqué un moyen de tester son programme avec des scripts écrits manuellement, mais ilexiste d'autres techniques, plus coûteuses cependant et qui nécessitent plus de compétences, commele MbT pour le test à partir de modèle. L'idée est d'avoir un modèle formel qui décrit l'évolution dusystème à travers une vision abstraite de son fonctionnement. Un modèle est souvent caractérisé parune spécification la plus formelle possible. C'est grâce à son aspect abstrait que le MbT permet de gé-nérer des suites de tests automatiquement mais aussi d'analyser la conformance entre le modèle et lecode, normalement réalisés dos-à-dos par des équipes différentes. On peut également animer un mo-dèle pour détecter les erreurs de conceptions.

Mais comme précisé, ça coûte cher et c'est souvent dédié à des logiciels nécessitant une très haute sé-curité et sûreté. Heureusement, il existe le grey-box qui prend le meilleur des deux mondes ! On estsûr le code au niveau unitaire et on l'annote avec des contrats. Un contrat est constitué d'unepré-condition, d'une post-condition et d'invariants. On peut s'en servir de deux manières : utiliser lescontrats pour vérifier notre programme, un peu comme on le faisait avec du test unitaire manuel, oualors valider notre programme. L'idée est alors d'utiliser la pré-condition pour générer des données detests et utiliser la post-condition et les invariants comme oracle.

Vous aurez compris que les éléments clés dans le test automatique est la spécification (donnée parl'utilisateur) et la génération des données (par la machine) : comment générer des données réalistes ?Il faut assurer la meilleure couverture possible et le plus efficacement possible. Que choisir : généra-tion aléatoire, statique, dynamique, concolic, fuzzing, search-based … ? Autant de domaines à dé-couvrir (sans mauvais jeu de mots) !

Et c'est bien beau de générer des suites de tests mais comment les maintenir : lesquelles conservées,lesquelles mettre à jour, lesquelles supprimées ? Et on n'a pas non plus parlé des tests paramétrés, nides tests à partir de scenarii etc.

Heureusement que toutes ces questions ont des réponses, ou des bouts de réponses. En recherche, onvoit de plus en plus d'outils « intelligents » qui mélangent plusieurs techniques et qui sont utilisésdans l'industrie … pour de vrai ! N'oubliez pas que le test est un métier.

Page 30: Anatomie du test

Merci !

Du coup, voici quelques outils que vous pourrez utiliser. Pour du test structurel (white-box) manuelen PHP :

Pour du grey-box automatique en PHP :

Pour du test fonctionnel (black-box) manuel en PHP :

Pour du test fonctionnel (black-box) manuel pour interface graphique :

Enfin, pour de l'intégration continue :

N'oubliez pas que les outils sont souvent polyvalents !

atoum ;✪PHPUnit ;✪SimpleTest.✪

Praspel.✪

Behat.✪

CasperJS ;✪Sahi ;✪Selenium.✪

Squash ;✪Jenkins ;✪Sonar.✪

Page 31: Anatomie du test