conftest
solución
La solución menos invasiva es agregar un archivo vacío nombrado conftest.py
en el repo/
directorio:
$ touch repo/conftest.py
Eso es. No es necesario escribir código personalizado para destruir sys.path
o recordar arrastrar PYTHONPATH
o colocar __init__.py
en directorios donde 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 conftest
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 principal conftest.py
delsys.path
(en este caso, el repo
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:
repo
├── conftest.py
├── spam
│ ├── __init__.py
│ ├── bacon.py
│ └── egg.py
├── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
src
diseño
Aunque este enfoque se puede usar con el src
diseño (colocar conftest.py
en el src
directorio):
repo
├── src
│ ├── conftest.py
│ ├── spam
│ │ ├── __init__.py
│ │ ├── bacon.py
│ │ └── egg.py
│ └── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
ten en cuenta que la adición src
de PYTHONPATH
mitiga el significado y las ventajas del src
diseño! Terminará probando el código del repositorio y no el paquete instalado. Si necesita hacerlo, tal vez no necesite el src
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 donde pytest
ocurren todas las mejoras específicas del proyecto del marco y la personalización de su conjunto de pruebas. pytest
tiene mucha información sobre conftest
módulos dispersos en sus documentos ; comenzar con conftest.py
: complementos locales por directorio
Además, SO tiene una excelente pregunta sobre los conftest
módulos: en py.test, ¿de qué sirven los archivos conftest.py?