Tutorial Pytest per principianti: infissi, parametrizzazione ed esempi reali

  1. Home
  2. Blog
  3. Testare l’automazione

Automazione dei test

Tutorial Pytest per principianti: Infissi, parametrizzazione ed esempi reali

Pytest ti consente di scrivere test Python con funzioni semplici e istruzioni assert semplici. Costruisci una piccola suite di test passo dopo passo, leggi i risultati degli errori reali e apprendi le funzionalità che utilizzerai ogni giorno.

10 min di lettura
Tutorial Pytest per principianti: infissi, parametrizzazione ed esempi reali

Punti chiave

  • Pytest trova le funzioni denominate test_* e le controlla con semplici istruzioni assert.
  • Le fixture forniscono impostazioni e pulizie riutilizzabili, richieste semplicemente nominandole come argomenti.
  • @pytest.mark.parametrize esegue un test con molti input.
  • Inserisci gli apparecchi condivisi in conftest.py e non sarà necessario importarli.

Se hai evitato di scrivere test perché ti sembrano un compito ingrato, questo tutorial pytest dovrebbe farti cambiare idea. Pytest rimuove la maggior parte della cerimonia: non ci sono classi da cui ereditare e nessun metodo di asserzione speciale da ricordare. Un test può essere composto solo da due righe.

Costruiremo un piccolo carrello della spesa e lo testeremo passo dopo passo. Abbiamo eseguito tutto su Python 3.13 con pytest 9.2 e l’output mostrato è reale, anche se abbiamo tagliato i percorsi dei file e i dettagli temporali che differiranno sul tuo computer.

Perchè Pytest?

Python viene fornito con unittest, che funziona bene, ma pytest è solitamente la scelta più conveniente. Ecco lo stesso assegno in ciascuno:

Compito unittest pytest
Controlla l’uguaglianza self.assertEqual(a, b) affermare a == b
Controlla un’eccezione self.assertRaises(...) pytest.raises(...)
Struttura di prova Una classe che eredita da TestCase Una funzione semplice
Installazione e pulizia Metodi setUp e tearDown. Apparecchi riutilizzabili
Molti input subTest anelli parametrizzare

Pytest può anche eseguire i test unittest esistenti, quindi puoi passare gradualmente. Ha anche un ampio ecosistema di plugin, inclusi pytest-cov per la copertura e pytest-xdist per le corse parallele.

Installa pytest

Crea prima un ambiente virtuale, come spiegato nel nostro tutorial sull’ambiente virtuale Python, quindi installalo:

pip install pytest
pytest --version

# pytest 9.2.0

Creare una cartella di progetto contenente due file, cart.py e test_cart.py. Pytest trova i test automaticamente seguendo le regole di denominazione: file denominati test_*.py o *_test.py, funzioni che iniziano con test e classi che iniziano con Test. Se un test non viene ritirato, la prima cosa da verificare è una mancata corrispondenza dei nomi.

Il codice da testare

# cart.py
class Cart:
    def __init__(self):
        self.items = []

    def add(self, name, price, qty=1):
        if qty < 1:
            raise ValueError("qty must be at least 1")
        self.items.append((name, price, qty))

    def total(self, discount=0):
        subtotal = sum(price * qty for _, price, qty in self.items)
        return round(subtotal * (1 - discount / 100), 2)

I tuoi primi test

# test_cart.py
from cart import Cart

def test_empty_cart_is_free():
    assert Cart().total() == 0

Questo è un test completo. Esegui pytest dalla cartella del progetto e segnala un test superato. Se ricevi un errore di importazione, eseguilo come python -m pytest, che aggiunge la cartella corrente al percorso di importazione.

Errori di lettura

È qui che pytest brilla davvero. Ecco un test con un valore atteso deliberatamente sbagliato:

def test_wrong_total():
    c = Cart()
    c.add("Keyboard", 1500)
    assert c.total() == 1400

E questo è ciò che è stato stampato quando lo abbiamo eseguito:

    def test_wrong_total():
        c = Cart()
        c.add("Keyboard", 1500)
>       assert c.total() == 1400
E       assert 1500.0 == 1400
E        +  where 1500.0 = total()

FAILED fail_example.py::test_wrong_total - assert 1500.0 == 1400
============================== 1 failed in 0.12s ==============================

La > indica la linea di guasto e le linee E mostrano i valori effettivi. Non è stato necessario aggiungere un messaggio personalizzato, perché pytest riscrive assert istruzioni in modo che possano riportare ciò che hanno confrontato. Fa lo stesso per elenchi e dizionari, indicando esattamente quali elementi differiscono.

Testare le eccezioni

Anche la gestione degli errori è un comportamento e merita test. pytest.raises passa solo se il blocco solleva l’eccezione prevista:

import pytest

def test_rejects_zero_qty():
    with pytest.raises(ValueError, match="at least 1"):
        Cart().add("Pen", 10, qty=0)

L’argomento opzionale match controlla il messaggio utilizzando un’espressione regolare, quindi un diverso ValueError non passerà per sbaglio. Per sapere come generare e gestire errori come questo, leggi la nostra guida alla Gestione delle eccezioni Python.

Attrezzature: configurazione riutilizzabile

La maggior parte dei test necessita prima di qualcosa di preparato. Un apparecchio è una funzione che lo fornisce. Decoralo con @pytest.fixture e qualsiasi test che lo nomina come argomento riceve il risultato:

@pytest.fixture
def cart():
    c = Cart()
    c.add("Keyboard", 1500)
    c.add("Mouse", 500, qty=2)
    return c

def test_total(cart):
    assert cart.total() == 2500

Ogni test riceve un nuovo carrello per impostazione predefinita, quindi i test non possono influenzarsi a vicenda. Pytest abbina il nome dell’argomento al nome del dispositivo e non chiami mai il dispositivo tu stesso. @pytest.fixture è un decoratore, che spiegheremo in Spiegazione dei decoratori Python.

Pulizia con resa

Usa yield invece di return quando hai bisogno di ripulire in seguito. Il codice dopo yield viene eseguito al termine del test, anche se fallisce:

@pytest.fixture
def temp_db():
    print("\nopen db")
    yield {"users": []}
    print("close db")

def test_db(temp_db):
    assert temp_db["users"] == []

L’esecuzione con -s per mostrare l’output stampato ha confermato che l’ordine era aperto, testato, quindi chiuso.

Ambito dell’apparecchiatura e conftest.py

Per impostazione predefinita, un dispositivo viene eseguito una volta per test. Per configurazioni costose, come un database o un browser, modificarne la durata con scope:

Ambito Creato una volta per
function (predefinito) Prova
classe Classe di prova
modulo Archivio
pacchetto Pacchetto
sessione Intero giro di prova

Metti le apparecchiature utilizzate da diversi file in un file chiamato conftest.py. Pytest lo carica automaticamente, quindi i test possono utilizzare le sue apparecchiature senza importazione. Fare attenzione, tuttavia, agli ambiti condivisi, perché una modifica apportata da un test può diffondersi in quello successivo.

Parametrizzare: un test, molti input

Invece di copiare un test per ogni valore, elenca i casi:

@pytest.mark.parametrize("discount, expected", [
    (0, 2500),
    (10, 2250),
    (100, 0),
])
def test_discount(cart, discount, expected):
    assert cart.total(discount) == expected

Ogni riga diventa il proprio test e puoi vederlo nell’output dettagliato della nostra esecuzione del file completo:

test_cart.py::test_total PASSED                        [ 16%]
test_cart.py::test_discount[0-2500] PASSED             [ 33%]
test_cart.py::test_discount[10-2250] PASSED            [ 50%]
test_cart.py::test_discount[100-0] PASSED              [ 66%]
test_cart.py::test_rejects_zero_qty PASSED             [ 83%]
test_cart.py::test_empty_cart_is_free PASSED           [100%]

============================== 6 passed in 0.05s ==============================

Se una riga fallisce, le altre continuano a essere eseguite e il nome indica esattamente quali valori hanno causato il problema. Si noti che abbiamo combinato la parametrizzazione con il dispositivo cart. Per scegliere i valori che potrebbero rilevare bug, utilizzare l’analisi dei valori limite.

Suggerimento: Quando i parametri sono lunghi o poco chiari, passare a ids=["none", "ten", "full"] per assegnare a ciascun caso un nome leggibile nel report.

Utili apparecchi da incasso

Pytest include diversi apparecchi già pronti. Questi due sono particolarmente utili ed entrambi sono stati superati nel nostro test:

def test_write_report(tmp_path):
    report = tmp_path / "report.txt"
    report.write_text("passed")
    assert report.read_text() == "passed"

def read_mode():
    return os.environ.get("APP_MODE", "dev")

def test_mode(monkeypatch):
    monkeypatch.setenv("APP_MODE", "staging")
    assert read_mode() == "staging"

tmp_path assegna a ciascun test una cartella temporanea univoca, in modo che i test non tocchino mai file reali. monkeypatch modifica le variabili o gli attributi di ambiente e annulla la modifica al termine del test. Un altro utile è capsys, che cattura l’output stampato in modo da poterlo controllare.

Marcatori: skip e xfail

I marcatori aggiungono etichette e comportamenti ai test:

@pytest.mark.skip(reason="payment sandbox is down")
def test_payment():
    assert False

@pytest.mark.xfail(reason="floating point")
def test_rounding():
    assert 0.1 + 0.2 == 0.3

skip non esegue affatto il test. xfail lo esegue ma prevede un errore, quindi un problema noto non interrompe la build. Con gli altri test aggiuntivi nello stesso file, la nostra esecuzione è riassunta come 3 passed, 1 skipped, 1 xfailed. A proposito, questo test di arrotondamento fallisce davvero: nell’aritmetica in virgola mobile, 0,1 + 0,2 non è esattamente 0,3. Utilizzare pytest.approx(0.3) quando si confrontano i decimali.

Puoi anche creare i tuoi marcatori, come @pytest.mark.slow, ed eseguire solo quelli con pytest -m slow, o lasciarli fuori con -m "not slow". Registra marcatori personalizzati nel file di configurazione per evitare avvisi.

Flag utili della riga di comando

Comando Cosa fa
pytest -v Mostra il nome di ciascun test
pytest -q Mostra un riepilogo più breve
pytest -x Fermati al primo fallimento
pytest -k sconto Esegui test i cui nomi corrispondono a una parola
pytest -s Mostra print output
pytest --lf Rieseguire solo gli ultimi errori
pytest --pdb Apri il debugger in caso di errore
pytest test_cart.py::test_total Esegui un test specifico

Esecuzione di pytest in CI

I test sono più preziosi quando vengono eseguiti automaticamente a ogni modifica. Un lavoro minimo di GitHub Actions è simile al seguente:

steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-python@v5
    with:
      python-version: "3.13"
  - run: pip install -r requirements.txt
  - run: python -m pytest

Pytest esce con un codice diverso da zero quando i test falliscono, che è ciò che interrompe la pipeline. Non abbiamo eseguito questo file del flusso di lavoro, quindi adattalo al tuo progetto. La nostra guida CI/CD di GitHub Actions spiega i dettagli. Pytest funziona bene anche per i test del browser, come mostrano il nostro tutorial Selenium Python e il tutorial sul modello oggetto pagina.

Considerazioni finali

Ora hai ciò di cui hai bisogno per la maggior parte delle suite di test Python: asserzioni semplici, dispositivi per l’installazione, parametrizzazione per variazioni e alcuni flag per la velocità. Inizia in piccolo. Scegli una funzione in cui hai corretto un bug di recente e scrivi prima un test per quel bug. Se non sei sicuro di cosa testare a ciascun livello, leggi informazioni su test unitario e test di integrazione.

Domande frequenti

A cosa serve Pytest?

Pytest è un framework di test Python. Viene utilizzato per test di unità, integrazione e API e funziona bene anche con strumenti browser come Selenium e Playwright.

Pytest è migliore di unittest?

Molte squadre lo preferiscono per la sua sintassi più semplice, il calendario e gli errori più chiari. unittest non necessita di installazione e pytest può eseguire anche test unittest esistenti.

Cos’è un dispositivo in Pytest?

Un dispositivo è una funzione che prepara qualcosa di cui un test ha bisogno, come dati o una connessione. I test lo ricevono nominandolo come argomento.

Cos’è conftest.py?

È un file speciale per condividere dispositivi e hook tra file di test. Pytest lo carica automaticamente, quindi i suoi dispositivi non necessitano di istruzioni di importazione.

Perché pytest non trova i miei test?

Di solito è un problema di denominazione. I file dovrebbero essere nominati test_*.py o *_test.py e le funzioni dovrebbero iniziare con test. Controlla anche di averlo eseguito dalla cartella giusta.

Continua a imparare

Lavora con Stack Quora

Hai bisogno di aiuto con test, WordPress o SEO?

Aiutiamo i team a fornire software migliore e a far crescere i loro siti. Raccontaci a cosa stai lavorando e ti suggeriremo chiaramente il prossimo passo.

Continua a leggere

Altre guide su test, intelligenza artificiale e sviluppo moderno

Ti è piaciuto questo articolo? Scegli un argomento e passa direttamente ai nostri tutorial più recenti.

Intelligenza artificiale

Spiegazione delle allucinazioni dell'intelligenza artificiale: perché i modelli linguistici inventano le cose e come ridurle

Spiegazione delle allucinazioni dell'intelligenza artificiale: cosa sono, perché i modelli linguistici le producono, tipi comuni, come ridurle con b…

Leggi l'articolo →
DevOps

Spiegazione delle variabili d'ambiente: file .env, segreti e configurazione eseguiti correttamente

Variabili d'ambiente spiegate con esempi Python che abbiamo eseguito: lettura e impostazione, perché ogni valore è una stringa, file .env, ereditari…

Leggi l'articolo →
Sviluppo software

Spiegazione della limitazione della velocità API: algoritmi, intestazioni e gestione degli errori 429

La limitazione della velocità dell'API spiegata con una simulazione che abbiamo eseguito: bucket di token, finestra fissa, finestra scorrevole, risp…

Leggi l'articolo →
Automazione dei test

Derisione in Python: unittest.mock, patch e gli errori che fanno mentire i test

Mocking in Python con unittest.mock, testato: Mock e return_value, side_effect, patch dove viene utilizzato un nome, specifiche e autospec, date moc…

Leggi l'articolo →
Test del software

Spiegazione della copertura del codice: copertura di linea o di filiale e cosa significa realmente il 100%.

Copertura del codice spiegata con una vera esecuzione di cover.py: copertura di linea, ramo e condizione, lettura di un rapporto, perché la copertur…

Leggi l'articolo →
Database e SQL

DELETE vs TRUNCATE vs DROP in SQL: differenze, rollback e quando utilizzarli

DELETE vs TRUNCATE vs DROP spiegato con SQL testato: cosa rimuove, rollback, trigger, reimpostazione dell'identità, velocità e come differiscono Pos…

Leggi l'articolo →
Database e SQL

Spiegazione delle visualizzazioni SQL: crea, utilizza ed evita le insidie, con esempi

Viste SQL spiegate con le query che abbiamo eseguito: creazione di una vista, risultati in tempo reale, nascondere colonne, prestazioni, viste aggio…

Leggi l'articolo →
Sviluppo software

Interfaccia TypeScript e tipo: differenze reali, testate con il compilatore

Interfaccia TypeScript vs tipo, verificata con il vero compilatore: cosa possono fare entrambi, cosa può fare solo uno, fusione delle dichiarazioni,…

Leggi l'articolo →
Sviluppo software

Spiegazione di Python *args e **kwargs: funzioni flessibili con esempi chiari

Python *args e **kwargs spiegati con il codice che abbiamo eseguito: compressione e decompressione, ordine dei parametri, argomenti solo per parole …

Leggi l'articolo →
Sviluppo software

Funzioni Lambda Python: sintassi, usi reali e quando non usarli

Funzioni lambda Python spiegate con il codice che abbiamo eseguito: sintassi, ordinamento con chiave, mappa e filtro, chiusure, trap dell'associazio…

Leggi l'articolo →
Intelligenza artificiale

Cosa sono gli agenti AI? Come funzionano, con un semplice ciclo di agenti che puoi eseguire

Cosa sono gli agenti IA? Una semplice guida al ciclo dell'agente, agli strumenti, alla memoria e ai guardrail, con un piccolo ciclo Python che abbia…

Leggi l'articolo →
DevOps

Monitoraggio vs osservabilità: la vera differenza, con log, metriche e tracce

Spiegazione del monitoraggio e dell'osservabilità: errori noti e sconosciuti, log, metriche e tracce, una procedura dettagliata sugli incidenti di p…

Leggi l'articolo →
DevOps

Volumi Docker e montaggi di associazione: mantenere i dati del contenitore nel modo giusto

Volumi Docker e montaggi di collegamento spiegati: perché i dati del contenitore scompaiono, volumi denominati, montaggi di collegamento, tmpfs, ese…

Leggi l'articolo →
Automazione dei test

TDD vs BDD: differenze chiave, una caratteristica costruita in entrambi i modi e quando utilizzarli ciascuno

TDD vs BDD spiegato con una funzione di sconto costruita in entrambi i modi: refactoring rosso-verde con il codice che abbiamo eseguito, scenari "Da…

Leggi l'articolo →
Test del software

Test di accettazione da parte dell'utente (UAT): processo, lista di controllo ed esempi reali

Spiegazione del test di accettazione dell'utente: chi lo esegue, in cosa differisce dal QA, un processo in sette fasi, un modello di test case UAT, …

Leggi l'articolo →
Database e SQL

Spiegazione dei valori SQL NULL: IS NULL, COALESCE, NULLIF e le trappole da evitare

Valori SQL NULL spiegati con le query che abbiamo eseguito: logica a tre valori, IS NULL, COALESCE, NULLIF, come aggregazioni, join e ordinamento tr…

Leggi l'articolo →
Database e SQL

Istruzione SQL CASE WHEN: sintassi, esempi reali ed errori comuni

SQL CASE WHEN spiegato con le query che abbiamo eseguito: moduli semplici e cercati, ordine delle condizioni, pivot con SUM, trucchi COUNT, ordiname…

Leggi l'articolo →
Sviluppo software

Cos'è il JWT? Token Web JSON spiegati con un esempio funzionante

Cos'è il JWT? Spiegazione dei token Web JSON: le tre parti, un token creato e manomesso nel codice che abbiamo eseguito, JWT e sessioni, archiviazio…

Leggi l'articolo →
Sviluppo software

Spiegazione del loop di eventi JavaScript: stack di chiamate, microtask e timer con esempi

Il ciclo di eventi JavaScript spiegato con il codice che abbiamo eseguito: stack di chiamate, code di attività e microtask, perché setTimeout 0 non …

Leggi l'articolo →
Sviluppo software

Spiegazione dei generatori Python e del rendimento: risparmia memoria con esempi reali

Generatori Python e rendimento spiegati con il codice che abbiamo eseguito: come vengono messi in pausa e ripresi, misurato il risparmio di memoria,…

Leggi l'articolo →
Intelligenza artificiale

Cosa sono gli incorporamenti? I vettori e la somiglianza del coseno spiegati semplicemente

Cosa sono gli incorporamenti? Una guida in linguaggio semplice ai vettori, alla similarità del coseno e alla ricerca semantica, con un piccolo esemp…

Leggi l'articolo →
DevOps

Distribuzione blu-verde rispetto a quella canaria: differenze, compromessi e come scegliere

Spiegazione della distribuzione blu-verde e canary: come funziona ciascuna, costi, rischi e rollback, bucket utente stabile che abbiamo testato, mig…

Leggi l'articolo →
Automazione dei test

Test instabili: quali sono le cause e come risolverli definitivamente

Test instabili spiegati con demo che abbiamo eseguito: le cause principali, come confermarne e diagnosticarne uno, soluzioni adeguate per tempistich…

Leggi l'articolo →
Test del software

Test di carico e test di stress: differenze, metriche ed esempi k6

Spiegazione del test di carico e dello stress test: cosa dimostra ciascuno, test di picco e di assorbimento, le metriche che contano, perché le medi…

Leggi l'articolo →
Test del software

Caso di test e scenario di test: differenze chiave, esempi e quando utilizzarli

Spiegazione del caso di test e dello scenario di test: definizioni chiare, una tabella affiancata, una funzione di reimpostazione della password pre…

Leggi l'articolo →
Database e SQL

Ottimizzazione delle query SQL: leggi i piani di esecuzione e correggi query lente, con tempistiche

Ottimizzazione delle query SQL testata su un milione di righe: leggi i piani di esecuzione, aggiungi gli indici corretti, correggi filtri non aggior…

Leggi l'articolo →
Database e SQL

SQL UNION vs UNION ALL: differenze, esempi e prestazioni testate

SQL UNION vs UNION ALL spiegati con le query che abbiamo eseguito: duplicati, regole seguite da entrambi, un vero bug di dati, prestazioni misurate,…

Leggi l'articolo →
Sviluppo software

Tutorial sull'API di recupero JavaScript: GET, POST, gestione degli errori e timeout

Un tutorial sull'API JavaScript Fetch testato su un server locale: GET e POST, perché 404 non genera eccezioni, un helper riutilizzabile, stringhe d…

Leggi l'articolo →
Sviluppo software

Gestione dei file Python: lettura, scrittura, CSV, JSON e pathlib con esempi

Gestione dei file Python spiegata con il codice che abbiamo eseguito: modalità aperte, con, lettura di file di grandi dimensioni, CSV, JSON, pathlib…

Leggi l'articolo →
Sviluppo software

Classi e oggetti Python: tutorial OOP con esempi reali

Classi e oggetti Python spiegati con il codice che abbiamo eseguito: __init__, metodi, attributi di classe e istanza, ereditarietà, proprietà, metod…

Leggi l'articolo →
Intelligenza artificiale

Che cos'è un modello linguistico di grandi dimensioni? Come funzionano i LLM, spiegato senza esagerazioni

Cos’è un modello linguistico ampio? LLM spiegati in un linguaggio semplice: token, incorporamenti, attenzione, formazione, finestre di temperatura e…

Leggi l'articolo →
DevOps

Comandi Linux per principianti: la guida essenziale del terminale con esempi

Comandi Linux per principianti, raggruppati per attività: navigazione, file, visualizzazione log, grep, pipe, permessi, processi e archivi, con un e…

Leggi l'articolo →
Automazione dei test

Selenio vs drammaturgo: differenze chiave, codice a confronto e quale scegliere

Selenium vs Playwright a confronto: architettura, attesa, supporto per browser e linguaggio, debug, lo stesso test in entrambi gli strumenti, consig…

Leggi l'articolo →
Test del software

Partizionamento di equivalenza: tecnica di progettazione dei test spiegata con esempi pratici

Spiegazione del partizionamento di equivalenza: come trovare partizioni valide e non valide, esempi funzionanti per età, password e coupon, test che…

Leggi l'articolo →
Test del software

Gravità vs priorità nel test del software: differenze, matrice ed esempi reali

Spiegazione della gravità e della priorità nei test del software: definizioni chiare, una matrice a quattro vie con esempi, scale di livello, chi im…

Leggi l'articolo →
Database e SQL

Esercitazione sulle sottoquery SQL: tipi, sottoquery correlate ed EXISTS con esempi

Un tutorial sulle sottoquery SQL con le query che abbiamo eseguito: sottoquery scalari, IN, FROM e SELECT, sottoquery correlate, EXISTS, trap NOT IN…

Leggi l'articolo →
Database e SQL

Spiegazione di transazioni SQL e ACID: COMMIT, ROLLBACK e livelli di isolamento

Transazioni SQL e ACID spiegate con un bonifico bancario eseguito: COMMIT, ROLLBACK, punti di salvataggio, blocchi, livelli di isolamento, letture s…

Leggi l'articolo →
Sviluppo software

Cheat sheet dei comandi Git: i comandi che usi effettivamente, con esempi

Un cheat sheet dei comandi Git raggruppato per attività: configurazione, staging, rami, telecomandi, stash, cronologia ed errori di annullamento, co…

Leggi l'articolo →
Sviluppo software

Spiegazione delle promesse JavaScript: quindi, cattura, Promise.all ed errori comuni

Promesse JavaScript spiegate con il codice che abbiamo eseguito: stati, catene then e catch, gestione degli errori, Promise.all, allSettled, race an…

Leggi l'articolo →
Sviluppo software

Tutorial sul dizionario Python: metodi, esempi e modelli comuni

Un tutorial sul dizionario Python con il codice che abbiamo eseguito: creazione, lettura e aggiornamento di dettami, metodi chiave, unione, comprens…

Leggi l'articolo →
Intelligenza artificiale

Cos'è il RAG? La generazione aumentata di recupero spiegata con un esempio funzionante

Cos'è il RAG? La generazione aumentata di recupero viene spiegata passo dopo passo: indicizzazione, suddivisione in blocchi, incorporamenti, recuper…

Leggi l'articolo →
DevOps

Tutorial Terraform per principianti: infrastruttura come codice dal primo file ai moduli

Un tutorial su Terraform per principianti: inizia senza account cloud, impara init, pianifica e applica, quindi variabili, output, stato, moduli e u…

Leggi l'articolo →
DevOps

Docker vs Kubernetes: differenze chiave, come funzionano insieme e di cosa hai bisogno

Spiegazione di Docker vs Kubernetes: cosa fa ciascuno, la stessa app viene eseguita con entrambi, Docker Compose e Swarm a confronto, il dockershim …

Leggi l'articolo →
Automazione dei test

Tutorial Pytest per principianti: infissi, parametrizzazione ed esempi reali

Un tutorial pytest per principianti con test che abbiamo eseguito su pytest 9.2: asserzioni, dispositivi, parametrizzazione, conftest, marcatori, tm…

Leggi l'articolo →
Test del software

Ciclo di vita del test del software (STLC): 6 fasi, criteri di ingresso e uscita, esempio

Spiegazione del ciclo di vita del test del software: sei fasi STLC con criteri di ingresso e uscita, risultati finali, un esempio di funzionalità di…

Leggi l'articolo →
Sviluppo software

Git merge vs rebase: differenze, esempi e quando usare ciascuno

Git merge vs rebase spiegato con output reale del log, una tabella di confronto, la regola d'oro del rebase e un flusso di lavoro sicuro per i team.

Leggi l'articolo →
Sviluppo software

List comprehension in Python: sintassi, esempi e quando evitarla

List comprehension in Python spiegata: sintassi, filtri, if-else, cicli annidati, tempi misurati e i casi in cui un normale ciclo for è meglio.

Leggi l'articolo →
Database e SQL

SQL JOIN spiegati con esempi (Inner, Left, Right, Full)

Capisci i JOIN SQL passo dopo passo con tabelle e query di esempio: INNER, LEFT, RIGHT, FULL, CROSS e SELF, con errori comuni e consigli sulle prest…

Leggi l'articolo →