2012-06-06 11 views
5

Używam programu pytest do testowania modeli Pythona dla systemów wbudowanych. Testowane funkcje różnią się w zależności od platformy. (W tym kontekście używam "platformy" w znaczeniu typu systemu wbudowanego, a nie typu OS).Czy pytest obsługuje "domyślne" znaczniki?

Najprostszym sposobem na uporządkowanie moich testów byłoby przydzielenie ich do katalogów w oparciu o typ platformy.

/platform1 
/platform2 
/etc. 

pytest/PLATFORM1

ten szybko stał się trudno obsługiwać jak najwięcej możliwości zachodzą na różnych platformach. Odtąd przeniosłem moje testy do jednego katalogu, z testami dla każdego obszaru funkcjonalnego przypisanego do pojedynczej nazwy pliku (na przykład test_functionalityA.py). Następnie używam znaczników Pytest, aby wskazać, które testy w pliku dotyczą danej platformy.

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

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

ile bym miłość dostać „conftest” automatycznie wykrywa rodzaj platformy i tylko uruchomić odpowiednie testy, ja pogodziłem się Określanie który testuje uruchomić w wierszu poleceń.

pytest -m „(PLATFORM1 lub all_platforms)”

Pytanie: (! Wreszcie)

Czy istnieje sposób, aby uprościć i mieć pytest uruchomić wszystkie testy nieoznakowanych domyślnie i dodatkowo wszystkie testy przeszły przez "-m" w linii poleceń?

Na przykład: pytest -m "PLATFORM1"

by uruchomić testy oznaczone @ pytest.mark.platform1 jak również wszystkie testy oznaczone @ pytest.mark.all_platforms lub nawet wszystkie testy bez @ pytest.mark w ogóle?

Biorąc pod uwagę dużą liczbę udostępnianych funkcji, bardzo przydatna byłaby możliwość opuszczenia linii @ pitest.mark.all_platforms.

Odpowiedz

8

Zajmijmy się pełnym problemem. Myślę, że możesz umieścić plik conftest.py wraz z testami, a on będzie starał się pomijać wszystkie niepasujące testy (niezaznaczone testy zawsze będą pasować i dlatego nigdy nie zostaną pominięte). Tutaj używam sys.platform, ale jestem pewien, że masz inny sposób obliczania wartości swojej platformy.

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

Z tego można oznaczyć testy tak ::

# 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 

a jeśli prowadzony z ::

$ py.test -rs 

Następnie można go uruchomić i zobaczyć co najmniej dwa test pomijany i zawsze co najmniej jeden wykonany test ::

następnie zobaczysz dwa testowe pominięcie ED i dwa testy wykonywane zgodnie z oczekiwaniami ::

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

Zauważ, że jeśli podasz platformę za pośrednictwem wiersza poleceń opcji marker-jak to ::

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

wtedy nie będą działać te nieoznakowane-testy . W ten sposób można ograniczyć bieg do konkretnych testów.

+0

Pracował jak urok. Dzięki, Holger. –

+0

tylko dlatego, że inni wiedzą, źródło tej odpowiedzi pochodzi z https://pytest.org/latest/example/markers.html#marking-platform-specific-tests-with-pytest można znaleźć więcej przykładów tam. –