2016-06-24 17 views
2

pytestを使って私のPythonアプリケーションの単体テストを書いています。単体テストでの私の経験の大部分はJasmineのようなJavacriptのフレームワークから来ています。ここでは、次のテストラウンドで単独のマークテストをマークして 'fit'というマークを付けたり、マークテストをword 'xit'で除外します。 'fit'は、開発中に、実行時間と結果出力の乱雑さを減らすために、非常に特定のテストのサブセットのみを実行したいときにうってつけです。 Xitはすでにmark.skipデコレータで実装されていますが、私は適合したいと思います。デコレータ@のpytest.mark.onlyデコレータでマークされたすべてのテストがある場合テストの開始時にpytestテストを動的に選択

  • は、すべてのテスト
  • チェックを収集:私は、次のような何かをするpytestを設定するにはどうすればよい

    。見つかった場合はそれらのテストのみを実行し、それ以外の場合はすべてのテストを実行する

コマンドラインで-mフラグを指定して実行するテストを選択できますが、そのサブセットを動的に検出したいと思います。開発時には、-mフラグを持つものとフラグを持たないものの2つの異なるコマンドでテストを実行する必要がないように、実行可能なテストが必要です。

私はconftest.pyがこのロジックを追加する場所になるかもしれないが、私はそれの設定に関する多くの情報を見つけることができなかったと思います。

答えて

3

Pytestプラグインpytest_collection_modifyitemsが必要なようです。

def pytest_collection_modifyitems(session, config, items): 
    """ called after collection has been performed, may filter or re-order 
    the items in-place.""" 

    found_only_marker = False 
    for item in items.copy(): 
     if item.get_marker('only'): 
      if not found_only_marker: 
       items.clear() 
       found_only_marker = True 
      items.append(item) 

リストitems収集されたテストを(あなたのconftest.pyに次のコードを置きます)。

注:あなたはpython2を使用している場合にのみ、のpython3で働くlist.copy は、参照してください。How to clone or copy a list?

アイデアは単純です:

すべてのテスト(項目)を収集した後、単に「マーカーかどうか確認のみ'はどのテストにも存在します。その場合はリストitemsをクリアし、onlyと表示されているテストだけを追加します。そうでない場合は、そのまま項目を保持します。

+0

ありがとうございました!正確に私が必要なもの: – Tumetsu

+0

素晴らしい答え、py.testはこれをとても簡単にします。 – RichVel

関連する問題