我使用py.test 2.2.4和我的測試用例的結構如下:如何在基類中使用@ pytest.mark?
import pytest
class BaseTests():
def test_base_test(self):
pass
@pytest.mark.linuxonly
class TestLinuxOnlyLocal(BaseTests):
pass
@pytest.mark.windowsonly
class TestWindowsOnly(BaseTests):
pass
class TestEverywhere(BaseTests):
pass
與此設置的問題是,第一類的裝飾被泄漏到第二級。當我創建一個conftest.py如下:
import pytest
import sys
def pytest_runtest_setup(item):
print "\n %s keywords: %s" % (item.getmodpath(), item.keywords)
skip_message = None
if 'windowsonly' in item.keywords and not sys.platform.startswith('win'):
skip_message = "Skipped: Windows only test"
if 'linuxonly' in item.keywords and not sys.platform.startswith('linux'):
skip_message = "Skipped: Linux only test"
if skip_message is not None:
print skip_message
pytest.skip(skip_message)
當我執行此設置輸出顯示標記似乎疊起來:
$ py.test --capture=no
========================================== test session starts ===========================================
platform linux2 -- Python 2.7.3 -- pytest-2.2.4
collected 3 items
test_cases.py
TestLinuxOnlyLocal.test_base_test keywords: {'linuxonly': <MarkInfo 'linuxonly' args=() kwargs={}>, 'test_base_test': True}
.
TestWindowsOnly.test_base_test keywords: {'linuxonly': <MarkInfo 'linuxonly' args=() kwargs={}>, 'test_base_test': True, 'windowsonly': <MarkInfo 'windowsonly' args=() kwargs={}>}
Skipped: Windows only test
s
TestEverywhere.test_base_test keywords: {'linuxonly': <MarkInfo 'linuxonly' args=() kwargs={}>, 'test_base_test': True, 'windowsonly': <MarkInfo 'windowsonly' args=() kwargs={}>}
Skipped: Windows only test
s
================================== 1 passed, 2 skipped in 0.01 seconds ===================================
所以我想知道它是如何可能這些標記在子類之間泄漏,以及如何修復/解決這些標記(測試用例將存在於基類中,但子類將設置必要的平臺抽象)。
是否有解決此問題的方法?我有一個巨大的現有測試套件,我想遷移使用py.test – dbn
@dbw見上文。 – ecatmur
在我們的例子中,這不起作用 - 我們有一個基本測試,其中> 100個其他測試從其他測試繼承,爲不同面板提供一些通用測試。我會打開一個關於py.test-ish方法的新問題來做到這一點。 – dbn