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
.
Encontró la respuesta:
NO coloque un archivo
__init__.py
en una carpeta que contenga TESTS si planea usar pytest.
Tenía uno de esos archivos, eliminarlo resolvió el problema.
En realidad, esto se ocultó en los comentarios a la segunda respuesta del problema PATH con pytest ''ImportError: ningún módulo llamado YadaYadaYada'', por lo que no lo vi, espero que obtenga más visibilidad aquí.
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.