2012-06-06 2 views
5

Sto usando pytest per testare i modelli python per sistemi embedded. Le funzionalità da testare variano in base alla piattaforma. (Sto usando 'piattaforma' in questo contesto per indicare un tipo di sistema incorporato, non un tipo di sistema operativo).Fa pytest markers "default"?

Il modo più semplice per organizzare i test consiste nell'assegnarli alle directory basate sul tipo di piattaforma.

/platform1 
/platform2 
/etc. 

pytest/PLATFORM1

Questo è diventato rapidamente difficile da sostenere molte caratteristiche si sovrappongono diverse piattaforme. Da allora ho spostato i miei test in una singola directory, con test per ogni area funzionale assegnata a un singolo nome file (test_functionalityA.py, ad esempio). Quindi uso i marcatori pytest per indicare quali test all'interno di un file si applicano a una determinata piattaforma.

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

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

mentre io avrei amore ottenga 'conftest' di rilevare automaticamente il tipo di piattaforma ed eseguire solo le prove del caso, ho rassegnato a specificare i test da eseguire sulla riga di comando.

pytest -m "(PLATFORM1 o all_platforms)"

la domanda: (! Finalmente)

C'è un modo per semplificare le cose e hanno pytest eseguire tutti i test non marcate di default e inoltre tutti i test superato via '-m' sulla riga di comando?

Ad esempio: pytest -m "PLATFORM1"

correrebbe test contrassegnati @ pytest.mark.platform1 così come tutti i test assegnati @ pytest.mark.all_platforms o anche tutti i test senza @ pytest.mark affatto?

Data la grande quantità di funzionalità condivise, essere in grado di rilasciare la linea @ pytest.mark.all_platforms sarebbe di grande aiuto.

risposta

8

Affrontiamo il problema completo. Penso che tu possa mettere un file conftest.py insieme ai tuoi test e fare in modo di saltare tutti i test non corrispondenti (i test non marcati corrisponderanno sempre e quindi non verranno mai saltati). Qui sto usando sys.platform ma sono sicuro che hai un modo diverso per calcolare il valore della tua piattaforma.

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

Con questo è possibile contrassegnare i test come questo ::

# 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 

e se si esegue con ::

$ py.test -rs 

quindi è possibile eseguire e vedrete almeno due test saltato e sempre almeno un test eseguito ::

quindi vedrete due test skipp Ed e due test eseguito come previsto ::

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

Si noti che se si specifica una piattaforma tramite l'opzione di linea di marcatore comando come questo ::

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

quindi non sarà eseguire i non marcate-test . È quindi un modo per limitare la corsa ai test specifici.

+0

Ha funzionato come un fascino. Grazie Holger. –

+0

solo così altri lo sanno, la fonte di questa risposta è https://pytest.org/latest/example/markers.html#marking-platform-specific-tests-with-pytest qui puoi trovare altri esempi. –