あなたの実際の商品のfuncargsから簡単にあなたのtmpdirを取り出すことができます。あなたのケースでは
:我々は現在チェックしているテスト項目に渡さ:物語のため
from _pytest.runner import runtestprotocol
def pytest_runtest_protocol(item, nextitem):
reports = runtestprotocol(item, nextitem=nextitem)
for report in reports:
if report.when == 'call':
# value will be set to passed or filed
test_outcome = report.outcome
# depending on test_outcome value, remove tmpdir
if test_outcome is "OK for you":
if 'tmpdir' in item.funcargs:
tmpdir = item.funcargs['tmpdir'] #retrieve tmpdir
if tmpdir.check(): tmpdir.remove()
return True
は、item.funcargsは{値引数を}含む辞書です。だから最初のステップは、のtmpdirが本当に実際のテストの引数であることを確認してからそれを取得することです。最後に、その存在を確認してから削除します。
希望すると、これが役立ちます。
編集: あなたのpytest_runtest_protocol(..)がアイテムをまだ完全に初期化していないようです。その実行が(正常または失敗)に行われた後、それがあることを確認するには。..
ちょうどpytest_runtest_teardown(項目)をオーバーライドし、それは各テスト項目に作用します。 そのようにメソッドを追加してください:
def pytest_runtest_teardown(item):
if item.rep_call.passed:
if 'tmpdir' in item.funcargs:
tmpdir = item.funcargs['tmpdir'] #retrieve tmpdir
if tmpdir.check(): tmpdir.remove()
そしてクーゼの、簡単にレポートへのアクセス権を持っている(マニュアルに与えられた)次のことを忘れてはいけません。
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call,):
# execute all other hooks to obtain the report object
outcome = yield
rep = outcome.get_result()
# set an report attribute for each phase of a call, which can
# be "setup", "call", "teardown"
setattr(item, "rep_" + rep.when, rep)
Python 3を実行している場合は、一時ディレクトリを 'with'でコンテキストマネージャーとして使用することができます。詳細については、https://docs.python.org/3.5/library/tempfile.htmlの例を参照してください。その実装に基づいて何かを作成するかもしれません。 –
FWIW pytestの 'tmpdir'フィクスチャは3つのディレクトリを(テストが失敗したかどうかに関係なく)保持し、古いものを削除する必要があります。 –
私のために働く方法:pytestは4 "基本" tempdirディレクトリを保持しています。各基本ディレクトリには、テスト用の個別のディレクトリがすべて含まれています。 – Kanguros