38 votes

Est-il possible de modifier la visibilité de la méthode pour le test unitaire?

De nombreuses fois, je me retrouve déchiré entre faire une méthode privée pour empêcher quelqu'un d'appeler dans un contexte qui n'a pas de sens (ou serait-vis de l'état interne de l'objet en cause), ou de faire la méthode public (ou généralement interne) afin de les exposer à l'unité de montage d'essai. Je me demandais juste ce que le Débordement de la Pile de la communauté de la pensée de ce dilemme?

Donc je suppose que la question est vraiment, est-il préférable de se concentrer sur la testabilité ou sur le maintien d'une bonne encapsulation?

Dernièrement, j'ai été penchant vers la testabilité, que la plupart du code est uniquement destiné à être exploité par un petit groupe de développeurs, mais j'ai pensé que je voudrais voir ce que tout le monde a pensé?

23voto

Charles Points 1666

Ses PAS ok pour le changement de la méthode de la visibilité sur les méthodes que les clients ou les utilisateurs peuvent voir. Le faire, c'est laid, un hack, expose des méthodes que tout utilisateur idiot pourrait essayer d'utiliser et de faire exploser votre app... c'est une responsabilité que vous n'avez pas besoin.

Vous êtes à l'aide de C# oui? Découvrez le fonctionnement interne visible à l'attribut de la classe. Vous pouvez déclarer vos tests méthodes internes, et de permettre à votre appareil de test de l'assemblée accès à votre intérieur.

16voto

jrista Points 20950

Elle dépend de la méthode fait partie d'une API publique ou pas. Si une méthode n'appartient pas à la partie d'une API publique, mais est appelé publiquement à partir d'autres types au sein de la même assemblée, l'utilisation interne, l'ami de votre unité de montage d'essai, et de l'unité de test.

Cependant, si la méthode n'est pas/ne devrait pas faire partie d'une API publique, et il n'est pas appelé par d'autres types interne à l'assemblée, de NE PAS le tester directement. Il doit être protégé ou privé, et il ne doit être testé indirectement par unité de test de votre API publique. Si vous écrivez des tests unitaires pour les non-public (ou de ce que devrait être non-public) les membres de votre types, vous êtes de liaison code de test pour la mise en œuvre interne de détails.

C'est un mauvais type de couplage, on augmente la quantité de tests unitaires dont vous avez besoin, augmente la charge de travail à la fois dans le court terme (plus de tests unitaires) ainsi que dans le long terme (plus de test à l'entretien et à la modification de la réponse à la refactorisation de la mise en œuvre interne de détails). Un autre problème avec le test de non-membres du public, c'est que votre code de test qui peut ne pas être requis ou utilisés. Un EXCELLENT moyen de trouver de code mort, c'est quand il n'est pas couvert par l'un de vos tests unitaires lors de votre API publique est couverte à 100%. La suppression du code mort est une excellente façon de garder votre base de code maigre et moyenne, et est impossible si vous n'êtes pas prudent à propos de ce que vous mettez dans votre API publique, et quelles parties de votre code de test de l'unité.

EDIT: Une rapide remarque supplémentaire...avec un plan bien conçu public de l'API, vous pouvez très efficacement l'utilisation d'un outil tel que Microsoft PEX pour générer automatiquement la pleine couverture des tests unitaires qui testent chaque chemin d'exécution de votre code. Combiné avec quelques manuellement des tests écrits qui couvrent le comportement critique, ce qui n'est pas couvert peut être considéré comme du code mort et retiré, et vous pouvez considérablement raccourci de votre processus de tests unitaires.

2voto

David Johnstone Points 10565

C'est une pensée commune.

Il est généralement préférable de tester les méthodes privées par des tests méthodes publiques que de les appeler (si vous n'avez pas explicitement tester les méthodes privées). Cependant, je comprends qu'il y a des moments où vous avez vraiment envie de tester ces méthodes privées.

Les réponses à cette question (Java) et cette question (.NET) doit être utile.

Pour répondre à la question: non, vous ne devez pas modifier la visibilité des méthodes pour le bien des essais. En général, vous ne devriez pas mettre à l'essai les méthodes privées, et quand vous le faites, il ya de meilleures façons de le faire.

1voto

TrueWill Points 14855

En général je suis d'accord avec @jrista. Mais, comme d'habitude, ça dépend.

Lorsque vous essayez de travailler avec le code existant, la clé est de le faire en vertu de test. Après cela, vous pouvez ajouter des tests pour les nouvelles fonctionnalités et les bugs existants, refactoriser pour améliorer la conception, etc. C'est risqué sans tests. Code Legacy a tendance à être en proie à des dépendances, et est souvent extrêmement difficile d'obtenir en vertu de test.

En Travaillant Efficacement avec le Code existant, Michael Plumes suggère plusieurs techniques pour obtenir le code à tester. Beaucoup de ces techniques impliquent de briser l'encapsulation ou de compliquer la conception, et l'auteur est à l'avant à ce sujet. Une fois que les tests sont en place, le code peut être amélioré en toute sécurité.

Donc pour le code de legs, de faire ce que vous avez à faire.

0voto

MrLane Points 889

Dans .NET, vous devez utiliser des Accesseurs pour les tests unitaires, même plutôt que de la InternalsVisibleTo attribut. Les accesseurs de vous permettre d'accéder à n'importe quelle méthode de la classe, même si elle est privée. Ils vous permettent même de tester les classes abstraites à l'aide d'un vide se moquer objet dérivé (voir le "PrivateObject" de la classe).

Fondamentalement, dans le projet de test que vous utilisez l'accesseur de la classe, plutôt que la classe réelle avec les méthodes que vous souhaitez tester. L'accesseur de la classe est la même que la "vraie" classe, à l'exception de tout ce qui est public de votre projet de test. Visual studio permet de générer les accesseurs pour vous.

Ne JAMAIS faire un type plus visible pour faciliter les tests unitaires.

L'OMI est-il FAUX de dire que vous ne devriez pas de test de l'unité des méthodes privées. Les tests unitaires sont d'une valeur exceptionnelle pour les tests de régression et il n'ya aucune raison pourquoi les méthodes privées ne devraient pas être régression granulaire des tests unitaires.

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