11

組み込みシステムのPythonモデルをテストするためにpytestを使用しています。テストする機能はプラットフォームによって異なります。(このコンテキストでは、OSタイプではなく、組み込みシステムタイプを意味するために「プラットフォーム」を使用しています)。

テストを整理する最も簡単な方法は、プラットフォームの種類に基づいてテストをディレクトリに割り当てることです。

/platform1
/platform2
/etc.

pytest / platform1

多くの機能がプラットフォーム間で重複しているため、これはすぐにサポートが困難になりました。その後、テストを1つのディレクトリに移動し、各機能領域のテストを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 "(platform1またはall_platforms)"

質問:(ついに!)

物事を単純化し、pytestにデフォルトですべてのマークされていないテストを実行させ、さらにコマンドラインの「-m」を介してすべてのテストに合格させる方法はありますか?

例:pytest -m "platform1"

@ pytest.mark.platform1とマークされたテストだけでなく、@ pytest.mark.all_platformsとマークされたすべてのテスト、または@ pytest.markがまったくないすべてのテストを実行しますか?

共有機能が大量にあることを考えると、@pytest.mark.all_platforms行を削除できることは大きな助けになります。

4

2 に答える 2

9

完全な問題に取り組みましょう。テストと一緒に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つのテストがスキップされ、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 ====================

次のようにmarker-commandlineオプションを使用してプラットフォームを指定する場合は、次のように注意してください。

$ 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 ==================

その後、マークされていないテストは実行されません。したがって、これは実行を特定のテストに制限する方法です。

于 2012-06-06T14:34:57.720 に答える