7 votes

conftest.py ImportError : Aucun module nommé Foo

J'ai la structure de répertoire suivante

/home/ubuntu/test/
 - Foo/
   - Foo.py
   - __init__.py
 - Test/
   - conftest.py
   - __init__.py
   - Foo/
     - test_Foo.py
     - __init__.py

Foo.py contient

class Foo(object):
  def __init__(self):
    pass

conftest.py contient :

import pytest

import sys
print sys.path

from Foo.Foo import Foo

@pytest.fixture(scope="session")
def foo():
  return Foo()

test_Foo.py contient :

class TestFoo():
  def test___init__(self,foo):
    assert True

Si je lance pytest . dans le dossier Test, j'obtiens une erreur indiquant que le module Foo est introuvable :

Traceback (most recent call last):
  File "/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/_pytest/config.py", line 379, in _importconftest
    mod = conftestpath.pyimport()
  File "/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/py/_path/local.py", line 662, in pyimport
    __import__(modname)
  File "/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/_pytest/assertion/rewrite.py", line 212, in load_module
    py.builtin.exec_(co, mod.__dict__)
  File "/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/py/_builtin.py", line 221, in exec_
    exec2(obj, globals, locals)
  File "<string>", line 7, in exec2
  File "/home/ubuntu/test/Test/conftest.py", line 6, in <module>
    from Foo.Foo import Foo
ImportError: No module named Foo
ERROR: could not load /home/ubuntu/test/Test/conftest.py

Le sys.path qui est imprimé dans conftest.py semble inclure le chemin /home/ubuntu/test donc il devrait être capable de trouver Foo.py, n'est-ce pas ?

Le problème est que cela ne fonctionne que lorsque je déplace conftest.py dans le dossier ci-dessous.

J'ai lancé pytest 3.2.2

7voto

ldiary Points 301

L'erreur indique que le conftest.py ne peut pas être chargé en raison d'une ImportError . Essayez de déplacer votre import à l'intérieur du fixture foo comme ceci :

import pytest
import sys
print sys.path

@pytest.fixture(scope="session")
def foo():
    from Foo.Foo import Foo
    return Foo()

2voto

gloriphobia Points 485

Ce que je vous recommande de faire, c'est de créer un environnement virtuel et d'installer le module Foo dans cet environnement.

pip install virtualenv
virtualenv venv
. ./venv/bin/activate

Afin d'installer vos modules locaux, vous avez besoin d'un fichier setup.py fichier :

from setuptools import setup

setup(
    name='foo',
    version='0.0.1',
    author='My Name',
    author_email='my.name@email.com',
    packages=['Foo'],
)

Vous pouvez ensuite installer votre module Foo dans votre environnement virtuel : pip install -e . . Ensuite, lorsque vous exécutez vos tests, ils détecteront votre module.

Pour une méthode plus complète et à long terme, envisagez d'utiliser des fichiers d'exigences. Je place généralement les modules dont j'ai besoin dans deux fichiers nommés requirements.txt (pour la production) et requirements-test.txt (pour l'exécution des tests). Ainsi, dans requirements.txt mettez ce dont vous avez besoin pour votre classe Foo, par exemple

json
flask==1.0.2

flask mais pas json . Puis dans le requirements-test.txt vous mettez ce qui suit :

-r requirements.txt
pytest
-e .

La première ligne signifie que lorsque vous installez requirements-test.txt vous obtenez tous les requirements.txt également. Le site -e . est la magie qui résout le problème que vous avez rencontré ici, c'est-à-dire qu'il installe le module Foo (et tous les autres que vous pourriez avoir dans ce dépôt).

Pour installer le requirements-test.txt que vous exécutez ensuite :

pip install -r requirements-test.txt

Vous pouvez maintenant exécuter vos tests et ils trouveront votre module Foo. C'est une bonne façon de résoudre le problème dans CI également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X