2012-08-17 16 views
13

Sto lavorando su test per un'applicazione web scritta in python.I nosetest Python saltano determinati Test

Supponiamo di avere 5 test nel mio modulo test_login.py.

Ogni singolo test è una classe.

C'è spesso un test di base che estende la classe TestFlow, che è la nostra classe di test predefinita.

E quindi altri test in questo modulo estendono tale test di base.

Per esempio:

#The base test 

TestLogin(TestFlow): 
    #do login_test_stuff_here 

#Another test in the same module 

TestAccountDetails(TestLogin) 
    #do account_details_test_stuff_here 

... 

In realtà è molto utile, perché al fine di testare ad esempio AccountDetails utente deve essere registrato, quindi posso solo ereditare da prova TESTLOGIN e io sono pronto a testare altre funzionalità come utente registrato.

Tutti i test si trovano nella cartella Progetto/progetto/test.

Utilizziamo nosetests con opzione --with-piloni per eseguire i test.

E la mia domanda è se c'è un modo per contrassegnare alcuni TestClass come "Non testare questo".

Perché non voglio perdere tempo per eseguire direttamente questi "test di base", perché verranno eseguiti da altri test che li derideranno.

Ci saranno probabilmente toni di questi test e voglio salvare ogni singolo secondo dove è possibile.

ho già trovato qualcosa come Skip, SkipTest o @nottest, ma questi funzionano solo per test_methods all'interno di un ceratin TestClass, quindi non credo che funzionerà qui, sono stati ho una sola classe per ogni test case.

risposta

2

http://nose.readthedocs.org/en/latest/writing_tests.html

test di scrittura

Come con py.test, test naso non devono essere sottoclassi di unittest.TestCase. Qualsiasi funzione o classe che corrisponda all'espressione regolare di prova TestMatch ((?:^| [\ B _ \ .-]) [Tt] est) - ovvero, ha test o Test a un limite di parola o segue un - o _) e risiede in un modulo che corrisponde anche a quell'espressione che verrà eseguita come prova . Per motivi di compatibilità con i test test non testati, nose caricherà anche i test dalle sottoclassi unittest.TestCase proprio come fa l'unittest . Come py.test, nose esegue test funzionali nell'ordine in cui compaiono nel file del modulo. I test derivati ​​da TestCase e le classi di test vengono eseguite in ordine alfabetico.

note regex e regola sopra. chiama le tue funzioni/metodi/classi in modo che non corrispondano alla regex e non verranno eseguite.

detto questo, non consiglio il tuo suggerimento di concatenare l'ereditarietà per i test. è una ricetta per frustrazione e confusione.

Probabilmente starai meglio con la creazione di una classe di mixaggio o la definizione di una classe base che non ha test effettivi, ma ha molte funzioni di supporto che l'ereditarietà delle classi può chiamare e utilizzare come proprie.

se si guardano i test dei pacchetti più popolari, quasi tutti usano questo approccio.

+0

Si noti che la regex della corrispondenza non è l'unica porta per l'inclusione - * nose caricherà anche i test dalle sottoclassi di unittest.TestCase *. Sembra fare questo per tutto ciò che importa pure. Ho un test chiamato 'FooMixin' in un modulo chiamato' foo_helpers.py' che viene trattato come un test semplicemente perché è derivato da 'unittest.TestCase'. –

12

nosetests forma che può essere fatto, come di seguito specificando gli attributi http://nose.readthedocs.org/en/latest/plugins/attrib.html

Spesso durante il test si potranno selezionare i test in base a criteri piuttosto che semplicemente per nome di file. Ad esempio, potresti voler eseguire tutti i test tranne quelli lenti. Puoi farlo con il plug-in di selettore degli attributi impostando gli attributi sui metodi di test. Ecco un esempio:

def test_big_download(): 
    import urllib 
    # commence slowness... 

test_big_download.slow = 1 

Dopo aver assegnato un attributo lento = 1 è possibile escludere che prova e su tutti gli altri test che hanno l'attributo lento eseguendo

$ nosetests -a '!slow' 
2

Si può effettivamente utilizzare anche la più scontata per le lezioni.

import unittest 

@unittest.skip("Class disabled") 
class TestLogin(TestFlow): 
    ... 
+0

Si noti che su Python <= 2.6 è necessario installare unittest2 affinché funzioni. – gaborous

+1

Che non funzionerà per il caso d'uso fornito. Se si aggiunge skip decorator alla classe base, tutte le sottoclassi verranno ignorate. Anche se hai usato '@ unittest.skipIf (True," base class ")' sulla classe base, e '@ unittest.skipIf (False," ")' nelle sottoclassi, le sottoclassi continuano a essere saltate –

Problemi correlati