Python importations pour les tests à l'aide de nez - quelle est la meilleure pratique pour les importations de modules au-dessus de package en cours
C'est une question qui est fréquemment demandé dans différentes formes, et souvent obtient "lol, vous ne le font pas correctement" les réponses. Assez sûr que c'est parce qu'il y a un sens commun scénario de gens (dont moi) sont en train de l'utiliser comme une mise en œuvre, et la solution n'est pas évidente (si vous ne l'avez pas fait avant).
Accepterait une réponse "vous permet de la 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
De course nosetests dans le répertoire racine conduit à:
ImportError: No module named code.sut
Avenues parcourue:
a) faire un par rapport à l'aide de
from ..code import sut
b) ajouter la racine du projet de PYTHONPATH
c) utiliser le
sys.path.append
pour ajouter le chemin .. avant que les importations au début de chaque module de test.
d) n'oubliez pas de faire un
setup.py
sur le projet d'installer les modules dans le site-packages avant l'exécution des tests.
Ainsi, l'exigence est d'avoir des tests situé sous le package de test de racine qui ont accès au projet. Chacun des ci-dessus ne se sentent pas "naturel" pour moi, se sont avérés problématiques ou sembler trop dur travail!
En java, cela fonctionne, mais, fondamentalement, par la force de votre outil de construction /IDE de placer tous vos classes sur le chemin de la classe. Peut-être le problème est que j'attends "magie" de Python? L'avons noté dans le Flacon webframework tests, l'option d) semble être préféré.
Dans tous les cas, les déclarations ci-dessous recommander une solution serait de supprimer la sensation de "unnaturalness" dans mon propre.
- Liées à la stackoverflow.com/questions/6323860/sibling-package-imports/... mais pas une copie exacte.
- Cette belle résume 80 à 90% de ma situation - si et seulement si il existe une clarification de savoir si ou de ne pas virtualenv serait de changer la réponse...
Vous devez vous connecter pour publier un commentaire.
Vous avez répondu à votre question assez bien déjà..
D (à installer à l'emplacement du système) est préféré du code distribuable. Habituellement, j'utilise des C (modifier sys.chemin d'accès) parce que je ne veux pas à l'échelle du système installe de mes des centaines de libs. En théorie, Une (relative à l'importation) semble plus agréable, mais il y a des cas où il échoue.
B (PYTHONPATH) est juste, vraiment fins de test uniquement, à mon avis.
Qui résume assez bien l'ensemble des options. L'option que vous préférez (Python comme par magie sait où chercher), c'est vraiment pas une solution viable car il peut conduire à des résultats imprévisibles, comme magiquement à trouver les bibliothèques de projets indépendants.
À mon avis, la meilleure chose à faire est de mettre cela au point d'entrée(s) à votre programme:
append
au lieu de+
.J'ai eu le même problème et trouvé une réponse dans une question connexe de travail pour moi.
sys.path
. Une bonne explication de django-nez lui-même: github.com/django-nose/...sys.path
(tout comme le python unitest module) ainsi que est le répertoire contenant le dessus du paquet actuel de l'arbreJe sais il n'y est une réponse cochée et je pense toujours que c'est une bonne raison de partager d'autres alternatives 🙂
Il y a un nez-pathmunge vous donnant un contrôle pour définir
sys.path
tout en invoquantnosestests
.