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.
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.
- Améliorez vos tests automatisés : Vous apprendrez comment transformez vos tests pénibles qui vous perdre votre temps en tests qui vous en font gagner. Il s'agit d'un cours en vidéo en français, à votre rythme.
- Aider vos équipes: J'ai des équipes à délivrer du meilleur logiciel plus rapidement. Ensemble, nous travaillerons sur les problèmes techniques, aussi bien au niveau du code, des tests ou de l'architecture, ou nous verrons comment modifier votre manière de travailler et votre organisation pour obtenir de meilleurs résultats, cela en fonction de vos besoins. Prenez un rendez-vous gratuit pour discuter de votre situation et que l'on voit ensemble comment je pourrais vous aider.
- Faire une présentation dans votre organisation: J'aime parler de certains sujets, et je peux venir le faire dans votre organisation (meetup, conference, entreprise, BBL). Si vous pensez que l'on peut préparer un sujet ensemble, discutons-en !