Come si disabilita un test utilizzando pytest?


88

Diciamo che ho un sacco di test:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

C'è un decoratore o qualcosa di simile che potrei aggiungere alle funzioni per evitare pytestdi eseguire solo quel test? Il risultato potrebbe assomigliare a ...

@pytest.disable()
def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

Risposte:


137

Pytest ha i decoratori skip e skipif, simili al modulo unittest di Python (che usa skipe skipIf), che può essere trovato nella documentazione qui .

Esempi dal collegamento possono essere trovati qui:

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

import sys
@pytest.mark.skipif(sys.version_info < (3,3),
                    reason="requires python3.3")
def test_function():
    ...

Il primo esempio salta sempre il test, il secondo esempio consente di saltare i test in modo condizionale (ottimo quando i test dipendono dalla piattaforma, dalla versione eseguibile o dalle librerie opzionali.

Ad esempio, se voglio controllare se qualcuno ha la libreria panda installata per un test.

import sys
try:
    import pandas as pd
except ImportError:
    pass

@pytest.mark.skipif('pandas' not in sys.modules,
                    reason="requires the Pandas library")
def test_pandas_function():
    ...

C'è qualcosa di simile all'elegante .skipche ha Mocha (Node.js)? it('tests something'...)-> it.skip('tests something'...)che disabiliterebbe quel particolare test. Ha anche il pratico opposto: .onlyche eseguirà solo quel test e nient'altro.
Juha Untinen

Voglio dire, per la onlyparte, puoi farlo tramite la riga di comando o qualsiasi cosa usi per inizializzare il test runner: stackoverflow.com/a/36539692/4131059 Per quanto riguarda ite it.skip, credo che la funzionalità qui lo copra completamente.
Alexander Huszagh

21

Il skipdecoratore farebbe il lavoro:

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    # ...

(reason argomento è facoltativo, ma è sempre una buona idea specificare il motivo per cui un test viene saltato).

C'è anche skipif()che consente di disabilitare un test se viene soddisfatta una condizione specifica.


Questi decoratori possono essere applicati a metodi, funzioni o classi.

Per saltare tutti i test in un modulo , definire una pytestmarkvariabile globale :

# test_module.py
pytestmark = pytest.mark.skipif(...)

10

Non sono sicuro che sia deprecato, ma puoi anche usare la pytest.skipfunzione all'interno di un test:

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3

2
è venuto per l'aiuto più misero, è rimasto per il riferimento
Uzebeckatrente

a cosa fa riferimento. Devo sapere
XChikuX


Temo che sia stato molto prima del mio tempo. Ma sono contento di saperlo adesso.
XChikuX

6

Potresti anche voler eseguire il test anche se sospetti che il test fallirà. Per tale scenario https://docs.pytest.org/en/latest/skipping.html suggerisce di utilizzare decorator @ pytest.mark.xfail

@pytest.mark.xfail
def test_function():
    ...

In questo caso, Pytest eseguirà comunque il test e ti farà sapere se passa o meno, ma non si lamenterà e non interromperà la build.


2

Se vuoi saltare il test ma non codificare un marcatore, è meglio usare l'espressione parola chiave per sfuggirlo.

pytest test/test_script.py -k 'not test_func_one'

2

Puoi contrassegnare un test con i decoratori skipe skipifquando vuoi saltare un test pytest.

Saltare un test

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    ...

Il modo più semplice per saltare un test è contrassegnarlo con il skipdecoratore a cui può essere passato un facoltativo reason.

È anche possibile saltare imperativamente durante l'esecuzione del test o l'installazione chiamando la pytest.skip(reason)funzione. Ciò è utile quando non è possibile valutare la condizione di salto durante il tempo di importazione.

def test_func_one():
    if not valid_config():
        pytest.skip("unsupported configuration")

Saltare un test basato su una condizione

@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_func_one():
    ...

Se vuoi saltare in base a un condizionale, puoi usare skipifinvece. Nell'esempio precedente, la funzione di test viene saltata se eseguita su un interprete precedente a Python3.6.

Infine, se vuoi saltare un test perché sei sicuro che non abbia esito positivo, potresti anche considerare di utilizzare il xfailmarcatore per indicare che prevedi che un test fallisca.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.