web-dev-qa-db-ja.com

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にありますか?
16
rth

すべてのテスト間でグローバル変数を共有することは可能ですか(キャッシュされたオブジェクトへのパスのリストなどが含まれます)?

私はその道を下りません。グローバルな変更可能な状態は、特にテストでは、回避するのが最善です。

すべてのテストが実行されたら(成功したかどうかにかかわらず)コマンドを呼び出すメカニズムが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

収量後のコードは、合格または不合格に関係なく、テストスイートの最後に1回実行されます。

11
wim

すべてのテスト間でグローバル変数を共有することは可能ですか(キャッシュされたオブジェクトへのパスのリストなどが含まれます)?

実際には、いくつかの方法があり、それぞれ長所と短所があります。私はこれをSO回答でまとめるとかなりいいと思います- 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.
    """
2
pawel.ad