Estructura de directorio del proyecto Python/problema de Pytest
path py.test (2)
Este debería ser el problema más fácil en la tierra, pero incluso después de una extensa búsqueda y retoques, sigo teniendo serios problemas para encontrar una forma "correcta" de establecer una estructura de directorios y administrar correctamente Pytest, etc.
Digamos que tengo un programa llamado apple.
|- README.md
|- apple
| |-- __init__.py
| |-- apple.py
| - tests
| |-- test_everything.py
Apple.py contiene algunas funciones, por ejemplo, vamos a llamar a eat()
. Y el archivo test_everything.py
contiene algunas pruebas como assert eat()=="foobar"
. Tan bueno, tan fácil, pero luego comienza la diversión:
- ¿Qué pasa con
__init__.py
en el directorio de apple ... correcto? Vacío o lo que debería estar adentro? - ¿Es una mejor práctica llamar a
py.test
desde el directorio raíz? ¿Opy.test tests
? - Muchos proyectos tienen un
__init__.py
en su directorio de prueba, pero se dice explícitamente que está mal en la documentación de py.test. ¿Entonces por qué Dios? - ¿Qué viene en la parte superior del archivo
test_everything.py
: unaimport apple
o unafrom apple import *
? o algo completamente diferente - ¿
apple.eat()
las funciones entonces poreat()
oapple.eat()
? - Algunos incluso recomiendan manipular
os.path.dirname
en python
Esto debería ser fácil, pero he visto todas las combinaciones de lo anterior, ni siquiera hablando de tox y la miríada de otras herramientas. Sin embargo, con el menor error, se obtiene un ImportError: No module named ''apple''
u otro error funky.
¿Cuál es la manera correcta? El consejo y el código existente en github etc. siguen convenciones extremadamente diferentes. Para un codificador de experiencia media, esto debería ser mucho más fácil.
- ¿Qué pasa con
__init__.py
en el directorio de apple ... correcto? Vacío o lo que debería estar adentro?
Sí correcto. Más frecuentemente vacío Si coloca foo = 42
en él, puede hacerlo from apple import foo
mientras que debe hacerlo from apple.apple import foo
si lo coloca en apple.py
. Si bien puede parecer conveniente, debe usarlo con moderación.
- ¿Es una mejor práctica llamar a py.test desde el directorio raíz? ¿O pruebas de py.test?
py.test debería poder encontrar tus pruebas independientemente, pero mira abajo ...
- Muchos proyectos tienen un
__init__.py
en su directorio de prueba, pero se dice explícitamente que está mal en la documentación de py.test. ¿Entonces por qué Dios?
Por lo tanto, puede importar un archivo en pruebas que proporcionan una funcionalidad de prueba común. En py.test se puede lograr mejor creando accesorios en un archivo llamado tests/conftest.py
.
- ¿Qué viene en la parte superior del archivo test_everything.py: una manzana importada o una manzana importada *? o algo completamente diferente
from apple import apple
- ¿Llamas a las funciones entonces por eat () o apple.eat ()?
apple.eat()
- Algunos incluso recomiendan manipular os.path.dirname en python
Eso parece muy frágil. Yo sugeriría cualquiera
(a) configure la variable de entorno PYTHONPATH para que apunte a la carpeta donde está README.md
, o mejor
(b) cree un archivo setup.py (al mismo nivel que su archivo README.md
), aquí hay uno mínimo:
from setuptools import setup
setup(name=''apple'', packages=[''apple''])
Ejecute el archivo así:
python setup.py develop
ahora apple
está disponible en todo el mundo y nunca debería volver a ver un no module named apple
problem, es decir, puede ejecutar py.test desde la carpeta raíz o la carpeta de pruebas.
Puede leer más sobre setup.py
en la Guía del usuario de Python Packaging en https://python-packaging-user-guide.readthedocs.org/en/latest/index.html
He arreglado un ejemplo que funciona aquí .
Creo que confundir el paquete y el módulo es quizás una fuente de confusión. La única parte no obvia de la OMI es que debe establecer PYTHONPATH
en el directorio actual si no está utilizando un paquete setup.py setup.py
adecuado para instalar su paquete de apple
.