Estoy usando joblib.Memory para almacenar en caché cálculos costosos cuando ejecuto pruebas con py.test . El código que estoy usando se reduce a lo siguiente,
from joblib import Memory memory = Memory(cachedir='/tmp/') @memory.cache def expensive_function(x): return x**2 # some computationally expensive operation here def test_other_function(): input_ds = expensive_function(x=10) ## run some tests with input_ds que funciona bien Soy consciente de que esto podría hacerse de manera más elegante con el accesorio tmpdir_factory , pero eso no viene al caso.
El problema que tengo es cómo limpiar los archivos en caché una vez que se ejecutan todas las pruebas,
¿Es posible compartir una variable global entre todas las pruebas (que contendría, por ejemplo, una lista de rutas a los objetos almacenados en caché)?
Yo no iría por ese camino. Es mejor evitar el estado mutable global, particularmente en las pruebas.
¿Existe un mecanismo en py.test para llamar a algún comando una vez que se ejecutan todas las pruebas (ya sea que tengan éxito o no)?
Sí, agregue un elemento de ámbito de sesión de uso automático en su archivo conftest.py a nivel de proyecto:
# conftest.py import pytest @pytest.yield_fixture(autouse=True, scope='session') def test_suite_cleanup_thing(): # setup yield # teardown - put your command hereEl código después del rendimiento se ejecutará, una vez, al final del conjunto de pruebas, independientemente de si pasa o falla.
¿Es posible compartir una variable global entre todas las pruebas (que contendría, por ejemplo, una lista de rutas a los objetos almacenados en caché)?
En realidad, hay un par de formas de hacerlo, cada una con ventajas y desventajas. Creo que esta respuesta SO los resume bastante bien: https://stackoverflow.com/a/22793013/3023841 , pero por ejemplo:
def pytest_namespace(): return {'my_global_variable': 0} def test_namespace(self): assert pytest.my_global_variable == 0¿Existe un mecanismo en py.test para llamar a algún comando una vez que se ejecutan todas las pruebas (ya sea que tengan éxito o no)?
Sí, py.test tiene funciones de desmontaje disponibles:
def setup_module(module): """ setup any state specific to the execution of the given module.""" def teardown_module(module): """ teardown any state that was previously setup with a setup_module method. """