python path py.test

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? ¿O py.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 : una import apple o una from apple import * ? o algo completamente diferente
  • ¿ apple.eat() las funciones entonces por eat() o apple.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.


  1. ¿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.

  1. ¿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 ...

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

  1. ¿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

  1. ¿Llamas a las funciones entonces por eat () o apple.eat ()?

apple.eat()

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