92 votes

Devrait Privé/Protégé méthodes d'être sous l'unité de test?

En TDD développement, la première chose que vous avez généralement à faire est de créer votre interface, puis de commencer à écrire des tests unitaires à l'encontre de cette interface. Comme vous le progrès à travers le processus TDD vous finirait par la création d'une classe qui implémente l'interface, et puis à un certain moment de votre unité de test de passage.

Maintenant, ma question est sur le privé et protégé des méthodes que je pourrais avoir à écrire dans ma classe à l'appui des méthodes/propriétés exposées par l'interface:

  • Si le privé méthodes de la classe ont leurs propres tests unitaires?

  • Si le protégé des méthodes de la classe ont leurs propres tests unitaires?

Mes pensées:

  • Surtout parce que je suis de codage pour les interfaces, je ne devrais pas vous soucier de la protection privée des méthodes comme ils sont des boîtes noires.

  • Parce que je suis en utilisant les interfaces, je suis en train d'écrire des tests unitaires pour valider que le contrat défini est correctement mise en œuvre par les différentes classes qui implémentent l'interface, encore une fois, je ne devrais pas vous soucier de la privé/protégé méthodes et qu'elle doit être exercée par les tests unitaires que d'appeler les méthodes/propriétés définies par l'interface.

  • Si mon code-couverture n'est pas de montrer que l'protected/private méthodes sont frappés, alors je n'ai pas le droit de l'unité-tests ou j'ai du code qui n'est pas utilisé et doit être supprimé.

124voto

kwbeam Points 588

Non, je ne pense pas que de tester des méthodes privées ou protégées. Le secteur privé et protégé méthodes d'une classe ne font pas partie de l'interface publique, afin de ne pas exposer le comportement du public. En général, ces méthodes sont créés par des refactorings vous appliquer une fois que vous avez effectué votre test en vert.

Si ces méthodes sont testées implicitement par les tests qui affirment le comportement de votre interface publique.

Sur une note plus philosophique note, rappelez-vous que vous faites des tests de comportement, pas de méthodes. Donc, si vous pensez à l'ensemble des choses que la classe sous test peut faire, aussi longtemps que vous pouvez tester et d'affirmer que la classe se comporte comme prévu, qu'il y a des privés (et protégé) les méthodes qui sont utilisées en interne par la classe pour mettre en œuvre ce comportement est hors de propos. Ces méthodes sont les détails de l'implémentation du comportement du public.

63voto

Charles Roth Points 41

Je suis en désaccord avec la plupart des affiches.

La règle la plus importante est: CODE de TRAVAIL l'emporte sur THÉORIQUE des RÈGLES sur public/protected/private.

Votre code doit être testée. Si vous pouvez vous y rendre par l'écriture de tests pour les méthodes publiques, que suffisamment d'exercice de l'protected/private méthodes, c'est génial.

Si vous ne pouvez pas, alors soit refactoriser de sorte que vous pouvez, ou plier le protected/private règles.

Il y a une grande histoire au sujet d'un psychologue qui a donné à des enfants d'un test. Il a donné à chaque enfant de deux planches de bois avec une corde attachée à chaque extrémité, et leur a demandé de traverser une pièce, w/o de toucher leurs pieds au sol, aussi vite que possible. Tous les enfants utilisés les planches comme des petits skis, un pied sur chaque carte, en les tenant par les cordes, et glissant sur le sol. Puis il leur a donné la même tâche, mais en utilisant UN seul conseil d'administration. Ils pivotant/"marché" sur le sol, un pied sur chaque extrémité de la carte unique -- et ils ont été plus RAPIDE!

Tout simplement parce que Java (ou autre langue) dispose d'une fonction (privé/protégé/public) ne signifie pas nécessairement que vous écrivez un code de meilleure qualité parce que vous l'utilisez!

Maintenant, il y aura toujours des façons d'optimiser/réduire ce conflit. Dans la plupart des langues, vous pouvez faire une méthode protégée (la place publique), et de mettre de la classe de test dans le même package (ou autre), et la méthode seront disponibles pour le test. Il y a des annotations qui peuvent aider, comme décrit par d'autres affiches. Vous pouvez utiliser la réflexion pour obtenir les méthodes privées (beurk).

Le contexte est également importante. Si vous écrivez une API pour l'utilisation par les gens de l'extérieur, public/privé est de plus en plus important. Si c'est un projet interne-qui se soucie vraiment?

Mais à la fin de la journée, pensez à la façon dont de nombreux bugs ont été causés par le manque de dépistage. Puis comparer à la façon dont de nombreux bugs ont été causés par "trop visible" des méthodes. Cette réponse devrait conduire votre décision.

35voto

Lunivore Points 9281

Vous avez écrit:

En TDD développement, la première chose généralement, vous faire est de créer votre interface, puis de commencer à écrire votre les tests unitaires à l'encontre de cette interface. Comme vous le progrès à travers le processus TDD vous finirait par créer une classe qui implémente l'interface, puis à un certain point de votre unité de test de passage.

S'il vous plaît laissez-moi de reformuler ce dans la BDD langue:

Lorsque décrivant la raison pour laquelle une classe est précieux et comment il se comporte, la première chose que vous généralement faire est de créer un exemple de comment utiliser la classe, souvent par l'intermédiaire de son interface*. À mesure que vous ajoutez comportement souhaité vous finissez par la création d'une classe qui prévoit que la valeur, et puis à un certain pointez votre exemple fonctionne.

*Peut être un réel Interface ou tout simplement de la accessibles de l'API de la classe, par exemple: Ruby ne pas avoir des interfaces.

C'est pourquoi vous ne testez pas les méthodes privées - parce qu'un test est un exemple de comment utiliser la classe, et que vous ne pouvez pas les utiliser. Quelque chose que vous pouvez faire si vous voulez est de déléguer les responsabilités dans le privé, les méthodes à une collaboration de classe, puis se moquer / stub de l'aide.

Avec les méthodes protected, vous êtes en train de dire qu'une classe qui étend la classe devrait avoir un certain comportement particulier et de fournir de la valeur. Vous pouvez alors utiliser les extensions de votre classe afin de démontrer que le comportement. Par exemple, si vous écrivez une collection ordonnée de classe, vous pouvez démontrer que deux extensions avec le même contenu démontré l'égalité.

Espérons que cette aide!

24voto

forsvarir Points 4122

Lorsque vous êtes à l'écriture de tests unitaires pour votre classe, vous ne devriez pas nécessairement se préoccuper de savoir si ou non la fonctionnalité de la classe est directement mis en œuvre dans la méthode sur l'interface publique, ou si elle est mise en œuvre dans une série de méthodes privées. Donc, oui, vous devriez être tester vos méthodes privées, mais vous ne devriez pas avoir besoin de les appeler directement à partir de votre code de test dans le but de le faire (tester directement les soldats étroitement les couples de votre mise en œuvre de vos tests et rend refactoring unecessarily dur).

Les méthodes Protected forme d'un autre contrat entre votre classe et de ses futurs enfants, de sorte que vous devrait vraiment être de le tester dans une mesure similaire de votre interface publique pour s'assurer que le contrat est bien défini et exercé.

13voto

S.Lott Points 207588

Non! Seulement tester les interfaces.

Un des grands avantages du TDD est d'assurer que l'interface fonctionne peu importe la façon dont vous avez choisi de mettre en œuvre les méthodes privées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X