Est-il acceptable d'éviter de tester les classes de base?


15

J'ai une classe de base avec une bonne quantité de "méta programmation" pour lui donner la flexibilité / abstraction dont elle a besoin pour être plutôt générique.

J'ai beaucoup de sous-classes utilisant les méthodes communes dans la classe de base, et j'ai des tests unitaires axés sur le comportement couvrant tous les cas dans chaque sous-classe.

Est-il correct de sauter le test de la classe de base?


1
Une chose que je fais parfois lorsque je commence à me poser cette question est d'essayer de casser le code. Lancez une entrée invalide, spécifiez des valeurs de configuration incorrectes, etc.
Zymus

Réponses:


31

Pour vérifier si vous avez suffisamment de tests ou non, vous pouvez vérifier votre couverture de code et votre couverture de branche induite par les tests (peut-être en utilisant un outil de couverture, peut-être manuellement en examinant les chemins de code ou en utilisant un débogueur).

Si vous arrivez à la conclusion que les tests pour les sous-classes vous offrent une couverture suffisamment élevée pour le code de vos classes de base, l'ajout de tests supplémentaires ne vous apportera évidemment pas beaucoup d'avantages. D'un autre côté, s'il existe des chemins de code que vous ne pouvez tester qu'en ajoutant directement des tests spécifiques en utilisant la classe de base, vous devez suivre cette voie.

Une autre raison possible pour "tester directement votre classe de base" est que vous souhaitez tester une fonction spécifique de cette classe "de manière isolée". Parfois, il peut être plus facile de concevoir des cas de test directement pour une méthode spécifique, au lieu de tester uniquement cette méthode indirectement en appelant les méthodes de vos sous-classes qui utilisent cette méthode.

Notez que lorsque vous avez une classe de base générique pour laquelle le scénario d'utilisation typique consiste à dériver une sous-classe, votre classe de base est probablement abstraite. Donc, pour tester une telle classe, vous devez quand même faire une dérivation. Pour cette situation, tester "la classe de base directement" pourrait bien sûr signifier ajouter une dérivation spéciale uniquement à des fins de test.


Oui, je suis d'accord avec les tests unitaires directs sur la classe de base pour les méthodes définies de manière plus tangible. Ce que je ne voulais pas faire, c'est tester toute la méta-programmation car les tests unitaires sur les sous-classes testent implicitement ce genre de choses.
Nathan

4
Concevoir une classe qui étend la classe de base / abstraite qui n'existe que dans le répertoire de test et ne sert qu'à exposer / instancier la classe de base est une approche parfaitement légitime et raisonnable pour obtenir la couverture appropriée de la classe de base et l'assurance que les méthodes sous-jacentes sont fonctionne correctement en isolant les classes plus complexes qui sont utilisées.

@MichaelT: oui. Ma réponse semble-t-elle avoir une opinion différente à ce sujet?
Doc Brown

@DocBrown pas du tout - vous avez clairement exprimé ce point. J'ajoutais simplement une explication supplémentaire que j'aurais écrite dans ma propre réponse (si vous ne l'aviez pas déjà dit). Je ne veux pas écrire une réponse qui aurait commencé "Je suis d'accord avec tout ce que Doc a dit, mais je veux spécifiquement appeler et écrire plus sur ..."

2

Des tests automatisés ont été créés pour le bénéfice des programmeurs, les programmeurs n'ont pas été créés pour servir les tests.

Nous avons des tests pour nous rendre plus productifs et réduire le nombre de «problèmes» dont se plaignent les clients.

Donc, étant donné que vous disposez de tests unitaires axés sur le comportement couvrant tous les cas dans chaque sous-classe, il n'y a aucun avantage pour le client à tester également la classe de base directement. Cela peut être confirmé en changeant du code dans la classe de base et en voyant si un test échoue, par exemple en commun une ligne de code, ou en ajoutant un «pas» à une «instruction if». (Vérifier simplement que chaque ligne de code est couverte par les tests n'est pas suffisant.)

Il nous reste alors à vous demander si le test vous rendrait plus productif . Cela peut se produire de plusieurs manières.

  • Vous permettre de réfléchir plus clairement au code - au fur et à mesure que le code est écrit, cela est peu probable dans ce cas.
  • Vous permettant de tester du code dans la classe de base de manière isolée, donc déboguez-le plus rapidement, encore une fois peu probable dans le cas car le code fonctionne déjà.
  • Vous permettant de changer le code dans la classe de base sans avoir à comprendre les détails de la logique dans les sous-classes - peut-être si vous refactorisez le code ???

Donc, étant donné que les sous-classes fonctionnent, je ne vois aucun intérêt à écrire des tests directs pour la classe de base. Ce n'est pas aujourd'hui, qu'il n'y aurait pas eu d'avantages à écrire ces tests à un stade précoce.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.