Ich verwende py.test 2.2.4 und mein Testfall ist wie folgt organisiert:Wie verwendet man @ pytest.mark mit Basisklassen?
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
Das Problem bei diesem Aufbau ist, dass der Dekorateur der ersten Klasse in die zweite Klasse ist undicht. Wenn ich eine conftest.py wie folgt erstellen:
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)
Wenn ich ausführen dies die Ausgabe zeigt, gesetzt, dass die Markierungen zu stapeln scheint:
$ 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 ===================================
Deshalb möchte ich verstehen, wie es möglich ist, dass diese Markierungen zwischen den Unterklassen lecken und wie dies behoben werden kann (die Testfälle leben in der Basisklasse, aber die Unterklassen richten die notwendige Plattformabstraktion ein).
Gibt es Problemumgehungen für dieses Problem? Ich habe eine große vorhandene Testsuite, die ich migrieren möchte ot.test – dbn
@dbw siehe oben. – ecatmur
Das wird in unserem Fall nicht funktionieren - wir haben einen Basistest, von dem> 100 andere Tests erben, um einige allgemeine Tests für verschiedene Panels zu liefern. Ich werde eine neue Frage über den py.test-ish Weg öffnen, um dies zu tun. – dbn