2015-05-17 3 views
8

Stavo osservando domande simili e non sono riuscito a trovare una risposta al mio problema.Ordine dei test in python unittest

ho scritto test in una classe che deriva da pitone unittest.TestCase

class TestEffortFormula(unittest.TestCase) 

ho bisogno di dare un ordine alle prove (per favore, non mi dicono che non dovrei fare affidamento su di prova di ordine, lo faccio solo).

Prima avevo bisogno di dare ordine alle prove il comando che ho usato per eseguire i test è stato:

unittest.main(testRunner=TeamcityTestRunner()) 

Poi ho voluto fare il dissappear ordine, così ho provato la seguente:

loader = unittest.TestLoader() 
loader.sortTestMethodsUsing(None) 
loader.loadTestsFromTestCase(TestEffortFormula) 
suite = loader.suiteClass() 

ma da qui non so come eseguire i test, specialmente con testRunner=TeamcityTestRunner() come facevo prima.

Apprezzare il vostro aiuto

+4

'unittest' non fornisce alcuna garanzia circa l'ordine di esecuzione. E se i tuoi test si basano sull'ordine, allora non stai facendo test unitari correttamente!Lo stato iniziale e finale dovrebbero essere gestiti dal setup e dal teardown, non da altri metodi di test – wim

+1

Ho letto alcuni punti attorno a StackOverflow che c'è un modo per farlo, non riuscivo proprio a capirlo sotto le mie condizioni. Inoltre, ho chiesto di non dirmi perché non dovrei ... – slashms

+0

Hai bisogno di unittest o puoi usare un altro framework? La proboscide AFAIR consente la dipendenza da test. –

risposta

5

Opzione 1.

Una soluzione a questo (come una soluzione) era given here - che suggerisce la scrittura dei test nei metodi numerati step1, step2, ecc, quindi la raccolta e la loro memorizzazione tramite dir(self) e cedendoli a un metodo test_ che corrisponde a try s ciascuno.

Non ideale ma fa quello che ti aspetti. Ogni sequenza di test deve essere un singolo TestClass (o adattare il metodo fornito per avere più di un metodo di generazione della sequenza).

Opzione 2.

Un'altra soluzione, anche per la questione legata, è il nome del vostro test alfabetico + numerico ordinato in modo che essi saranno eseguiti in questo ordine.

Ma in entrambi i casi, scrivere test monolitici, ciascuno nella propria Classe di test.

P.S. Sono d'accordo con tutti i commenti che dicono che i test unitari non dovrebbero essere fatti in questo modo; ma ci sono situazioni in cui i quadri di test unitari (come unittest e pytest) vengono utilizzati per eseguire test di integrazione che richiedono passaggi modulari indipendenti per essere utili. Inoltre, se il QA non può influenzare Dev per scrivere codice modulare, questo tipo di cose deve essere fatto.

0

Ho cercato molto tempo per risolvere da solo questo problema.
Una delle risposte in this question fa esattamente quello che ti serve.

applicato al tuo codice:

ln = lambda f: getattr(TestEffortFormula, f).im_func.func_code.co_firstlineno 
lncmp = lambda _, a, b: cmp(ln(a), ln(b)) 
unittest.TestLoader.sortTestMethodsUsing = lncmp 

suite = unittest.TestLoader().loadTestsFromTestCase(TestEffortFormula) 
unittest.TextTestRunner(failfast=True).run(suite) 

Purtroppo, l'impostazione unittest.TestLoader.sortTestMethodsUsing=None non funziona, anche se è documented che questo dovrebbe evitare l'ordinamento delle prove in ordine alfabetico.

+0

Perché 'unittest' chiama' dir() 'per ottenere una lista di (possibili) metodi di test e sono già ordinati ... :-( – nodakai