Pytest fixture

di Lorenzo Neri
0 commento 28 visualizzazioni

Pytest fixture: uno strumento potente e utile per realizzare i tuoi test con pytest. Scopri come usarle al massimo in questo articolo!

Nel test driven development, o meglio conosciuto in tecnichese come TDD, specialmente se fatto in Python grazie a pytest ti sarai accorto che in diverse occasioni devi creare un numero considerevole di parametri fissi e/o variabili per inizializzare i tuoi test.

Le fixture all’interno di pytest permettono proprio questo.

Si tratta di funzioni che permettono di inizializzare i test, o meglio dire visto che parliamo di pytest, le funzioni per lanciare i test.

Naturalmente siccome i test sono differenti per natura, modalità di scrittura, insomma chi più ne ha più ne metta, le fixture all’interno di pytest permettono differenti pontenzialità.

Per esempio:

  • Le fixture hanno nomi espliciti e sono attivate tramite la loro dichiarazione all’interno delle funzioni test, moduli, classi o addirittura all’interno del progetto intero
  • Le fixture sono implementate in modalità modulare. Per intenderci ogni nome usato per le fixture, va a “triggerare” una funzione fixture che a sua volta può usare altre fixture. Sì la frase che ho appena scritto sembra un turpiloquio unico, ma se mi segui capirai meglio questo discorso.
  • La gestione delle fixture stesse permette di scalare da semplici unità, fino a complessi test funzionali, permettendo di parametrizzare il tutto grazie anche all’uso di altri componenti o addirittura al riutilizzo delle stesse fixture. Vediamo anche questo punto.

Fixture decorator: come si dichiara una pytest fixture

Qua scopriamo subito i punti che ho elencato prima.

Una fixture è prima di tutto una funzione che restituisce un “risultato”. Questo risultato sarà usato poi per parametrizzare il tuo test.

Per farlo però bisogna usare un decorator. In Python, o meglio in pytest, le fixture funzionano così:

import pytest

@pytest.fixture
def la_mia_fixture_ottieni_valore_casuale():
   from random import randint
   # impostiamo il seed per generare poi il numero casuale
   seed(1)
   return randint(1, 11)

Come vedi, la fixture è a tutti gli effetti una funzione che si chiama “la_mia_fixture_ottieni_valore_casualee pytest capisce che si tratta a tutti gli effetti di una fixture proprio grazie al decorator “@pytest.fixture”.

Come si usa una fixture

Chiarito come si crea, è giusto chiarire come si usa.

Beh, all’interno delle funzioni test, è sufficiente passarle come parametro del test stesso:

# dichiaro il test e passo l'argomento fixture creata prima
def test_numeri_positivi_dieci(la_mia_fixture_ottieni_valore_casuale):

   # la uso come una variabile vera e propria
   assert la_mia_fixture_ottieni_valore_casuale > 0

Chiarito tutto questo, resta un punto essenziale da risolvere.

“Lorenzo ma come si usano le fixture su tanti file diversi?”

La risposta, sta nel file “conftest.py”.

Se non sai di cosa sto parlando, ti conviene scoprirlo in questo articolo:

Conftest.py: che cos’è e a cosa serve in pytest

Potrebbero interessarti

Lascia un commento

Questo sito potrebbe fare uso di cookie e siccome l'UE mi obbliga a fartelo presente, eccoti il classico banner dove puoi decidere come gestirli. Accetta Leggi di più