conftest solución
La solución menos invasiva es agregar un archivo vacío nombrado conftest.pyen el repo/directorio:
$ touch repo/conftest.py
Eso es. No es necesario escribir código personalizado para destruir sys.patho recordar arrastrar PYTHONPATHo colocar __init__.pyen 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
pytestbusca los conftestmódulos en la colección de prueba para recopilar ganchos y accesorios personalizados, y para importar los objetos personalizados desde ellos, pytestagrega el directorio principal conftest.pydelsys.path (en este caso, el repodirectorio).
Otras estructuras de proyecto
Si tiene otra estructura de proyecto, coloque el conftest.pydirectorio 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 srcdiseño (colocar conftest.pyen el srcdirectorio):
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 srcde PYTHONPATHmitiga el significado y las ventajas del srcdiseño! Terminará probando el código del repositorio y no el paquete instalado. Si necesita hacerlo, tal vez no necesite el srcdirectorio en absoluto.
A dónde ir desde aquí
Por supuesto, los conftestmódulos no son solo algunos archivos para ayudar al descubrimiento del código fuente; es donde pytestocurren todas las mejoras específicas del proyecto del marco y la personalización de su conjunto de pruebas. pytesttiene mucha información sobre conftestmódulos dispersos en sus documentos ; comenzar con conftest.py: complementos locales por directorio
Además, SO tiene una excelente pregunta sobre los conftestmódulos: en py.test, ¿de qué sirven los archivos conftest.py?