Importer correctement avec pytest

J'ai juste configuré pour utiliser pytest avec Python 2.6. Il a bien fonctionné jusqu'à présent, à l'exception de la manipulation "importer" des déclarations: je n'arrive pas à obtenir pytest pour répondre aux importations de la même façon que mon programme n'.

Mon répertoire de la structure est comme suit:

src/
    main.py
    util.py
    test/
        test_util.py
    geom/
        vector.py
        region.py
        test/
            test_vector.py
            test_region.py

À courir, j'appelle python main.py de la src/.

Dans main.py je importer à la fois vecteur et de la région avec

from geom.region import Region
from geom.vector import Vector

Dans vector.py je l'importation de la région avec

from geom.region import Region

Ces tous fonctionnent très bien lorsque j'exécute le code dans une course standard. Cependant, quand je l'appelle "py.test" de la src/, il a toujours des sorties avec des erreurs d'importation.


Certains Problèmes et Ma Solution Tentatives

Mon premier problème était que, lors de l'exécution "test/test_foo.py", py.test ne peut pas "importer foo.py" directement. J'ai résolu ce problème en utilisant le "imp" de l'outil. Dans "test_util.py":

import imp
util = imp.load_source("util", "util.py")

Cela fonctionne très bien pour de nombreux fichiers. Il semble également indiquer que lorsque pytest est en cours d'exécution "path/test/test_foo.py" à l'essai "path/foo.py", il est basé dans le répertoire "chemin d'accès".

Toutefois, il échoue pour "test_vector.py". Pytest pouvez trouver et importer les vector module, mais il ne peut pas trouver vectors'importations. Les importations suivantes (à partir de "vector.py") les deux échouent lors de l'utilisation de pytest:

from geom.region import *
from region import *

Ces deux erreurs de la forme

ImportError: No module named [geom.region / region]

Je ne sais pas quoi faire pour résoudre ce problème; ma compréhension des importations en Python est limitée.

Quelle est la bonne façon de gérer les importations lors de l'utilisation de pytest?


Edit: Extrêmement Hacky Solution

Dans vector.py, j'ai changé l'instruction d'importation de

from geom.region import Region

simplement

from region import Region

Cela rend l'importation par rapport au répertoire de "vector.py".

Prochaine, dans "test/test_vector.py" je ajouter le répertoire de "vector.py" le chemin d'accès comme suit:

import sys, os
sys.path.append(os.path.realpath(os.path.dirname(__file__)+"/.."))

Cette mesure de Python pour trouver "../region.py" à partir de "geom/test/test_vector.py".

Cela fonctionne, mais il semble extrêmement problématique, car je suis l'ajout d'une tonne de nouveaux répertoires du chemin d'accès. Ce que je cherche est soit

1) Une stratégie d'importation qui est compatible avec pytest, ou

2) Une option dans pytest qui la rend compatible avec mon importation stratégie

Donc je laisse cette question ouverte pour les réponses de ces types.

  • Je suis toujours à la recherche pour que py.test compatible importation stratégie : /
  • python -m pytest tests/ fonctionne très bien.
  • Si je le fais, dans mon projet python ne trouve pas toutes les autres importations utilisé par les cas de test (ou les importations classes / modules utiliser dans le cas de test). Si je change de ceux absolu des importations, je peux exécuter les tests à l'aide de votre commande, mais lorsque j'essaie d'exécuter le programme, il ne trouve pas les importations – cycle sans fin de l'instruction d'importation de changer et je ne sais pas comment le résoudre.
  • Absolue, les importations sont recommandées dans le paquet principal de trop. Voir les réponses aux stackoverflow.com/q/4209641/3565696. Mais n'oubliez pas d'ajouter __init__.py des fichiers dans vos dossiers pour créer une forfait de base. (Je n'ai jamais essayé avec un espace de noms de package)
  • Vous l'avez mentionné, "Ces tous fonctionnent très bien lorsque j'exécute le code dans une course standard." Pouvez-vous décrire exactement comment vous démarrez une "course standard"? Qui va nous permettre de comprendre comment sys.path est configuré lors d'une "course standard" commence.
InformationsquelleAutor NcAdams | 2014-09-13