6
votes

Test de l'unité Python avec mot de passe entré par l'utilisateur

J'essaie d'appuyer sur le code Python à tester un service à distance. J'utilise Pyunit avec Python 2.7.

dans la méthode SetupClass , le code invite l'utilisateur à entrer le mot de passe du service. Je veux garder tout ce qui est modulaire, j'ai donc créé des classes de test d'unité distinctes pour chaque classe étant testée. Ces classes ont tous accès au même service à distance et utilisent tous une définition unique de la méthode SETUPCLASCLASC FOM A SUPER CLASE.

Mon problème est que je dois rentrer dans le Mot de passe plusieurs fois (une fois pour chaque classe de test). Je suis fainéant. Je veux seulement entrer le mot de passe une fois pour tous les tests unitaires. Je pourrais éviter le problème en codant durement le mot de passe dans le test de l'unité, mais c'est une idée terrible. L'autre option consiste à repousser tout en une classe massive dérivée de unitest.descasse , mais je veux éviter cet itinéraire parce que j'aime la modularisation.

Voici comment le code est structuré: xxx

Dans cet exemple, je devrais entrer deux fois sur le mot de passe: une fois pour la classe A et une fois pour la classe B .

Quelqu'un a-t-il des conseils sur une manière sécurisée pour moi de faire une entrée de mot de passe ponctuelle juste au début du test de l'unité? Merci!


2 commentaires

Connexes: Écrire un test fonctionnel Python qui nécessite un nom d'utilisateur et un mot de passe


En accédant à un service distant à partir de vos tests de l'unité, vous testez réellement ce service avec vos classes. Pourquoi ne vous moquez-vous pas du service à distance?


3 Réponses :


4
votes

La définition de la classe est exécutée une fois.

import unittest
from getpass import getpass

class TestCommon(unittest.TestCase):
    pwd = getpass()

class test_A(TestCommon):
    def test_a(self):
        self.assertEqual(self.pwd, 'secret')

class test_B(TestCommon):
    def test_b(self):
        reversed_pwd = self.pwd[::-1]
        self.assertEqual(reversed_pwd, 'terces')


3 commentaires

Lorsque j'exécute la commande python -m unittest découvre i obtenez-y deux fois pour le mot de passe. Est-ce parce que je définis la SETUPCLASS () dans la superclasse? Devrais-je le réécrire comme votre exemple de code?


@ROBOTERD, comment accédez-vous au mot de passe dans les sous-classes?


@ROBOTERD, si vous accédez au mot de passe en sous-classes sous forme self.pwd ou testcommon.pwd , ne réécrivez que la partie de testcommon.



0
votes

Dans votre fonction SetupClass () CODE>, vous pouvez enregistrer le mot de passe en tant que propriété de auto code>, puis effectuez chaque test une partie de votre testcommon code > classe.

import unittest
from getpass import getpass

class TestCommon(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        self.pwd = getpass()

    def test_A(self):
        self.assertEqual(self.pwd, 'TEST A')

    def test_B(self):
        self.assertEqual(self.pwd, 'TEST B')


1 commentaires

Je pense que setupclass () est appelé chaque sous-classe de testcommon , cela me forcerait donc à entrer le mot de passe plusieurs fois.



0
votes

Si vous souhaitez automatiser pleinement vos tests, je vous recommande de stocker votre mot de passe en tant que variable d'environnement . strong>

import os
os.environ["password"] = "my_secret_password"


0 commentaires