L'impostazione di una suite di test per il tuo codice può sembrare un ostacolo per il quale non sei pronto, ma questa libreria richiede molto sforzo.

Il test è una parte essenziale dello sviluppo del software. Aiuta a rilevare i bug in anticipo e riduce la probabilità di errori lungo la linea.

Pytest è uno dei framework di test più popolari per Python. Ti consente di scrivere test piccoli e leggibili che possono essere ridimensionati man mano che la tua applicazione cresce. Scopri come configurare e utilizzare Pytest con il tuo codice Python.

Configurazione di Pytest

Prima di installare Pytest, è meglio creare un ambiente virtuale per isolare l'ambiente di test, in modo da evitare conflitti con altri pacchetti e dipendenze.

Per creare un ambiente virtuale, eseguire il seguente comando prima di installare Pytest.

python -m test venv

Questo creerà un nuovo ambiente virtuale chiamato tests nella tua directory corrente. Per attivare l'ambiente, esegui questo comando se sei su Linux o Mac:

source tests/bin/activate
instagram viewer

Per Windows, esegui questo comando:

tests\\Script\\activate

Per installare Pytest, puoi usare pip, il gestore di pacchetti Python, con questo comando nel tuo terminale:

pip installa pytest

Se non hai Pip, non preoccuparti; puoi installa Pip su Windows, Mac e Linux.

Esegui il seguente comando per verificare se hai installato Pytest correttamente.

pytest --versione

Questo dovrebbe restituire il numero della versione installata.

Creare il tuo primo test

Considera la seguente funzione che somma due numeri e restituisce il risultato.

defadd_numbers(a, b):
ritorno un + b

Diverse cose potrebbero andare storte con questa funzione. Ad esempio, considera cosa succede se chiami la funzione con valori non numerici come Nessuno o un valore di tipo stringa. Questi sono alcuni dei potenziali casi limite che potrebbero causare il fallimento della funzione.

Uno dei primi test che scrivi dovrebbe verificare se la funzione restituisce il risultato atteso. Per fare ciò, è possibile utilizzare la parola chiave assert per confrontare l'output effettivo della funzione con l'output previsto. Nel caso della funzione add_numbers, la funzione di test potrebbe essere simile a questa:

defprova_aggiungi_numeri():
affermare aggiungi_numeri(2, 3) == 5
affermare aggiungi_numeri(-1, 1) == 0
affermare aggiungi_numeri(0, 0) == 0

Questa funzione di test include tre istruzioni assert, ciascuna delle quali confronta l'output della funzione add_numbers con un valore previsto. Il primo test controlla che sommando 2 e 3 restituisca 5, il secondo verifica che sommando -1 e 1 restituisca 0 e il terzo test verifichi che sommando 0 e 0 restituisca 0.

Come eseguire i test con Pytest

Dopo aver scritto i test, il passaggio successivo è eseguirli. Per fare ciò con Pytest, vai alla directory contenente il tuo file di test ed esegui il comando pytest:

pytest

Se tutto funziona come previsto, vedrai un messaggio che indica che tutti i test sono stati superati con successo. Tuttavia, se una qualsiasi delle asserzioni fallisce, Pytest riporterà un errore e mostrerà i valori di input che hanno causato l'errore.

Ad esempio, supponiamo che tu abbia eseguito la seguente funzione di test per la funzione add_numbers:

defprova_aggiungi_numeri():
affermare aggiungi_numeri(2, 3) == 6
affermare aggiungi_numeri(-1, 1) == 0
affermare aggiungi_numeri(0, 0) == 0

La prima asserzione fallirà perché il valore previsto era 6, ma il valore effettivo era 5 (la somma di 2 e 3). Pytest restituirà il seguente messaggio:

Questo messaggio mostra i valori di input che hanno causato il valore e indica anche quale dovrebbe essere il valore effettivo. Ciò semplifica l'identificazione e la correzione rapida degli errori nel codice.

Utilizzo di Pytest.raises per affermare eccezioni

Ora scriviamo un test per coprire uno dei casi limite della funzione add_numbers. Quando passi un argomento non numerico come None alla funzione, Python dovrebbe sollevare un'eccezione TypeError.

Dovresti già esserlo gestire le eccezioni nei tuoi programmi Pythone puoi verificare che anche il tuo codice li generi correttamente.

Per fare ciò, copia la seguente funzione di test nel tuo file. Utilizza il gestore di contesto pytest.raises per verificare se la chiamata alla funzione add_number con "None" solleva un'eccezione TypeError.

importare pytest

deftest_add_numbers_with_invalid_inputs():
con pytest.raises (TypeError):
aggiungi_numeri(Nessuno, 2)

Quindi esegui Pytest dalla riga di comando. Se l'eccezione non viene sollevata, il test fallirà.

Puoi andare oltre e controllare i dettagli del messaggio di eccezione. Il gestore di contesto produce un oggetto ExceptionInfo con i dettagli.

Ad esempio, in questa funzione di test, asserisci il messaggio di eccezione in questo modo:

deftest_add_numbers_with_invalid_inputs():
con pytest.raises(TipoErrore) COME exc_info:
aggiungi_numeri(Nessuno, 2)

affermare exc_info.valore.args[0] == "tipi di operando non supportati per +: 'NoneType' e 'int'"

Se il messaggio non corrisponde a quello del test, Pytest indicherà un errore.

Come utilizzare il test con parametri per testare più input contemporaneamente

Invece di chiamare manualmente una funzione con più input come questo:

defprova_aggiungi_numeri():
affermare aggiungi_numeri(2, 3) == 6
affermare aggiungi_numeri(-1, 1) == 0
affermare aggiungi_numeri(0, 0) == 0

Pytest fornisce una funzionalità di test parametrizzata che ti consente di fare la stessa cosa più facilmente. Ecco come puoi riscrivere la funzione di test sopra:

importare pytest

@pytest.mark.parametrizza("a, b, previsto", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
defprova_aggiungi_numeri(a, b, previsto):
affermareadd_numbers(a, b)== previsto

Come eseguire più test

Finora hai scritto solo due test per la funzione add_numbers. Per funzioni più complesse con più test, potresti volerle raggruppare in una classe.

Ad esempio, ecco come creare una classe di test per la funzione add.

classeFunzioneAggiungitest:
@pytest.mark.parametrize("a, b, previsto", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_addition_with_numbers(self, a, b, atteso):
affermare add_numbers (a, b) == previsto

deftest_add_numbers_with_invalid_inputs(se stesso):
con pytest.raises (TypeError) COME exc_info:
aggiungi_numeri(Nessuno, 2)
affermare exc_info.valore.args[0] == "tipi di operando non supportati per +: 'NoneType' e 'int'"

Si noti che è necessario anteporre al nome della classe "Test" in modo che Pytest possa identificarlo come classe di test ed eseguirlo.

Pytest ha molte altre funzionalità

Usando Pytest, puoi verificare automaticamente che il tuo codice funzioni come previsto. Pytest offre molte altre funzionalità come i dispositivi che consentono di impostare e abbattere i dati di test e i contrassegni per l'impostazione dei metadati sulle funzioni di test.

Inoltre, puoi integrare Pytest nella tua pipeline CI e iniziare a eseguire test automaticamente e continuamente quando modifichi il codice.