Comment tester une méthode privée ?
Dans cet article quand j’utilise le terme "méthode privée" cela correspond aux méthodes qui ne sont pas accessibles depuis l’interface publique d’une classe. En PHP, par exemple, il peut s’agir de méthodes private
ou protected
.
On ne la teste pas. Ça, c’est la réponse courte. La réponse longue demande un peu plus d’effort.
Commençons par le commencement.
La question originale est trompeuse. En réalité on ne cherche pas à tester une méthode, quelle soit private
, protected
ou public
, mais un comportement. On veut savoir ce que fait notre logiciel, pas comment il le fait, et donc la manière dont on implémente ce comportement nous importe assez peu.
Évidemment, on va quand même retrouver une méthode publique comme point d’entrée du comportement, mais la méthode privée, elle, est un détail d’implémentation. Le comportement qui nous intéresse pourrait tout aussi bien être servi par une méthode publique qui contient l’ensemble du code nécessaire, ou une méthode publique qui délègue une partie du travail à une ou plusieurs méthodes privées, ou même encore à une ou plusieurs autres méthodes publiques d’autres classes. En somme, l’existence ou non d’une méthode privée ne nous intéresse pas.
Pour tester le comportement, on va donc se placer à l’endroit où l’on peut le déclencher et vérifier son bon déroulement, c’est-à-dire au niveau de la méthode publique. Au passage cela va "tester la méthode privée", ou plus précisément "exercer le code contenu dans la méthode privée". Encore une fois, on ne veut pas tester une méthode privée mais un comportement qui s’appuie sur une méthode privée. On peut dire que l'on "teste" la méthode privée via une méthode publique.
Oui, mais cette méthode privée est complexe
Ceci étant dit, il se peut que le code présent dans la méthode privée soit assez complexe pour que l’on ait envie de pouvoir exercer ce bout de code sans avoir à passer par la méthode publique. On veut ainsi éviter de devoir faire une mise en place de test complexe, d’avoir à zigzaguer au milieu du reste du code pour pouvoir se placer dans un cas particulier du comportement qui nous intéresse.
Tu en as marre de tes tests ?
J’ai créé une formation vidéo qui aide les développeuses et développeurs à améliorer leurs tests automatisés.
Dans cette formation je partage les idées et techniques qui permettent de rendre des tests lents, qui cassent à chaque modification du code et sont incompréhensibles en des tests avec lesquels on a plaisir à travailler.
Une solution couramment proposée est d’essayer de contourner le problème en rendant la méthode privée accessible. Ce qui peut se faire en utilisant le système de réflexion du langage. L’avantage de cette solution est que l’on n’a pas à toucher au code. En revanche on ajoute de la complexité à la mise en place de notre test et l’on augmente le couplage entre les tests et le code. Cela peut alors nuire à un potentiel futur refactoring, puisque les tests ont alors une connaissance assez fine de l’implémentation.
Une autre solution, bien meilleure selon moi, est d’écouter les tests. Comme très souvent, quand quelque chose est compliqué à tester ce ne sont pas les tests le problème mais la conception du code.
En nous montrant qu’un bout du comportement est complexe, si complexe que nous avons envie de pouvoir nous assurer de son bon fonctionnement séparément du reste les tests nous indiquent qu’il nous manque un concept, qu’il manque un collaborateur.
Il faut alors prendre le temps de trouver quel est ce concept, de le définir, de le nommer. On peut ensuite introduire ce nouveau concept dans notre code à l’aide d’une nouvelle classe et y transférer la méthode privée, que l’on rend publique au passage.
Cela nécessite, certes, de modifier le code, mais permet de faire naitre un vocabulaire plus riche pour discuter du problème que l’on cherche à résoudre. On est capable de documenter cette partie du comportement par elle-même au travers des tests.
On n’a pas non plus besoin d’utiliser d’astuces qui complexifient les tests, un simple appel à la nouvelle méthode publique suffit.
On a réussi à transformer notre problème. Puisqu’il n’y a plus de méthode privée on n’a plus besoin d’essayer de tester de méthode privée.
Voilà pourquoi la réponse longue à la question "Comment tester une méthode privée ?" est aussi "On ne la teste pas".
Et si vous voulez améliorer la manière dont vous écrivez des tests je ne peux que vous conseiller ma formation vidéo sur l'amélioration des tests automatisés. Avec cette formation vous saurez comment écrire des tests super lisibles, rapides, et maintenables. Il vous est aussi possible de prendre rendez-vous et voir ensemble comment je peux vous apporter mon aide ou simplement pour discuter.