2010-07-30 12 views
444

Ho completato il mio primo vero progetto in Python e ora il mio compito è scrivere test per questo.Test delle unità di scrittura in Python: come si avvia?

Poiché è la prima volta che faccio un progetto, questa è la prima volta che scrivo test per questo.

La domanda è, come inizio? Non ne ho assolutamente idea. Qualcuno può indicarmi qualche documentazione/tutorial/link/libro che posso usare per iniziare con i test di scrittura (e credo che i test unitari in particolare)

Qualsiasi consiglio sarà accolto su questo argomento.

+1

cosa hai trovato finora? perché non è riuscito a piacere o informare? – msw

+1

@msw: Non so come aggiungere test nel mio codice e come mi avvantaggerebbe. Il modulo unittest nello stdlib era quello che stavo cercando. – user225312

+3

Non è mai troppo tardi per scrivere dei test se è questa la tua intenzione. Meglio avere qualcuno che nessuno per tutto quello che si lamenta ... – Asken

risposta

238

This is a tutorial for test-driven development in Python. Ora, come ha detto Justin, è meglio scrivere i tuoi test prima o durante la codifica, ed è così che questo tutorial presume che tu stia lavorando, ma penso che lo troverai utile.

And here's part 2.

+17

Solo una nota. Nella versione recente di Python, alcune delle asserzioni utilizzate nel tutorial sono state deprecate a favore di quelle nuove. Ad esempio, failUnless è ora assertTrue. Questo è documentato nella documentazione non testata (vedi tabella: http://docs.python.org/2.7/library/unittest.html#deprecated-aliases) – hayavuk

+2

Solo un'altra nota: i metodi della classe di test dovrebbero iniziare con 'test' se li vuoi giustiziati. Fai attenzione se vuoi evitare un mal di testa :) –

+0

No, NON è meglio scrivere i tuoi test prima della codifica. Dovresti imparare le concezioni di sviluppo Test Driven al più presto. – MattSom

32

I documenti per unittest sarebbero un buon punto di partenza.

Inoltre, è un po 'tardi ora, ma in futuro si prega di prendere in considerazione la scrittura di unit test prima o durante il progetto stesso. In questo modo puoi usarli per testare mentre procedi e (in teoria) puoi usarli come test di regressione, per verificare che le tue modifiche al codice non abbiano infranto alcun codice esistente. Questo ti darebbe il pieno vantaggio di scrivere casi di test :)

+1

Aah! Non avevo idea che doveva essere fatto lungo il progetto. Mi prenderò cura in futuro. Grazie comunque per il link. – user225312

+0

Questo è se si desidera lo sviluppo basato su test, che non è una cosa brutta da avere.Nel mio caso, sto guardando il codice esistente e sto cercando di capirlo scrivendo e modificando i test per passare, e questo mi ha fatto iniziare su "unittest". Una volta capito il problema, lo userò di più per lo sviluppo, oltre ad aumentare il numero di casi di test per ogni unità. – icedwater

65

Il libro Python gratuito Dive Into Python ha un chapter on unit testing che potresti trovare utile.

Se segui le pratiche moderne, probabilmente dovresti scrivere i test mentre stai scrivendo il tuo progetto, e non aspettare che il tuo progetto sia quasi finito.

Un po 'in ritardo ora, ma ora sai per la prossima volta. :)

+5

Direi sempre che se vuoi un codice refactoring che non ha test unitari, dovresti prima scrivere test unitari per questo –

+3

Sì, un sacco di persone che vengono a unittests per la prima volta ascoltano quello che sembra "bene , è troppo tardi per il tuo progetto attuale "da mani vecchie: anche se non è quello che volevano dire, è quello che i neofiti sentono. È come il proverbio cinese sul piantare un albero: il momento migliore per iniziare i test è all'inizio di un progetto; il secondo momento migliore per iniziare i test è ora! –

55

Se sei nuovo di zecca nell'usare le unittests, l'approccio più semplice da apprendere è spesso il migliore. Su questa base, consiglio di utilizzare py.test anziché il modulo predefinito unittest.

Considerare questi due esempi, che fanno la stessa cosa:

Esempio 1:

import unittest 

class LearningCase(unittest.TestCase): 
    def test_starting_out(self): 
     self.assertEqual(1, 1) 

def main(): 
    unittest.main() 

if __name__ == "__main__": 
    main() 

Esempio 2:

def test_starting_out(): 
    assert 1 == 1 

Supponendo che entrambi i file sono denominati test_unittesting.py, come facciamo eseguire i test?

Esempio 1

$ cd /path/to/dir/ 
$ python test_unittesting.py 

Esempio 2:

$ cd /path/to/dir/ 
$ py.test 
+1

Grazie per questo confronto. Ora proverò sicuramente py.test. –

+1

Ho sentito parlare della semplicità di py.test in più punti (http://docs.python-guide.org/en/latest/writing/tests/#py-test, https://docs.python.org/ 3.5/library/unittest.html # module-unittest, https://jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/) Perché è ancora incluso 'unit-test' nella libreria standard, se 'py.test' e' nose' forniscono la stessa funzionalità con un'interfaccia molto più semplice? È solo per fornire la compatibilità con le versioni precedenti, o 'unittest' ha alcuni vantaggi che' py.test' e 'nosetest' non possono fornire? –

7

Come altri già risposto, è tardi per scrivere unit test, ma non troppo tardi. La domanda è se il tuo codice è verificabile oppure no. In effetti, non è facile mettere in discussione il codice esistente, esiste addirittura un libro al riguardo: Working Effectively with Legacy Code (vedi key points o precursor PDF).

Ora la scrittura dell'unità di test o no è la vostra chiamata. Devi solo essere consapevole che potrebbe essere un compito noioso. Potresti affrontare questo problema per apprendere i test unitari o considerare prima di iniziare i test di accettazione (end-to-end) e iniziare a scrivere test di unità quando cambi il codice o aggiungi nuove funzionalità al progetto.

+2

+1 per "Lavorare efficacemente con il codice legacy". Si tratta di codice che non ha test. – David

3

nosetests è una soluzione brillante per il test dell'unità in python. Supporta testcases e doctest basati su unittest e ti consente di iniziare con un semplice file di configurazione.

+0

Il collegamento nosetests è obsoleto. Sembra che la nuova posizione sia: nose.readthedocs.org/en/latest – odigity

+0

Come per la documentazione su github e sul sito Web nosetest, 'nose' e' nose2' sono in modalità manutenzione. È meglio iniziare con 'py.test' perché ha molto più supporto –

26

unittest viene fornito con la libreria standard, ma mi sento di raccomandare si nosetests.

"naso unittest estende per rendere il test più facile."

vorrei anche consigliare si pylint

"analisi codice sorgente Python alla ricerca di bug e segni di scarsa qualità."

29

Ci sono, a mio parere, tre grandi framework per il test di Python che sono buoni da verificare.
unittest - modulo viene fornita di serie con tutte le distribuzioni di pitone
nose - in grado di eseguire test unittest, e ha meno boilerplate.
pytest - gestisce anche i test unittest, ha meno boilerplate, meglio di reporting, un sacco di funzioni extra interessanti

Per ottenere un buon confronto di tutti questi, leggere le introduzioni a ciascuno a http://pythontesting.net/start-here.
Ci sono anche articoli estesi sugli infissi e altro ancora.

Problemi correlati