Python importe pour les tests en utilisant nez – quelle est la meilleure pratique pour les importations de modules au-dessus du package actuel

C’est une question qui est fréquemment posée sous différentes formes, et obtient souvent des réponses «lol tu ne le fais pas correctement». Bien sûr, c’est parce qu’il y a un scénario de bon sens que les gens (y compris moi) essayent d’utiliser comme implémentation, et la solution n’est pas évidente (si vous ne l’avez pas déjà fait).

Accepterait une réponse qui “laisse la mouche sortir de la bouteille”.

Donné

project/ __init__.py /code __init__.py sut.py /tests __init__.py test_sut.py 

Où tests_sut.py commence:

 import code.sut 

L’exécution de nosetests dans le répertoire racine mène à:

 ImportError: No module named code.sut 

Avenues parcourues:

a) faire une relation en utilisant

 from ..code import sut 

b) append la racine du projet à PYTHONPATH

c) utiliser le

 sys.path.append 

append le chemin .. avant les importations au début de chaque module de test.

d) rappelez-vous juste de faire un

 setup.py 

sur le projet pour installer les modules dans les packages de site avant d’exécuter des tests.


Il est donc nécessaire de placer les tests sous la racine du package de test qui ont access au projet. Chacune des situations ci-dessus ne me semble pas “naturelle”, se sont révélées problématiques ou semblent trop compliquées!

En Java, cela fonctionne, mais à la base de votre outil de compilation / IDE, en plaçant toutes vos classes sur le classpath. Peut-être que le problème est que je m’attends à “la magie” de Python? Avoir noté dans les tests Flame webframework, l’option d) semble être préférée.

Dans tous les cas, les déclarations ci-dessous recommandant une solution privilégiée élimineraient le sentiment de «non-naturel» dans les miens.

Vous avez déjà très bien répondu à votre question. D (installation sur l’emplacement du système) est préférable pour le code dissortingbuable. J’utilise généralement C (modifiez sys.path) car je ne souhaite pas installer au niveau du système mes centaines de bibliothèques personnalisées. En théorie A (importation relative) semble plus agréable, mais il y a des cas où cela échoue. B (PYTHONPATH) est sorti, uniquement à des fins de test, à mon avis.

Cela résume à peu près toutes les options. L’option que vous préférez (Python sait par magie où chercher) n’est en fait pas une solution viable, car elle peut entraîner des résultats imprévisibles, tels que la recherche automatique de bibliothèques à partir de projets indépendants.

À mon avis, la meilleure chose à faire est de mettre ceci au point d’entrée de votre programme:

 import sys, os sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path 

J’ai eu le même problème et trouvé une réponse dans une question connexe travail pour moi.

Supprimez simplement le __init__.py dans la racine du projet.

Je sais qu’il y a une réponse vérifiée et je pense toujours que c’est une bonne raison de partager d’autres alternatives 🙂

Il y a un capteur nasal qui vous permet de contrôler sys.path tout en invoquant les nosestests .