python unit-testing py.test

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:

  1. 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 + ''/../'')

  2. 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 .