在使用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
装置可以更优雅地完成这项任务,但这不是重点。
我遇到的问题是如何在所有测试运行后清理缓存的文件,
答案 0 :(得分:10)
是否可以在所有测试中共享一个全局变量(其中包含例如缓存对象的路径列表)?
我不会走那条路。全局可变状态是最好避免的,特别是在测试中。
在运行所有测试后,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
yield之后的代码将在测试套件的末尾运行一次,无论通过或失败。
答案 1 :(得分:2)
是否可以在所有测试中共享一个全局变量(可能会 包含例如缓存对象的路径列表?
实际上有几种方法可以做到这一点,每种方式都有利有弊。我认为这个答案总结得非常好 - https://stackoverflow.com/a/22793013/3023841 - 但是例如:
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.
"""