2016-06-01 19 views
0

実行中に大量のファイルをたくさん作成するテストを実行しています。この目的のために、私はテストが合格したらtmpdirディレクトリを削除したいと思います。しかし、テストが失敗した場合、tmpdirの内容は変更されません。テストケースが成功した後にpy.test 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 
      # But what next? 

return True 

が、私は、作成TMPDIRディレクトリのパスを見つける方法がわかりません。

+0

Python 3を実行している場合は、一時ディレクトリを 'with'でコンテキストマネージャーとして使用することができます。詳細については、https://docs.python.org/3.5/library/tempfile.htmlの例を参照してください。その実装に基づいて何かを作成するかもしれません。 –

+0

FWIW pytestの 'tmpdir'フィクスチャは3つのディレクトリを(テストが失敗したかどうかに関係なく)保持し、古いものを削除する必要があります。 –

+0

私のために働く方法:pytestは4 "基本" tempdirディレクトリを保持しています。各基本ディレクトリには、テスト用の個別のディレクトリがすべて含まれています。 – Kanguros

答えて

0

あなたの実際の商品の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) 
+0

私はこれを同じ方法でやり遂げようとしてきましたが、成功しませんでした。私はあなたのために "合格"を "合格"に変更しました。単純なテストを実行した後、item.funcargsの 'tmpdir'の内部エラー "INTERNALERROR"が発生します。 INTERNALERROR> TypeError: 'NoneType'型の引数が反復不可能です。 "問題は "item.funcargsは空です。その他の提案? – Kanguros

+0

pytest_runtest_protocol(..)が処理中のテスト項目をまだ完全に初期化していない場合に備えて編集しました。 – Floghi

1

あなたは012pdを作成し、tempdirをコードに渡してから削除します。

また、障害が発生してもtempdirを常に削除するようにフィクスチャを設定する必要があります。さもなければ、(ユーザーが気づかないうちに)他のテストが失敗する可能性のある汚れた状態を残す可能性があります。

代わりに、私はエラーでPythonデバッガへドロップする--pdbを使用し

  1. のいずれかをお勧めします。フィクスチャはまだクリーンアップされておらず、ファイルを検査することができます。
  2. Creating a custom optionこれにより、tmpdirのクリーンアップを無効にすることができます。
  3. すべてのtmpファイルをユーザー設定可能な場所に(カスタムオプションを使用して)コピーし、後でtmpdirをクリーンアップするカスタムtmpdirフィクスチャを作成します。

いずれの場合でも、不正なtmpdir状態は、ユーザーが意識して判断し、予期しない副作用を防止します。

+0

"さらに、故障時にもtempdirを常に削除するようにフィクスチャを設定する必要があります。そうしないと、ユーザーが気付かないうちに他のテストが失敗する可能性がある汚れた状態が残る可能性があります。すべてのtmpdirはそれ自身のサブディレクトリなので、どのように起こるのかわかりません。 –

+0

はい、ファイナライザのコンテンツを削除するフィクスチャを作成する必要があることを認識しています。トリックはテストの結果を確認する方法ですか? – Kanguros

関連する問題