Utilicé easy_install para instalar pytest en una Mac y comencé a escribir pruebas para un proyecto con una estructura de archivos como esta:
repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py
ejecutar py.test
mientras está en el directorio repos, todo se comporta como cabría esperar
pero cuando intento lo mismo en Linux o Windows (ambos tienen Pytest 2.2.3), ladra cada vez que llega a la primera importación de algo desde la ruta de mi aplicación. Decir por ejemplofrom app import some_def_in_app
¿Necesito editar mi RUTA para ejecutar py.test en estos sistemas? ¿Alguien ha experimentado esto?
python
unit-testing
pytest
MattoTodd
fuente
fuente
Respuestas:
Sí, la carpeta de origen no está en la ruta de Python si va
cd
al directorio de pruebas.Tienes 2 opciones:
Agregue la ruta manualmente a los archivos de prueba, algo como esto:
Ejecute las pruebas con la env var
PYTHONPATH=../
.fuente
cd
yendo a un directorio? Estoy corriendopy.test
desde mi raíz. si no me equivoco y que decir como PYtest camina a través de mis carpetascd
problema, ¿no lo golpearía también en Mac?No estoy seguro de por qué py.test no agrega el directorio actual en PYTHONPATH, pero aquí hay una solución alternativa (que se ejecutará desde la raíz de su repositorio):
Funciona porque Python agrega el directorio actual en PYTHONPATH por usted.
fuente
project/test/all-my-tests
yproject/src/app.py
debido a ese cambio, uno necesita llamarapp.py
indirectamente usando un__main__.py
archivoproject/src
, para poder usar la llamadapython -m src
. Bastante desordenado por lo que puedo decir./home/user/dev/projectxyz/src ...
serían realmente malas y no se ejecutarían en otras máquinas en la mayoría de los casos. Creo que lo que quise decir es que siempre tengo que escribir toda la raíz del proyecto a la ruta del módulo, incluso si un módulo está en la misma carpeta que el archivo ejecutado. No sabía que esto se considera la mejor práctica, así que es un poco de información útil, gracias. Estoy de acuerdo con la mayoría de pep8, aunque todavía no es perfecto.__init__.py
en las pruebas, que resolvió el problema. Ahora puedo usarpytest
conftest
soluciónLa solución menos invasiva es agregar un archivo vacío nombrado
conftest.py
en elrepo/
directorio:Eso es. No es necesario escribir código personalizado para destruir
sys.path
o recordar arrastrarPYTHONPATH
o colocar__init__.py
en directorios donde no pertenece.El directorio del proyecto después:
Explicación
pytest
busca losconftest
módulos en la colección de prueba para recopilar ganchos y accesorios personalizados, y para importar los objetos personalizados desde ellos,pytest
agrega el directorio principalconftest.py
delsys.path
(en este caso, elrepo
directorio).Otras estructuras de proyecto
Si tiene otra estructura de proyecto, coloque el
conftest.py
directorio raíz del paquete (el que contiene paquetes pero no es un paquete en sí mismo, por lo que no contiene un__init__.py
), por ejemplo:src
diseñoAunque este enfoque se puede usar con el
src
diseño (colocarconftest.py
en elsrc
directorio):ten en cuenta que la adición
src
dePYTHONPATH
mitiga el significado y las ventajas delsrc
diseño! Terminará probando el código del repositorio y no el paquete instalado. Si necesita hacerlo, tal vez no necesite elsrc
directorio en absoluto.A dónde ir desde aquí
Por supuesto, los
conftest
módulos no son solo algunos archivos para ayudar al descubrimiento del código fuente; es dondepytest
ocurren todas las mejoras específicas del proyecto del marco y la personalización de su conjunto de pruebas.pytest
tiene mucha información sobreconftest
módulos dispersos en sus documentos ; comenzar conconftest.py
: complementos locales por directorioAdemás, SO tiene una excelente pregunta sobre los
conftest
módulos: en py.test, ¿de qué sirven los archivos conftest.py?fuente
pytest
y se recomienda encarecidamente que no lo haga. Al hacer eso, siembras semillas para errores futuros. Cree otro módulo llamadoutils.py
y coloque el código para reutilizar en las pruebas allí.conftest.py
no pertenece al código de la aplicación e, imo, colocarlo debajosrc/
no es correcto.Yo tuve el mismo problema. Lo arreglé agregando un
__init__.py
archivo vacío a mitests
directorio.fuente
avoid “__init__.py” files in your test directories. This way your tests can run easily against an installed version of mypkg, independently from the installed package if it contains the tests or not.
SRC: pytest.org/latest/goodpractises.html__init__.py
de mi directorio de pruebas me lo resolvió.__init__.py
subdirectorio detest/
hace que la importación absoluta funcione para ejecutar pruebas específicas en ese subdirectorio contra los módulos que se instalarán. Gracias.Ejecutarse
pytest
como un módulo con:python -m pytest tests
fuente
python -m pytest
sin otra explicación que no sea "porque funciona"package/src package/tests
y altests
importar desdesrc
. La ejecución como módulo considerará las importaciones como absolutas que relativas a la ubicación de ejecución.Puede ejecutar con PYTHONPATH en la raíz del proyecto
O use pip install como importación editable
fuente
test
directorio que no está en lasrc
estructura del directorio y que llama desde el directorio que contiene ambostest
y elsrc
directorio.Creé esto como una respuesta a su pregunta y mi propia confusión. Espero que ayude. Presta 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:
Y con tox, agregue esto a su tox.ini:
fuente
Tuve el mismo problema en Flask.
Cuando agregué:
a la carpeta de pruebas, el problema desapareció :)
Probablemente la aplicación no pudo reconocer las pruebas de carpeta como módulo
fuente
Lo arreglé eliminando el nivel superior
__init__.py
en la carpeta principal de mis fuentes.fuente
Comencé a recibir
ConftestImportFailure: ImportError('No module named ...
errores extraños cuando accidentalmente agregué un__init__.py
archivo a mi directorio src (que no se suponía que fuera un paquete de Python, solo un contenedor de todas las fuentes).fuente
Estaba recibiendo este error debido a algo aún más simple (incluso podría decirse trivial). No había instalado el
pytest
módulo. Así que un simple loapt install python-pytest
arregló para mí.'pytest' habría sido incluido en setup.py como una dependencia de prueba. Asegúrese de instalar también los requisitos de prueba.
fuente
Tuve un problema similar
pytest
no reconoció un módulo instalado en el entorno en el que estaba trabajando.Lo resolví instalando también
pytest
en el mismo entorno.fuente
Para mí, el problema fue
tests.py
generado por Django junto con eltests
directorio. La eliminacióntests.py
solucionó el problema.fuente
Recibí este error porque utilicé importaciones relativas incorrectamente. En el ejemplo de OP, test_app.py debería importar funciones usando, por ejemplo,
Sin embargo, los archivos generosamente __init__.py están dispersos alrededor de la estructura del archivo, esto no funciona y crea el tipo de ImportError visto a menos que los archivos y los archivos de prueba estén en el mismo directorio.
Aquí hay un ejemplo de lo que tuve que hacer con uno de mis proyectos:
Aquí está mi estructura de proyecto:
Para poder acceder a activity_indicator.py desde test_activity_indicator.py, necesitaba:
fuente
Muy a menudo, las pruebas se interrumpían debido a que el módulo no se podía importar. Después de investigar, descubrí que el sistema está mirando el archivo en el lugar incorrecto y podemos superar fácilmente el problema copiando el archivo que contiene el módulo, en la misma carpeta que se indicó, para que se importe correctamente. Otra propuesta de solución sería cambiar la declaración para la importación y mostrar a MutPy la ruta correcta de la unidad. Sin embargo, debido al hecho de que varias unidades pueden tener esta dependencia, lo que significa que debemos confirmar los cambios también en sus declaraciones, preferimos simplemente mover la unidad a la carpeta.
fuente
Según una publicación en Medium de Dirk Avery (y respaldada por mi experiencia personal), si está utilizando un entorno virtual para su proyecto, entonces no puede utilizar una instalación de pytest en todo el sistema; tienes que instalarlo en el entorno virtual y usar esa instalación.
En particular, si lo tiene instalado en ambos lugares, simplemente ejecutar el
pytest
comando no funcionará porque usará la instalación del sistema. Como han descrito las otras respuestas, una solución simple es ejecutar enpython -m pytest
lugar depytest
; esto funciona porque usa la versión del entorno de pytest. Alternativamente, puede desinstalar la versión del sistema de pytest; Después de reactivar el entorno virtual, elpytest
comando debería funcionar.fuente
python -m pytest tests/
.Estaba teniendo el mismo problema al seguir el tutorial de Flask y encontré la respuesta en los documentos oficiales de Pytest. Es un pequeño cambio con respecto a la forma en que yo (y creo que muchos otros) están acostumbrados a hacer las cosas.
Debe crear un
setup.py
archivo en el directorio raíz de su proyecto con al menos las dos líneas siguientes:donde PACKAGENAME es el nombre de tu aplicación. Luego tienes que instalarlo con pip:
La
-e
bandera le dice a pip que instale el paquete en modo editable o "desarrollo". Por lo tanto, la próxima vez que lo ejecutepytest
debería encontrar su aplicación en el estándarPYTHONPATH
.fuente
Mi solución:
cree el
conftest.py
archivo en eltest
directorio que contiene:Esto agregará la carpeta de interés a la ruta de Python sin modificar cada archivo de prueba , configurando la variable env o jugando con rutas absolutas / relativas.
fuente