Удаление кэшированных файлов после запуска 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.
"""