setup example conftest python import pytest

python - example - pytest setup



Pytest no puede importar el módulo, mientras que Python puede (16)

Estoy trabajando en un paquete en Python. Yo uso virtualenv. Establecí la ruta a la raíz del módulo en una ruta .pth en mi virtualenv, para poder importar módulos del paquete mientras desarrollo el código y hacer pruebas (Pregunta 1: ¿es una buena manera de hacerlo?). Esto funciona bien (aquí hay un ejemplo, este es el comportamiento que quiero):

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python Python 2.7.12 (default, Jul 1 2016, 15:12:24) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from rc import ns >>> exit() (VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py issued command: echo hello command output: hello

Sin embargo, si trato de usar PyTest, recibo algunos mensajes de error de importación:

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ pytest =========================================== test session starts ============================================ platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 rootdir: /home/zz/Desktop/GitFolders/rc, inifile: collected 0 items / 1 errors ================================================== ERRORS ================================================== ________________________________ ERROR collecting tests/test_ns.py ________________________________ ImportError while importing test module ''/home/zz/Desktop/GitFolders/rc/tests/test_ns.py''. Hint: make sure your test modules/packages have valid Python names. Traceback: tests/test_ns.py:2: in <module> from rc import ns E ImportError: cannot import name ns !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ========================================= 1 error in 0.09 seconds ========================================== (VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ which pytest /home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest

Estoy un poco perplejo, parece que esto indica un error de importación, pero Python lo hace bien, ¿por qué hay un problema específicamente con PyTest? ¿Alguna sugerencia para la razón / remedio (Pregunta 2)? Busqué en Google y desbordé el error ''ImportError: no se puede importar'' para PyTest, pero los golpes que obtuve estaban relacionados con la falta de ruta de Python y la solución a esto, que no parece ser el problema aquí. ¿Alguna sugerencia?


Acabo de resolver esto eliminando el __init__.py en la raíz de mi proyecto:

. ├── __init__.py <--- removed ├── models │   ├── __init__.py │   ├── address.py │   ├── appointment.py │   └── client.py ├── requirements.txt ├── setup.cfg ├── tests │   ├── __init__.py │   ├── models │   │   ├── __init__.py │   │   ├── appointment_test.py │   │   └── client_test.py │   └── other_test.py └── script.py


En mi caso, el error de importación se produjo porque el paquete apunta a otro paquete / directorio con el mismo nombre y su ruta está un nivel por encima de la carpeta que realmente quería. Creo que esto también explica por qué algunas personas necesitan eliminar _ init _.py mientras que otras necesitan volver a agregar.

Acabo de poner print(the_root_package.__path__) (después de import the_root_package ) tanto en la consola de python como en los scripts de pytest para comparar la diferencia

LÍNEA INFERIOR: cuando hace python , el paquete que importa puede ser diferente del paquete cuando ejecuta pytest .



Este problema ocurrirá si tiene un archivo tests.py y una carpeta de tests/__init__.py con tests/__init__.py .

Durante la colección, pytest encuentra la carpeta, pero cuando intenta importar los archivos de prueba de la carpeta, el archivo tests.py causará el problema de importación.

Para solucionarlo, simplemente elimine el archivo tests.py y coloque todas sus pruebas dentro de la carpeta tests/ .

Para su caso específico, la solución será precisamente:

  • Elimine el archivo /home/zz/Desktop/GitFolders/rc/tests.py
  • Asegúrese de que /home/zz/Desktop/GitFolders/rc/tests/__init__.py esté presente

Instale los paquetes en su entorno virtual.
Luego, inicie un nuevo shell y obtenga su entorno virtual nuevamente.


La respuesta anterior no funciona para mí. Simplemente lo resolví agregando la ruta absoluta del módulo que no se encuentra al sys.path en la parte superior de test_xxx.py (su módulo de prueba), como:

import sys sys.path.append(''path'')


No puedo decir que entiendo por qué esto funciona, pero tuve el mismo problema y las pruebas funcionan bien si ejecuto python -m pytest .

Estoy en virtualenv, con pytest también disponible globalmente:

(proj)tom@neon ~/dev/proj$ type -a python python is /home/tom/.virtualenvs/proj/bin/python python is /usr/bin/python (proj)tom@neon ~/dev/proj$ python -V Python 3.5.2 (proj)tom@neon ~/dev/proj$ type -a pytest pytest is /home/tom/.virtualenvs/proj/bin/pytest pytest is /usr/bin/pytest (proj)tom@neon ~/dev/proj$ pytest --version This is pytest version 3.5.0, imported from /home/tom/.virtualenvs/proj/lib/python3.5/site-packages/pytest.py


Otro caso especial:

Tuve el problema usando tox. Así que mi programa funcionó bien, pero las pruebas unitarias a través de tox seguían quejándose. Después de instalar paquetes (necesarios para el programa), debe especificar adicionalmente los paquetes utilizados en las pruebas unitarias en tox.ini

[testenv] deps = package1 package2 ...


Para cualquier persona que haya intentado todo y todavía tenga errores, tengo una solución alternativa.

En la carpeta donde está instalado pytest , vaya a la carpeta pytest-env .

Abra el archivo pyvenv.cfg .

En el archivo, cambie los paquetes del sitio del sistema de falso a verdadero .

home = /usr/bin include-system-site-packages = true version = 3.6.6

Espero que funcione. No te olvides de votar.


Podría ser que Pytest no lea el paquete como un módulo de Python, mientras que Python sí (probablemente debido a problemas de ruta). Intente cambiar el directorio del script pytest o agregue el módulo explícitamente a su PYTHONPATH.

O puede ser que tenga dos versiones de Python instaladas en su máquina. Verifique su fuente de Python para pytest y para el shell de python que ejecuta. Si son diferentes (es decir, Python 2 vs 3), use la source activate para asegurarse de que está ejecutando el pytest instalado para el mismo python en el que está instalado el módulo.


Si está relacionado con el código de Python que se desarrolló originalmente en Python 2.7 y ahora migró a Python 3.x, entonces el problema probablemente esté relacionado con un problema de importación.

por ejemplo, al importar un objeto desde un archivo: base que se encuentra en el mismo directorio, esto funcionará en python 2.x:

from base import MyClass

en python 3.x debe reemplazarse con la ruta completa de la base o .base no hacerlo causará el problema anterior. así que prueba:

from .base import MyClass


Si ya tiene archivos .pyc, intente eliminarlos.

Hoy, me encuentro con este problema, esto es lo que sucedió:

primero ejecuto pytest en mac (esto generará archivos pyc) luego lanzo un contenedor docker (el sistema operativo es alpino), con el directorio del proyecto montado, y luego cuando trato de ejecutar pytest en el contenedor, sucede ImportError. después de limpiar todos los archivos pyc, ya no hay ningún error.

Espero que esto pueda ser útil.


Tuve el mismo problema pero por otro motivo que los mencionados:

Tenía py.test instalado globalmente, mientras que los paquetes se instalaron en un entorno virtual.

La solución fue instalar pytest en el entorno virtual. (En caso de que su shell ejecute hashes, como lo hace Bash, use hash -r , o use la ruta completa a py.test )


Tuve un problema similar y funcionó cuando agregué el archivo init .py en el directorio de pruebas.


Tuve un problema similar, exactamente el mismo error, pero una causa diferente. Estaba ejecutando el código de prueba muy bien, pero contra una versión anterior del módulo. En la versión anterior de mi código, una clase existía, mientras que la otra no. Después de actualizar mi código, debería haber ejecutado lo siguiente para instalarlo.

sudo pip install ./ --upgrade

Al instalar el módulo actualizado que ejecuta pytest, produjo los resultados correctos (porque estaba usando la base de código correcta).


si necesita un archivo init .py en su carpeta, haga una copia de la carpeta y elimine init .py para ejecutar sus pruebas, funciona para proyectos locales. Si necesita ejecutar la prueba regularmente, vea si puede mover su init .py a un archivo separado.