py.test运行后删除缓存的文件

时间:2017-03-07 15:32:54

标签: python pytest joblib

在使用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中是否有一个调用某些命令的机制(无论它们是否成功)?

2 个答案:

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