Comment fournir stdin, aux fichiers et variable d'environnement entrées de Python tests unitaires?
Comment écrire des tests où les conditions comme les suivantes se posent:
- Test de la Saisie de l'utilisateur.
- Entrée de Test de lecture à partir d'un fichier.
- Entrée de Test de lecture à partir d'une variable d'environnement.
Ce serait super si quelqu'un pouvait me montrer comment aborder les scénarios mentionnés ci-dessus; il avait encore être génial si vous pouviez m'indiquer quelques docs/articles/messages de blog sur lequel j'ai pu
lire.
- vérifier si j'ai bien compris votre question correctement: ce que vous voulez savoir, c'est: comment faire pour tester si un fichier exécutable ou un script, compte tenu de certains intrants tels que stdin/variables d'environnement donne les résultats attendus, tels que stdout, stderr ou de sortie d'état?
- J'ai exactement besoin de cela, savez-vous comment le faire?
- voir ma réponse 🙂 stackoverflow.com/a/15874291/895245
Vous devez vous connecter pour publier un commentaire.
Tous les trois situations que vous avez décrites sont là où vous en avez besoin spécifiquement de sortir de votre chemin pour vous assurer que vous utilisez le couplage lâche dans votre conception.
Ne vous vraiment besoin de test de l'unité Python
raw_input
méthode? Leopen
méthode?os.environ.get
? No.Vous devez configurer votre conception de sorte que vous pouvez les remplacer par d'autres moyens de récupération de l'entrée. Ensuite, lors de vos tests unitaires, vous allez lancer dans une souche de la sorte, qui ne fait pas appel
raw_input
ouopen
.Par exemple, votre code peut être quelque chose comme:
La session ressemble:
Alors votre test sera comme:
Garder à l'esprit que vous ne devriez pas avoir à tester une langue IO installations (sauf si vous êtes l'un de la conception de la langue, qui est une autre situation tout à fait).
Si vous êtes immobilisé à l'aide de raw_input (ou de toute autre source d'entrée), je suis un grand partisan de la maquette de la bibliothèque. Étant donné que le code qui Marque Rushakoff utilisé dans son exemple:
Votre code de test pourrait utiliser maquette:
Ces affirmations passer. Notez que side_effect renvoie les éléments de la liste dans l'ordre. Il peut faire beaucoup plus! Je voudrais vous recommandons de vérifier la documentation.
__builtin__
a été rebaptisé commebuiltins
etraw_input()
est devenuinput()
, donc:mock.patch('builtins.input', return_value='dew')
from unittest import mock
.Si vous pouvez vous en sortir sans l'aide d'un processus externe, le faire.
Cependant, il y a des situations où c'est compliqué, et vous voulez vraiment utiliser, par exemple, vous souhaitez tester l'interface de ligne de commande d'un C exécutable.
La saisie de l'utilisateur
Utilisation
subprocess.Popen
comme dans:Il n'y a pas de différence entre la prise d'entrée d'un utilisateur et de le prendre à partir d'un tuyau pour la saisie effectuée avec des méthodes comme
raw_input
ousys.stdin.read()
.Fichiers
Créer un répertoire temporaire et de créer les fichiers que vous souhaitez lire à partir de là sur votre test
setUp
méthodes:Faire la lecture du fichier dans les tests.
Supprimer la temp dir par la suite.
Il est assez compliqué de lecture de fichiers, et la plupart des programmes peuvent lire soit à partir de fichiers ou à partir de l'entrée standard (par exemple, avec
fileinput
). Donc, si vous voulez tester c'est ce qui arrive quand une certaine contenu est entrée, et votre programme accepte l'entrée standard STDIN, il suffit d'utiliserPopen
pour tester le programme.Variables d'environnement
os.environ["THE_VAR"] = "the_val"
del os.environ["THE_VAR"]
os.environ = {'a':'b'}
ne fonctionne passubprocess.Popen
. L'environnement est hérité du processus appelant.Code Du Modèle
J'ai un module sur mon github que les tests
STDOUT
,STDERR
et le statut de sortie donnéSTDIN
, arguments de ligne de commande et de l'environnement. Vérifiez également les tests de ce module dans le cadre du "tests" dir. Il doit y avoir beaucoup mieux de modules pour ce, afin de prendre le mien, juste à des fins d'apprentissage.À l'aide de pytest: