2012-06-06 5 views
5

pytestを使用して、組み込みシステム用のPythonモデルをテストしています。テスト対象の機能はプラットフォームによって異なります。 (私は、この文脈ではOSタイプではなく組み込みシステムタイプを意味するために 'プラットフォーム'を使用しています)。pytestは「デフォルト」マーカーをサポートしていますか?

テストを整理する最も簡単な方法は、プラットフォームタイプに基づいてディレクトリに割り当てることです。これはすぐにできるだけ多くの機能をサポートするのは難しいとなった

/platform1 
/platform2 
/etc. 

pytest /プラットフォーム1は、プラットフォーム間で重複します。私はそれ以来、テストを単一のディレクトリに移動しました。各ディレクトリは、単一のファイル名(test_functionalityA.pyなど)に割り当てられています。 次に、pytestマーカーを使用して、ファイル内のどのテストが特定のプラットフォームに適用されているかを示します。

@pytest.mark.all_platforms 
def test_some_functionalityA1(): 
    ... 

@pytest.mark.platform1 
@pytest.mark.platform2 
def test_some_functionlityA2(): 
    ... 

私は自動的にプラットフォームの種類を検出し、唯一の適切なテストを実行するには「conftest」を取得するがだろうが、私は、コマンドラインで実行するテストを指定することと自分自身を辞任しました。

pytest -m「(プラットフォーム1またはall_platforms)」

質問:(!最終的には)

物事を単純化し、デフォルトですべてのマークされていないテストや合格加えて、すべてのテストを実行pytest持ってする方法はありますコマンドラインで '-m'を介して?例えば

: pytest -m「プラットフォーム1」

は、テストを実行しますがpytest.mark.platform1 @マークだけでなく、すべてのテストがpytest.mark.all_platformsあるいは全くの@ pytest.markでも、すべてのテスト@マーク全く?

共有機能が大量であるため、@ pytest.mark.all_platforms行を削除できれば大きな助けになります。

答えて

8

すべての問題に取り組みましょう。私はあなたのテストと一緒にconftest.pyファイルを置くことができると思うし、すべての不一致のテストをスキップする(非マークのテストは常に一致するので、スキップされることはありません)。ここで私はsys.platformを使用していますが、私はあなたのプラットフォームの値を計算する別の方法があると確信しています。これにより

# content of conftest.py 
# 
import sys 
import pytest 

ALL = set("osx linux2 win32".split()) 

def pytest_runtest_setup(item): 
    if isinstance(item, item.Function): 
     plat = sys.platform 
     if not hasattr(item.obj, plat): 
      if ALL.intersection(set(item.obj.__dict__)): 
       pytest.skip("cannot run on platform %s" %(plat)) 

あなたは、このようにテストをマークすることができます::

# content of test_plat.py 

import pytest 

@pytest.mark.osx 
def test_if_apple_is_evil(): 
    pass 

@pytest.mark.linux2 
def test_if_linux_works(): 
    pass 

@pytest.mark.win32 
def test_if_win32_crashes(): 
    pass 

def test_runs_everywhere_yay(): 
    pass 

、あなたが::

$ py.test -rs 

で実行した場合、あなたはそれを実行することができますし、少なくとも2が表示されますテストはスキップされ、常に 少なくとも1つのテストが実行されました::

2つのテストスキップが表示されますあなたはこのようなマーカーのコマンドラインオプションを使用してプラットフォームを指定した場合::

$ py.test -m linux2 
=========================== test session starts ============================ 
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1 
collecting ... collected 4 items 

test_plat.py . 

=================== 3 tests deselected by "-m 'linux2'" ==================== 
================== 1 passed, 3 deselected in 0.01 seconds ================== 

を、次にマークされていない、テストが実行されないことをEDと予想されるように2つの実行されたテスト::

$ py.test -rs # this option reports skip reasons 
=========================== test session starts ============================ 
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1 
collecting ... collected 4 items 

test_plat.py s.s. 
========================= short test summary info ========================== 
SKIP [2] /home/hpk/tmp/doc-exec-222/conftest.py:12: cannot run on platform linux2 

=================== 2 passed, 2 skipped in 0.01 seconds ==================== 

注意。したがって、実行を特定のテストに限定する方法です。

+0

チャームのように働いた。ありがとうHolger。 –

+0

他の人が知っているので、この回答のソースはhttps://pytest.org/latest/example/markers.html#marking-platform-specific-tests-with-pytestから入手できます。 –

関連する問題