Introduzione
Pytest può fare più dell'individuazione dei test e del riportare i risultati delle asserzioni. Man mano che un gruppo di test di Python aumenta, la logica di test ripetuta e il codice di installazione condiviso rendono i test più difficili da leggere, eseguire il debug ed estendere. In questo modulo imparerai tre caratteristiche di pytest che aiutano a mantenere i test Python leggibili e gestibili: la parametrizzazione, le fixture e la fixture integrata monkeypatch.
Questo modulo presuppone che sia possibile scrivere script Python, eseguire comandi in un terminale ed eseguire semplici test pytest in un ambiente virtuale con Python 3.10 o versione successiva. Se è necessaria assistenza per la configurazione su Windows, vedere Impostare l'ambiente di sviluppo Python in Windows. Per informazioni dettagliate sull'ambiente virtuale, vedere la documentazione di Python venv.
La parametrizzazione con @pytest.mark.parametrize esegue la stessa funzione di test con più set di argomenti e pytest raccoglie ogni chiamata generata come proprio elemento di test. Le fixture sono funzioni registrate con pytest, in genere con @pytest.fixture, che i test o altre fixture richiedono per nome. Possono restituire valori riutilizzabili e, quando necessario, effettuare la pulizia al termine dell'ambito del test o della fixture. La monkeypatch fixture modifica temporaneamente attributi, elementi del dizionario, variabili di ambiente, sys.path, o la directory di lavoro corrente, quindi annulla automaticamente tali modifiche al termine del test o della fixture richiesta.
Gli esempi in questo modulo sono test unit-style, ma le stesse funzionalità pytest si applicano a gruppi di test funzionali o di integrazione più grandi. Gli esempi usano l'istruzione Python assert; pytest fornisce l'introspezione delle asserzioni affinché i report dei fallimenti includano valori utili dell'espressione.
Quando usare queste funzionalità
- Usa la parametrizzazione quando ti trovi a eseguire cicli sugli input in un test o a copiare funzioni di test quasi completamente uguali per input leggermente diversi. La parametrizzazione espande una definizione di test in molti elementi di test, quindi ogni input ottiene il proprio report di superamento/esito negativo.
- Usare le fixture quando più test richiedono la stessa configurazione (ad esempio i dati di test, un file temporaneo o una connessione al database) o richiedono una pulizia prevedibile dopo l'esecuzione.
- Usare
monkeypatchquando un test deve isolare il codice dallo stato esterno, ad esempio variabili di ambiente, directory di lavoro corrente o una funzione che chiama un servizio remoto, senza modificare definitivamente tale stato.
Si inizierà sostituendo cicli e test quasi duplicati con parametrizzazione. Poi si useranno le fixture per condividere la configurazione e la pulizia, si esamineranno le fixture predefinite come tmp_path e monkeypatch e si praticherà il refactoring dei metodi di configurazione e smantellamento in stile xUnit in una fixture.
Al termine di questo modulo, si sarà pronti per applicare queste funzionalità pytest per ridurre la ripetizione, espandere la copertura e migliorare la diagnostica degli errori nei gruppi di test Python.
Per altre informazioni, vedere la documentazione di pytest per le asserzioni, la parametrizzazione dei test, le fixture e i monkeypatch.