Scrivere unit test in Python: come posso iniziare? [chiuso]


534

Ho completato il mio primo progetto corretto in Python e ora il mio compito è scrivere test per questo.

Dato che questa è la prima volta che ho fatto un progetto, questa è la prima volta che scrivo dei test per questo.

La domanda è: come posso iniziare? Non ne ho assolutamente idea. Qualcuno può indicarmi un po 'di documentazione / tutorial / link / libro che posso usare per iniziare con i test di scrittura (e immagino che i test delle unità in particolare)

Qualsiasi consiglio sarà accolto con favore su questo argomento.


4
Non è mai troppo tardi per scrivere test se è questa l'intenzione. Meglio averne alcuni che niente per tutti quelli che si lamentano ...
Asken

1
Ecco un buon libro di sviluppo guidato dai test che è disponibile gratuitamente online: chimera.labs.oreilly.com/books/1234000000754/index.html
Sarà il

4
buona risorsa mi sono imbattuto in https://www.jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/ . Come un novizio di Python, l'ho trovato comprensibile.
traghetto dal

2
La Hitchhiker's Guide to Python ha una breve panoramica degli strumenti per test unitari: python-guide-pt-br.readthedocs.io/en/latest/writing/tests
Anton Tarasenko,

Il commento precedente dovrebbe essere valutato più in alto, poiché la guida ha anche un repository di codici di esempio su github.com/kennethreitz/samplemod che è anche un ottimo punto di partenza.
setempler,

Risposte:


101

Se sei nuovo di zecca a utilizzare gli unittest, l'approccio più semplice per imparare è spesso il migliore. Su tale base, consiglio di utilizzare py.testpiuttosto che il unittestmodulo predefinito .

Considera questi due esempi, che fanno la stessa cosa:

Esempio 1 (unittest):

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 (pytest):

def test_starting_out():
    assert 1 == 1

Supponendo che entrambi i file siano denominati test_unittesting.py, come eseguiamo i test?

Esempio 1 (unittest):

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

Esempio 2 (pytest):

cd /path/to/dir/
py.test

7
Ho sentito parlare della semplicità di py.test in più punti ( docs.python-guide.org/en/latest/writing/tests/#py-test , docs.python.org/3.5/library/unittest.html#module -unittest , jeffknupp.com/blog/2013/12/09/… ) Perché è unit-testancora incluso nella libreria standard, se py.teste nosefornisce le stesse funzionalità con un'interfaccia molto più semplice? E 'solo per fornire la compatibilità a ritroso, o se unittesthanno alcuni vantaggi che py.teste nosetestnon può fornire?
alpha_989,

@ alpha_989 La libreria standard di Python non è destinata a contenere i migliori strumenti disponibili. Ecco a cosa serve PyPI. Il unittestpacchetto standard è ancora abbastanza buono. È standard, il che significa che è garantito che funzioni bene. Infine, chiunque usi il tuo codice non ha bisogno di installare pacchetti extra.
Jeyekomon,

72

Il libro gratuito di Python Dive Into Python ha un capitolo sui test unitari che potresti trovare utili.

Se segui le pratiche moderne dovresti probabilmente 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 lo sai per la prossima volta. :)


13
Direi ancora che se vuoi refactoring il codice che non ha test unitari, dovresti prima scrivere test unitari per questo
Hubert Kario

9
Sì, molte persone che vengono per la prima volta a unittest sentono ciò che suona "beh, è ​​un po 'troppo tardi per il tuo progetto attuale" da mani vecchie: anche se non è quello che intendevano dire, è quello che sentono i neofiti . È come il proverbio cinese sulla piantagione di un albero: il momento migliore per iniziare i test è all'inizio di un progetto; il secondo miglior momento per iniziare i test è ora!
JP

4
Il collegamento a Dive in Python è interrotto ... :-(
Scott Skiles,

40

Ci sono, secondo me, tre fantastici framework di test di Python che è bene provare.
unittest - il modulo viene fornito di serie con tutte le distribuzioni python
nose - può eseguire test unittest e ha meno plate.
pytest - esegue anche test unittest, ha meno piatti, rapporti migliori, molte funzioni extra interessanti

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


35

La documentazione per unittest sarebbe un buon punto di partenza.

Inoltre, è un po 'tardi ora, ma in futuro ti preghiamo di considerare di scrivere unit test prima o durante il progetto stesso. In questo modo è possibile utilizzarli per testare mentre si procede e (in teoria) è possibile utilizzarli come test di regressione, per verificare che le modifiche al codice non abbiano violato alcun codice esistente. Questo ti darebbe il pieno vantaggio di scrivere casi di prova :)


Questo se vuoi uno sviluppo guidato dai test, che non è una brutta cosa avere. Nel mio caso, sto guardando il codice esistente e provando a capirlo scrivendo e modificando i test da superare, e questo mi ha dato il via unittest. Una volta che avrò capito le cose, lo userò di più per lo sviluppo, oltre ad aumentare il numero di casi di test per ogni unità.
acqua ghiacciata

27

unittest viene fornito con la libreria standard, ma ti consiglierei i nosetest .

"Il naso si estende unittest per facilitare i test. "

Consiglierei anche il tuo pilastro

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


8

Come altri hanno già risposto, è tardi per scrivere unit test, ma non troppo tardi. La domanda è se il tuo codice è testabile o meno. In effetti, non è facile mettere alla prova il codice esistente, c'è anche un libro su questo: lavorare in modo efficace con il codice legacy (vedi punti chiave o PDF precursore ).

Ora scrivere o meno i test unitari è la tua chiamata. Devi solo essere consapevole che potrebbe essere un compito noioso. Potresti affrontarlo per apprendere i test unitari o prendere in considerazione la possibilità di scrivere prima i test di accettazione (end-to-end) e iniziare a scrivere test unitari quando cambierai il codice o aggiungerai 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 geniale per i test unitari in Python. Supporta sia testcase e doctest basati su unittest, sia per iniziare con un semplice file di configurazione.


Il link ai nosetest è obsoleto. Sembra che la nuova posizione sia: nose.readthedocs.org/en/latest
odigity

1
Come da documentazione su github e sul sito più curioso, nosee nose2sono in modalità di manutenzione. È meglio iniziare py.testperché ha molto più supporto
alpha_989,
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.