Disattiva temporaneamente i singoli test unitari di Python


128

Come possono essere temporaneamente disabilitati i test unitari quando si utilizza il unittestmodulo in Python?

Risposte:


229

I metodi o le classi di test individuali possono essere entrambi disabilitati utilizzando il unittest.skipdecoratore.

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

Per altre opzioni, consultare i documenti relativi ai test saltanti e agli errori previsti .


9
In Python 3, la risposta di Akif qui sotto @unittest.SkipTestfunziona e non@unittest.skip
equilibrio di vita

7
Sto usando Python 3.6.1 e @unittest.skipfunziona anche bene.
Pete,

2
@Pete, in Python 3.4.0, @unittest.skipnon funziona.
lifebalance

Come evitare che le classi secondarie vengano ignorate?
reubenjohn,

L'annotazione verrebbe applicata solo a un singolo metodo di prova. Intendi avere una classe genitore con metodi di test e solo alcune classi figlio hanno il metodo disabilitato? Immagino sia possibile, anche se potrebbe essere necessario progettare le classi genitore / figlio in modo appropriato. Puoi spiegare lo scenario che stai cercando di risolvere con un esempio giocattolo?
yoni,

26

Puoi usare i decoratori per disabilitare il test che può avvolgere la funzione e impedire che il test googletest o python unit esegua il testcase.

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

Produzione:

testFoo has been disabled

11

L'ultima versione (2.7 - inedita) supporta il salto / disabilitazione del test in questo modo . Potresti semplicemente ottenere questo modulo e usarlo sulla tua installazione Python esistente. Probabilmente funzionerà.

Prima di questo, ho usato per rinominare i test ho voluto saltato a xtest_testnameda test_testname.


Ecco un breve script elisp per farlo. Il mio elisp è un po 'arrugginito, quindi mi scuso in anticipo per eventuali problemi. Non testato.

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))

+1, ma nell'intero progetto su cui sto lavorando tutti usano python v2.6.2 e non credo che questo cambierà: /, ma è una soluzione, grazie
coelhudo

Potresti modificare un po 'il tuo editor per darti una macro per abilitare / disabilitare una testcase, ma parlo come utente Emacs così ... :)
Noufal Ibrahim

Anche io sono un utente Emacs, hai fatto una macro?
coelhudo,

No. Li ho lasciati fallire, ma non è così difficile. Ho aggiornato la risposta con una sveltina però.
Noufal Ibrahim,

Questa risposta accettata non è una risposta, ma solo un link. La vera risposta attuale non è neanche quella più votata. Concesso, ha 4 anni. L'elfo gratuito semplicemente offusca.
jwd630,

10

È sufficiente posizionare il @unittest.SkipTestdecoratore sopra il test.


Non so chi sia stato. Ma stavo leggendo la documentazione e dice che SkipTest è un'eccezione. Ad ogni modo, è diverso da unittest.skip nel senso che skip non esegue mai il test (rendendolo disabilitato), mentre lo scopo SkipTest deve essere sollevato se si verifica qualcosa di non previsto durante l'esecuzione del test. Ho ragione? Interessante duro.
coelhudo,

unittest.skip(senza motivo) mi dà un errore in Python 2 ma non in Python 3.
Akif

5

Ho semplicemente rinominato un metodo di test case con un trattino basso: test_myfunc diventa _test_myfunc.


3

I documenti per 2.1 non specificano un metodo ignore o skip.

Di solito, però, blocco i commenti quando necessario.


1

Concentrandosi sulla parte "temporaneamente disabilitata" della domanda, la risposta migliore dipende in qualche modo dal caso d'uso. Il caso d'uso che mi ha portato qui è che sto facendo uno sviluppo test-driven su una funzione. In questo processo, scrivo successivamente i test e spesso utilizzo i punti di interruzione nella funzione per il debug. Se eseguo tutti i test ogni volta che eseguo il test runner, finisco per fermarmi nei punti di interruzione per i test che già funzionano. Aggiungere "skip" o eliminare il nome del test o qualcosa del genere non è quello che voglio perché quando ho finito di scrivere la funzione, voglio che tutti i test vengano eseguiti. Se avessi usato "skip" avrei dovuto tornare indietro e "unskip".

Nel mio caso d'uso, la soluzione sta nel test runner, non nel codice di test. Uso pytest . Con pytest, è facile specificare un singolo test dalla riga di comando:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(sostituisci i tappi con i tuoi valori).

Capisco che quella domanda fosse per Python-Unitest. Non lo uso da molto tempo. Non sarei sorpreso se avesse qualcosa di simile a Pytest. In caso contrario, puoi passare facilmente a Pytest. Non è necessario modificare il codice. Basta installarlo e modificare il comando del test runner.

Inoltre, utilizzo PyCharm Pro. Nella pagina che mostra il mio codice di test, c'è una piccola icona accanto alla def per ogni test. Posso fare clic su quell'icona ed eseguire quel test singolarmente.

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.