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.
- Pytest trova le funzioni denominate
test_*e le controlla con semplici istruzioniassert. - Le fixture forniscono impostazioni e pulizie riutilizzabili, richieste semplicemente nominandole come argomenti.
@pytest.mark.parametrizeesegue un test con molti input.- Inserisci gli apparecchi condivisi in
conftest.pye 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
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.
Altre guide su test, intelligenza artificiale e sviluppo moderno
Ti è piaciuto questo articolo? Scegli un argomento e passa direttamente ai nostri tutorial più recenti.
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 →DevOpsSpiegazione 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 softwareSpiegazione 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 testDerisione 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 softwareSpiegazione 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 SQLDELETE 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 SQLSpiegazione 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 softwareInterfaccia 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 softwareSpiegazione 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 softwareFunzioni 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 artificialeCosa 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 →DevOpsMonitoraggio 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 →DevOpsVolumi 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 testTDD 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 softwareTest 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 SQLSpiegazione 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 SQLIstruzione 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 softwareCos'è 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 softwareSpiegazione 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 softwareSpiegazione 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 artificialeCosa 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 →DevOpsDistribuzione 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 testTest 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 softwareTest 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 softwareCaso 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 SQLOttimizzazione 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 SQLSQL 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 softwareTutorial 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 softwareGestione 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 softwareClassi 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 artificialeChe 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 →DevOpsComandi 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 testSelenio 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 softwarePartizionamento 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 softwareGravità 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 SQLEsercitazione 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 SQLSpiegazione 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 softwareCheat 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 softwareSpiegazione 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 softwareTutorial 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 artificialeCos'è 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 →DevOpsTutorial 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 →DevOpsDocker 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 testTutorial 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 softwareCiclo 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 softwareGit 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 softwareList 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 SQLSQL 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 →