python - ¿Cómo puedo hacer que py.test reconozca conftest.py en un subdirectorio?
pytest (1)
Entonces, solo perdí un día tratando de averiguar por qué py.test
no está ejecutando mis configuraciones de configuración automática, de sesión y desmontaje de sesión. Al final me tropecé (¡gracias a este comentario SO !) Este pequeño detalle en la documentación de los complementos :
Tenga en cuenta que, por defecto, los archivos conftest.py de los subdirectorios no se cargan al inicio de la herramienta.
En mi proyecto, obtuve mis archivos py.test ( conftest.py
y archivos de prueba) en un subdirectorio de tests/
, que parece ser una configuración bastante estándar. Si ejecuto py.test
en el directorio de pruebas, todo funciona correctamente. Si ejecuto py.test
en el directorio raíz del proyecto, las pruebas aún se ejecutan, pero las rutinas de instalación / desmontaje nunca se ejecutan .
Preguntas:
- ¿Cuál es la forma "canónica" de permitir que los usuarios ejecuten correctamente las pruebas desde el directorio raíz del proyecto? Poner
conftest.py
en el directorio raíz me parece extraño, porque creo que todos los archivos relacionados con lastests
deben permanecer en el subdirectorio de lastests
. - ¿Por qué (en cuanto al diseño) no están
conftest.py
''s en subdirectorios no cargados de forma predeterminada? Creo que este comportamiento es curioso, por decir lo menos, teniendo en cuenta que las pruebas en los subdirectorios se descubren de forma predeterminada, por lo que parece que también hay un esfuerzo adicional muy pequeño para encontrar archivos Conftest. - Por último, ¿cómo puedo tener
conftest.py
en la carga de los subdirectorios (es decir, cambiar el valor predeterminado)? No pude encontrar esto en los documentos. Me gustaría evitar argumentos de consola adicionales si es posible, ¿puedo poner algo en un archivo de configuración o no?
Cualquier información y consejos son muy apreciados, siento que perdí / desperdicié demasiado tiempo para diagnosticar esto cuando podría haber escrito pruebas para mi proyecto. :-(
Ejemplo mínimo:
# content of tests/conftest.py
# adapted from http://pytest.org/latest/example/special.html
import pytest
def tear_down():
print "/nTEARDOWN after all tests"
@pytest.fixture(scope="session", autouse=True)
def set_up(request):
print "/nSETUP before all tests"
request.addfinalizer(tear_down)
archivo de prueba:
# content of tests/test_module.py
class TestClassA:
def test_1(self):
print "test A1 called"
def test_2(self):
print "test A2 called"
class TestClassB:
def test_1(self):
print "test B1 called"
Salida de consola:
pytest_experiment$ py.test -s
======================================================== test session starts =========================================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.2
plugins: cov
collected 3 items
tests/test_module.py test A1 called
.test A2 called
.test B1 called
.
====================================================== 3 passed in 0.02 seconds ======================================================
pytest_experiment$ cd tests/
pytest_experiment/tests$ py.test -s
======================================================== test session starts =========================================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.2
plugins: cov
collected 3 items
test_module.py
SETUP before all tests
test A1 called
.test A2 called
.test B1 called
.
TEARDOWN after all tests
====================================================== 3 passed in 0.02 seconds ======================================================
Después de alguna ayuda en el canal IRC #pylib, resulta que este fue un error que se ha corregido en py.test 2.3.4 .