python - Problema de PATH con Pytest ''ImportError: ningún módulo llamado YadaYadaYada''
unit-testing py.test (9)
solución de conftest
La solución menos invasiva es agregar un archivo vacío llamado conftest.py
en el directorio repo/
:
$ touch repo/conftest.py
Eso es. No es necesario escribir código personalizado para sys.path
el sys.path
o recordar arrastrar PYTHONPATH
largo o colocar __init__.py
en __init__.py
a los que no pertenece.
El directorio del proyecto después:
repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
└── test_app.py
Explicación
pytest
busca los módulos de conftest
en la colección de prueba para recopilar ganchos y accesorios personalizados, y para importar los objetos personalizados de ellos, pytest
agrega el directorio padre de conftest.py
al sys.path
.
Otras estructuras de proyectos
Si tiene otra estructura de proyecto, coloque conftest.py
en el directorio raíz del paquete (el que contiene paquetes pero no es un paquete, por lo que no contiene un __init__.py
), por ejemplo:
repo
├── conftest.py
├── spam
│ ├── __init__.py
│ ├── bacon.py
│ └── egg.py
├── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
A dónde ir desde aquí
Por supuesto, los módulos de conftest
no son solo algunos archivos para ayudar al descubrimiento del código fuente; es donde suceden todas las mejoras específicas del pytest
framework pytest
y la personalización de su suite de pruebas. pytest
tiene mucha información sobre módulos de conftest
diseminados por sus documentos ; comience con conftest.py
: conftest.py
locales por directorio
Además, SO tiene una excelente pregunta sobre los módulos conftest
: en py.test, ¿para qué sirven los archivos conftest.py?
Utilicé easy_install para instalar Pytest en un mac y comencé a escribir pruebas para un proyecto con una estructura de archivo que le gustara así:
repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py
ejecute py.test
mientras se encuentre en el directorio de repos, todo se comporta como se esperaría
pero cuando pruebo lo mismo en Linux o Windows (ambos tienen Pytest 2.2.3 en ellos) ladra siempre que llega a su primera importación de algo desde mi ruta de aplicación. Digamos, por ejemplo, from app import some_def_in_app
¿Debo editar mi ruta para ejecutar py.test en estos sistemas? ¿Alguien ha experimentado esto?
Creé esto como una respuesta a tu pregunta y a mi propia confusión. Espero que ayude. Preste atención a PYTHONPATH tanto en la línea de comando py.test como en tox.ini.
https://github.com/jeffmacdonald/pytest_test
Específicamente: tienes que decirle a py.test y tox dónde encontrar los módulos que estás incluyendo.
Con py.test puedes hacer esto:
PYTHONPATH=. py.test
Y con tox, agregue esto a su tox.ini:
[testenv]
deps= -r{toxinidir}/requirements.txt
commands=py.test
setenv =
PYTHONPATH = {toxinidir}
Ejecute pytest
sí mismo como un módulo con: python -m pytest tests
Empecé a obtener errores "ConftestImportFailure: ImportError (''No module named ...'' '') cuando accidentalmente __init__.py
archivo __init__.py
a mi directorio src (que no se suponía que fuera un paquete de Python, solo un contenedor de todas las fuentes).
Estaba recibiendo este error debido a algo aún más simple (incluso se podría decir trivial). No había instalado el módulo pytest
. Así que un simple apt install python-pytest
arregló para mí.
''pytest'' se habría listado en setup.py como una dependencia de prueba. Asegúrese de instalar los requisitos de prueba también.
No estoy seguro de por qué py.test no agrega el directorio actual en el PYTHONPATH en sí, pero aquí hay una solución (que se ejecutará desde la raíz de su repositorio):
python -m pytest tests/
Funciona porque Python agrega el directorio actual en PYTHONPATH por usted.
Puede ejecutar con PYTHONPATH en la raíz del proyecto
PYTHONPATH=. py.test
O use la instalación de pip como importación editable
pip install -e . # install package using setup.py in editable mode
Sí, la carpeta de origen no está en la ruta de acceso de Python si realiza un cd
al directorio de pruebas.
Tienes 2 opciones:
Agregue la ruta de forma manual a los archivos de prueba, algo como esto:
import sys, os myPath = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, myPath + ''/../'')
Ejecute las pruebas con env var
PYTHONPATH=../
.
Yo tuve el mismo problema. Lo arreglé agregando un archivo __init__.py
vacío a mi directorio de tests
.