14 votes

En Python, comment puis-je écrire des tests unitaires qui peuvent accéder à des attributs privés sans les exposer ?

J'essaie d'améliorer la façon dont j'écris mes cas de tests unitaires pour mes programmes Python. Je remarque que dans certains cas, il serait vraiment utile d'avoir accès aux membres privés pour s'assurer qu'une méthode fonctionne correctement. Par exemple, lorsqu'on essaie de tester le comportement d'une méthode qui n'a pas d'autre valeur de retour attendue que None. Je sais que la façon la plus simple et la plus mauvaise de procéder serait de transformer les attributs privés en attributs protégés et de les tester directement. Cependant, j'aimerais trouver un moyen qui n'expose pas autant l'interface.

Alors comment puis-je tester les attributs privés dans les classes sans les exposer dans l'interface, ou, le cas échéant, une meilleure façon de tester un tel scénario afin que l'accès aux attributs privés ne soit pas nécessairement nécessaire pour un test unitaire correct ?

22voto

Fred Larson Points 27404

Rien n'est privé en Python. Si vous utilisez le préfixe double soulignement sur les variables membres, le nom est simplement tronqué. Vous pouvez y accéder en qualifiant le nom sous la forme _Class__member . Cela permettra d'accéder à la __member dans la classe Class .

Voir aussi cette question : Pourquoi les méthodes "privées" de Python ne sont-elles pas réellement privées ?

4voto

Gishu Points 59012

Je vais partir dans une autre direction...

Essayez d'écrire des tests unitaires qui affirment le comportement public sur l'état privé. Disons que vous appelez votre méthode void A() qui modifie l'état interne. Maintenant, si la méthode est appelée et que l'état change, il y aura un changement observable dans votre petit univers de code. Peut-être que B() se comporte maintenant différemment. Donc mon test serait... (en banalisant l'exemple)

void MyTest()
{
   Assert.That(B(), Is.False);
   A();
   Assert.That(B(), Is.True);
}

Évitez Intimité inappropriée entre le test et le SUT.

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