Удаление кэшированных файлов после запуска py.test

Я использую joblib.Memory для кэширования дорогостоящих вычислений при выполнении тестов с py.test. Код, который я использую, сводится к следующему:

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

который отлично работает. Я знаю, что это возможно, возможно, более элегантно с помощью tmpdir_factory, но это рядом с точкой.

Проблема, с которой я сталкиваюсь, заключается в том, как очистить кэшированные файлы после запуска всех тестов,

  • Можно ли использовать глобальную переменную среди всех тестов (которая содержит, например, список путей к кэшированным объектам)?
  • Есть ли механизм в py.test для вызова некоторой команды после запуска всех тестов (независимо от того, успешны они или нет)?

Ответ 1

Можно ли использовать глобальную переменную среди всех тестов (которая содержит, например, список путей к кэшированным объектам)?

Я бы не пошел по этому пути. Глобальное изменчивое состояние лучше всего избегать, особенно при тестировании.

существует ли в py.test механизм для вызова некоторой команды после запуска всех тестов (независимо от того, успешны они или нет)?

Да, добавьте автоматически используемый инструмент с привязкой к сеансу в файл conftest.py на уровне проекта:

# conftest.py
import pytest

@pytest.yield_fixture(autouse=True, scope='session')
def test_suite_cleanup_thing():
    # setup
    yield
    # teardown - put your command here

Код после выхода будет запущен - один раз - в конце набора тестов, независимо от прохода или сбоя.

Ответ 2

можно ли разделить глобальную переменную среди всех тестов (что содержит, например, список путей к кэшированным объектам)?

На самом деле существует несколько способов сделать это, каждый из которых имеет плюсы и минусы. Я думаю, что этот ответ SO суммирует их довольно неплохо - fooobar.com/info/380930/... - но, например:

def pytest_namespace():
     return  {'my_global_variable': 0}

def test_namespace(self):
     assert pytest.my_global_variable == 0

существует ли в py.test механизм для вызова некоторой команды после запуска всех тестов (независимо от того, успешны они или нет)?

Да, py.test имеет teardown доступные функции:

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