Come configurare ed eseguire il tuo primo test Python con Pytest

Come configurare ed eseguire il tuo primo test Python con Pytest
I lettori come te aiutano a sostenere MUO. Quando effettui un acquisto utilizzando i link sul nostro sito, potremmo guadagnare una commissione di affiliazione. Per saperne di più.

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.





MAKEUSEOF VIDEO DEL GIORNO SCORRI PER CONTINUARE CON I CONTENUTI

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 venv tests 

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 

Per Windows, esegui questo comando:

 tests\Scripts\activate 

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





 pip install 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 --version 

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.

 def add_numbers(a, b): 
    return a + 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:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 5
    assert add_numbers(-1, 1) == 0
    assert add_numbers(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 verifica che la somma di 2 e 3 restituisca 5, il secondo test verifica che la somma di -1 e 1 restituisca 0 e il terzo test verifica che la somma di 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:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 6
    assert add_numbers(-1, 1) == 0
    assert add_numbers(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:

  L'output di un'esecuzione di pytest che mostra il fallimento di un singolo test

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.

posti dove comprare cani vicino a me

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 Python e 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.

 import pytest 

def test_add_numbers_with_invalid_inputs():
    with pytest.raises(TypeError):
        add_numbers(None, 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:

 def test_add_numbers_with_invalid_inputs(): 
    with pytest.raises(TypeError) as exc_info:
        add_numbers(None, 2)

    assert exc_info.value.args[0] == "unsupported operand type(s) for +: 'NoneType' and '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:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 6
    assert add_numbers(-1, 1) == 0
    assert add_numbers(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:

6D592132E52B0895F255E6E77EAE7B50DDDCD350

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.

 class TestAddFunction: 
@pytest.mark.parametrize("a, b, expected", [
        (2, 3, 5),
        (-1, 1, 0),
        (0, 0, 0),
    ])
    def test_addition_with_numbers(self, a, b, expected):
        assert add_numbers(a, b) == expected

    def test_add_numbers_with_invalid_inputs(self):
        with pytest.raises(TypeError) as exc_info:
            add_numbers(None, 2)
        assert exc_info.value.args[0] == "unsupported operand type(s) for +: 'NoneType' and '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.