让我们解决完整的问题。我认为您可以将 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
然后你可以运行它,将看到至少两个测试被跳过,并且总是至少执行一个测试::
然后您将看到两个测试被跳过并按预期执行两个测试::
$ 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 ====================
请注意,如果您通过标记命令行选项指定平台,如下所示:
$ 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 ==================
那么未标记的测试将不会运行。因此,这是一种将运行限制为特定测试的方法。