2012-06-06 9 views
5

Ich verwende pytest, um Python-Modelle für eingebettete Systeme zu testen. Die zu testenden Funktionen variieren je nach Plattform. (Ich verwende 'Plattform' in diesem Zusammenhang, um einen eingebetteten Systemtyp zu meinen, nicht einen Betriebssystemtyp).Unterstützt pytest "Standard" -Markierungen?

Die einfachste Art, meine Tests zu organisieren, wäre, sie den Verzeichnissen auf der Basis des Plattformtyps zuzuordnen.

/platform1 
/platform2 
/etc. 

pytest/Plattform1

Diese schnell hart geworden, so viele Funktionen zu unterstützen überlappen über Plattformen hinweg. Seitdem habe ich meine Tests in ein einziges Verzeichnis verschoben, mit Tests für jeden Funktionsbereich, der einem einzelnen Dateinamen zugewiesen wurde (zum Beispiel test_functionalityA.py). Ich benutze dann Pytest-Marker, um anzuzeigen, welche Tests innerhalb einer Datei für eine bestimmte Plattform gelten.

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

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

Während ich würde Liebe zu ‚conftest‘ zu erhalten, um automatisch den Plattformtyp zu erkennen und nur die entsprechenden Tests laufen, habe ich finde mich zu spezifizieren, welche auf der Kommandozeile ausgeführt werden testen.

pytest -m "(Plattform1 oder all_platforms)"

Die Frage: (endlich!)

Gibt es eine Möglichkeit, Dinge zu vereinfachen und haben pytest alle nicht gekennzeichneten Tests standardmäßig ausgeführt und zusätzlich alle Tests bestanden über '-m' in der Befehlszeile?

Zum Beispiel: pytest -m "Plattform1"

würde Tests laufen markiert @ pytest.mark.platform1 sowie alle Tests @ pytest.mark.all_platforms markiert oder sogar alle Tests ohne @ pytest.mark überhaupt?

Angesichts der großen Menge an gemeinsam genutzten Funktionen wäre es sehr hilfreich, die Zeile @ pytest.mark.all_platforms zu löschen.

Antwort

8

Lassen Sie uns das volle Problem angehen. Ich denke, Sie können eine conftest.py-Datei zusammen mit Ihren Tests erstellen und es wird darauf geachtet, alle nicht übereinstimmenden Tests zu überspringen (nicht markierte Tests werden immer übereinstimmen und somit niemals übersprungen). Hier verwende ich sys.platform, aber ich bin sicher, dass Sie eine andere Möglichkeit haben, Ihren Plattformwert zu berechnen.

# 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)) 

Mit diesem können Sie Ihre Tests wie diese markieren ::

# 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 

und wenn Sie laufen mit ::

$ py.test -rs 

dann können Sie es laufen und wird mindestens zwei sehen Test übersprungen und immer mindestens einen Test ausgeführt:

dann werden Sie zwei Testskip sehen ed und zwei durchgeführten Tests wie erwartet ::

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

Beachten Sie, dass, wenn Sie eine Plattform über die Marker-Befehlszeilenoption wie folgt angeben ::

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

dann die unmarkierte-Tests werden nicht ausgeführt werden . Es ist somit eine Möglichkeit, den Lauf auf die spezifischen Tests zu beschränken.

+0

Arbeitete wie ein Charme. Danke Holger. –

+0

nur, damit andere wissen, die Quelle für diese Antwort ist von https://pytest.org/latest/example/markers.html#marking-platform-specific-tests-with-pytest Sie können mehr Beispiele dort finden. –