Comment tester une méthode privée ?
Tags: french, testing
Published: 2022-09-21 11:16:10

_Cet article a été posté précédemment sur [mon blog](https://blog.charlesdesneuf.com/articles/comment-tester-une-methode-privee/?utm_medium=social&utm_source=devto&utm_campaign=devto_article)._

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


_**Envie d'en apprendre davantage sur les tests ?**_

_J’ai créé une formation vidéo qui aide les développeuses et développeurs à [améliorer leurs tests automatisés](https://formation.charlesdesneuf.com/9e5b4913-ead7-4c2f-82c2-ac9a08b9a454)._

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