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

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

Automazione dei test

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

I mock ti consentono di testare il codice senza una rete, un database o un orologio reali. Usati con noncuranza, lasciano passare anche il codice rotto. Ecco come utilizzare correttamente unittest.mock, con ogni esempio eseguito.

8 min di lettura
Beffardo in Python: unittest.mock, patch e gli errori che fanno mentire i test

Punti chiave

  • Un mock sostituisce un oggetto reale, come un client API, quindi i test vengono eseguiti velocemente e offline.
  • Utilizzare return_value per una risposta fissa e side_effect per errori o una sequenza.
  • Patch il nome dove viene utilizzato, non dove è definito. Questo è il bug più comune.
  • Utilizzare spec o autospec in modo che errori di battitura e argomenti errati falliscano invece di passare in silenzio.

La tua funzione chiama un’API meteo. Il tuo test non dovrebbe dipendere da Internet, da una chiave API o dal tempo di domani. Il built-in di Python unittest.mock ti consente di sostituire quella chiamata con una controfigura che restituisce esattamente ciò che scegli.

Abbiamo scritto un piccolo modulo weather e nove test, tutti eseguiti con lo unittest di Python 3.13. Tutti e nove sono stati superati e i risultati stampati di seguito provengono da quella tiratura.

Perché deridere?

  • Velocità: nessuna chiamata di rete o configurazione del database.
  • Affidabilità: i test non falliscono perché un servizio di terze parti è inattivo.
  • Controllo: puoi simulare timeout, errori e dati dispari su richiesta.
  • Isolamento: metti alla prova la tua logica, non il server di qualcun altro.

I mock appartengono principalmente agli unit test. I test di integrazione dovrebbero comunque parlare di dipendenze reali o realistiche.

Nozioni di base finte

from unittest.mock import Mock

api = Mock()
api.get_price.return_value = 499

print(api.get_price("pen"))                # 499
api.get_price.assert_called_once_with("pen")
print(api.get_price.call_args_list)        # [call('pen')]
print(api.anything_at_all())               # <Mock name='mock.anything_at_all()' ...>

A Mock registra ogni chiamata, così puoi verificare come è stata utilizzata. Notate l’ultima riga, però. Un semplice Mock inventa qualsiasi attributo tu chieda. Questa flessibilità è conveniente e anche pericolosa, come vedremo.

MagicMock ha la stessa idea ma supporta anche metodi “magici” come __len__ e __iter__. patch() utilizza MagicMock per impostazione predefinita.

side_effect: errori e sequenze

side_effect controlla cosa succede ad ogni chiamata. Impostalo su un’eccezione per simulare un errore:

api.fetch.side_effect = ConnectionError("down")
api.fetch()   # raises ConnectionError

Impostalo su un elenco per restituire risultati diversi nelle chiamate successive. Questo è perfetto per testare la logica dei tentativi:

def fetch_with_retry(api, attempts=3):
    for _ in range(attempts):
        try:
            return api.fetch()
        except ConnectionError:
            continue
    raise ConnectionError("all attempts failed")

api = Mock()
api.fetch.side_effect = [ConnectionError("busy"), {"ok": True}]
print(fetch_with_retry(api))    # {'ok': True}
print(api.fetch.call_count)     # 2

La prima chiamata non è riuscita, la seconda ha avuto successo e il test ha dimostrato che la funzione ha riprovato esattamente una volta. Simulare questo rispetto a un servizio reale sarebbe quasi impossibile.

patch(): sostituisce qualcosa temporaneamente

Spesso la dipendenza non viene passata. Viene importata all’interno del modulo. patch() lo scambia per la durata di un test e lo ripristina successivamente:

# weather.py
from http_client import get as requests_get

def report(city):
    data = requests_get(f"https://api.example.com/weather?city={city}")
    return f"{city}: {data['temp_c']}°C"
from unittest.mock import patch

with patch("weather.requests_get") as fake_get:
    fake_get.return_value = {"temp_c": 31}
    print(weather.report("Pune"))   # Pune: 31°C
    fake_get.assert_called_once_with(
        "https://api.example.com/weather?city=Pune")

Puoi usare patch come gestore di contesto come questo, o come decoratore, che passa il mock come argomento.

Patch dove viene utilizzata, non dove è definita

Questo è l’errore che quasi tutti commettono una volta. La vera funzione get risiede in http_client, quindi sembra naturale patcharla lì:

with patch("http_client.get") as fake_get:
    fake_get.return_value = {"temp_c": 99}
    weather.report("Pune")

# ConnectionError: no network in tests: https://api.example.com/weather?city=Pune

La vera funzione è stata eseguita. Quando weather.py ha fatto from http_client import get as requests_get, ha creato il proprio nome che punta alla funzione originale. La patch http_client.get ha cambiato un nome diverso, quindi weather non ha mai visto il mock. Il nostro http_client.get rilancia apposta, quindi l’errore è stato clamoroso. In un progetto reale, potrebbe tranquillamente chiamare un’API live.

Regola: patcha il nome nel modulo sotto test, scritto come "module_under_test.name". Se il modulo ha fatto import http_client e chiama http_client.get(), l’applicazione della patch "http_client.get" è corretta, perché la ricerca avviene al momento della chiamata.

spec e autospec: rendi i mock rigorosi

Un semplice Mock accetta qualsiasi cosa, compresi gli errori di battitura. Con una specifica, consente solo gli attributi della classe reale:

api = Mock(spec=weather.WeatherClient)
api.get_temprature("Pune")
# AttributeError: Mock object has no attribute 'get_temprature'

loose = Mock()
loose.get_temprature("Pune")    # returns a Mock, no error at all

La versione simulata accettava volentieri il metodo di ortografia errata, quindi un test che lo utilizzava poteva passare anche se il codice reale si bloccava. autospec va oltre e controlla le firme dei metodi:

with patch("weather.WeatherClient", autospec=True) as Fake:
    client = Fake.return_value
    client.get_temperature("Pune", "extra", "args")
# TypeError: too many positional arguments

Preferisci autospec=True o create_autospec() quando deridi le tue stesse lezioni. Mantiene le finte oneste mentre il codice reale cambia.

Date e orari beffardi

Il codice che dipende dalla data odierna è difficile da testare. Avvolgi l’orologio in una piccola funzione e applica la patch che:

def today():
    return datetime.date.today()

def is_weekend():
    return today().weekday() >= 5

@patch("weather.today")
def test_date(self, fake_today):
    fake_today.return_value = datetime.date(2026, 11, 7)
    print(weather.is_weekend())   # True (a Saturday)

Non è possibile applicare facilmente una patch datetime.date.today direttamente, perché i tipi incorporati non consentono l’impostazione dei loro attributi. Biblioteche come Freezegun e Time Machine gestiscono questo problema in modo più completo.

Affermazioni sui mock

Metodo Controlli
assert_called() Chiamato almeno una volta
assert_called_once() Chiamato esattamente una volta
assert_called_with(...) L’ultima chiamata ha utilizzato questi argomenti
assert_called_once_with(...) Esattamente una chiamata, con questi argomenti
assert_any_call(...) Qualsiasi chiamata utilizzava questi argomenti
assert_not_called() Mai chiamato

Quando un’asserzione fallisce, il messaggio è chiaro. Abbiamo chiamato assert_called_once() su un metodo che non è mai stato eseguito:

AssertionError: Expected 'save' to have been called once. Called 0 times.

Le versioni precedenti di Python consentono il passaggio silenzioso dei metodi di asserzione con errori di ortografia, come assret_called_once. Le versioni moderne sollevano un errore per i nomi che iniziano con assert o per errori di ortografia comuni, ma una specifica è ancora la guardia più forte.

pytest e schernisce

Tutto quanto sopra funziona anche in pytest. Molti utenti pytest utilizzano anche il dispositivo monkeypatch integrato per semplici sostituzioni, o il plugin pytest-mock, che fornisce un dispositivo mocker che annulla automaticamente le patch. Per tutti vale la regola “patch dove viene utilizzata”. Consulta il nostro tutorial pytest per dispositivi e configurazione.

Quando non deridere

  • Non deridere ciò che stai testando. Se la derisione fa tutto il lavoro, il test non dimostra nulla.
  • Evita di prendere in giro oggetti di valore semplice. Usa oggetti reali.
  • Non deridere tutto. I test pieni di simulazioni spesso si interrompono ogni volta che viene effettuato il refactoring del codice, anche quando il comportamento è corretto.
  • Esegui alcuni test di integrazione reali. I mock codificano le tue ipotesi su un servizio e tali ipotesi possono essere errate.

Le simulazioni inoltre gonfiano facilmente la copertura del codice, poiché i percorsi simulati vengono eseguiti senza alcun comportamento reale dietro di loro.

Errori comuni di scherno

  • Correzione del nome sbagliato. Trattato sopra, e ancora la causa numero uno di “la mia simulazione viene ignorata”.
  • Dimenticare di impostare return_value. Il codice in prova riceve quindi un oggetto Mock invece dei dati. Potrebbe passare direttamente attraverso la tua funzione e fare un test superato per sbaglio, ad esempio quando controlli solo che un risultato sia veritiero.
  • Affermare sulla finzione invece che sul risultato. Controllare che save() sia stato chiamato è più debole che controllare cosa è stato salvato. Utilizzare assert_called_once_with(...) con argomenti reali o, meglio, affermare il risultato della funzione.
  • Patch che perdono. Chiamare patcher.start() senza stop() lascia il falso sul posto per test successivi. Utilizzare il gestore del contesto, il decoratore o addCleanup(patcher.stop).
  • Decoratori impilati nell’ordine sbagliato. Con diversi @patch decoratori, quello in basso viene passato come primo argomento. Mescolarli silenziosamente configura la finzione sbagliata.
  • Deridere una libreria che non possiedi in molti test. Avvolgilo in una piccola classe tutta tua e prendilo in giro invece. I tuoi test descrivono quindi le tue esigenze, non l’API della biblioteca.

Mock, stub e falsi

Queste parole sono spesso usate in modo approssimativo, ma le differenze aiutano quando si parla di test. Uno stub restituisce semplicemente risposte predefinite. Un mock registra anche le chiamate in modo da poter verificare come è stato utilizzato. Un falso è un’implementazione funzionante e semplificata, come un repository in memoria invece di un database. Python Mock può fungere da stub o mock. I fake sono classi ordinarie che scrivi tu stesso e spesso portano a test che sopravvivono meglio al refactoring, perché controllano il comportamento piuttosto che le chiamate esatte.

Una buona regola pratica è deridere i bordi del proprio sistema: la rete, l’orologio, i numeri casuali, il file system e i servizi di terze parti a pagamento. All’interno di quei bordi, preferisci gli oggetti reali. I test costruiti in questo modo rimangono veloci ed esercitano comunque il codice effettivamente scritto.

Considerazioni finali

Il mocking è uno strumento preciso: sostituisci dipendenze lente o imprevedibili, controlla cosa restituiscono e controlla come il tuo codice le ha utilizzate. Due abitudini prevengono la maggior parte dei problemi. Patch il nome nel modulo sotto test e usa autospec in modo che i tuoi mock rifiutino le chiamate che l’oggetto reale rifiuterebbe.

Domande frequenti

Cos’è il mocking in Python?

Il mocking sostituisce un oggetto reale, come un client API o un database, con un falso che controlli durante un test. Python lo include nel modulo unittest.mock.

Qual è la differenza tra Mock e MagicMock?

MagicMock è un Mock che supporta anche metodi magici come __len__, __iter__ e __enter__. patch() crea un MagicMock per impostazione predefinita.

Perché la mia patch non funziona?

Di solito perché hai applicato la patch dove è definito l’oggetto invece di dove viene utilizzato. Patch il nome all’interno del modulo sotto test.

Qual è la differenza tra return_value e side_effect?

return_value imposta un risultato fisso. side_effect può sollevare un’eccezione, restituire valori da un elenco in ordine o chiamare una funzione.

Cosa fa l’autospec?

Costruisce una simulazione dell’oggetto reale, quindi gli attributi mancanti e gli argomenti errati generano errori, proprio come farebbero con il codice reale.

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 →