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

  1. Home
  2. Blog
  3. Sviluppo software

Sviluppo software

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

Le promesse sono il modo in cui JavaScript gestisce il lavoro che termina in seguito e async/await è costruito su di esse. Scopri come si comportano realmente, con risultati reali da ogni esempio, ed evita gli errori che inghiottono i tuoi errori.

10 min di lettura
Spiegazione delle promesse JavaScript: quindi, catch, Promise.all ed errori comuni

Punti chiave

  • Una promessa è un oggetto che rappresenta un risultato che sarà disponibile in seguito.
  • È in sospeso finché non viene soddisfatto o rifiutato e, una volta risolto, non cambia mai.
  • Ciascuno then restituisce una nuova promessa, che è ciò che rende possibile il concatenamento.
  • Utilizza Promise.all quando è richiesto ogni risultato e Promise.allSettled quando desideri ogni risultato.

Le richieste di rete, le letture di file e i timer terminano tutti più tardi, ma JavaScript non può semplicemente fermarsi e attendere, altrimenti la pagina si bloccherebbe. Le promesse di JavaScript ti danno un modo ordinato per dire “quando finisce, fai quello, e se fallisce, fai invece questo”.

Anche se scrivi principalmente async e await, stai usando le promesse sottostanti, quindi comprenderle rende il debug molto più semplice. Abbiamo eseguito questi esempi su Node.js 24 e l’output mostrato proviene da quell’esecuzione. Si comportano allo stesso modo nei browser moderni.

Cos’è una promessa?

Una promessa è un segnaposto per un valore futuro. Pensa al cicalino che ti passa un ristorante quando ordini. Non hai ancora il tuo cibo, ma tieni in mano qualcosa che ti dirà quando sarà pronto, o che c’è un problema, e nel frattempo sei libero di fare altre cose.

Nel codice, una funzione asincrona restituisce immediatamente una promessa e alleghi cosa dovrebbe accadere dopo:

fetch("/api/user")
  .then((response) => response.json())
  .then((user) => console.log(user.name))
  .catch((error) => console.log("Failed:", error.message));

I tre stati promessi

Stato Significato Cosa corre
In sospeso Il lavoro non è finito Niente ancora
Soddisfatto Si è concluso con un valore then gestori
Rifiutato Ha fallito per un motivo catch gestori

Una promessa mantenuta o respinta si chiama saldata. Una promessa può essere saldata una sola volta. Successivamente, il suo stato e il suo valore vengono fissi e le chiamate successive a resolve o reject vengono ignorate.

Crea una promessa

Di solito consumi le promesse di API come fetch, ma crearne una mostra come funzionano. Il costruttore riceve due funzioni, resolve e reject:

function fetchUser(id) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (id > 0) {
        resolve({ id, name: "Asha" });
      } else {
        reject(new Error("Invalid id"));
      }
    }, 100);
  });
}

console.log(fetchUser(1));

// Promise { <pending> }

La registrazione immediata della promessa mostra che è ancora in sospeso, poiché il timer non è stato attivato. Il valore può essere raggiunto solo tramite un gestore o await. Rifiuta sempre con un oggetto Error anziché con una stringa, poiché un Error trasporta una traccia dello stack che aiuta con il debug.

poi, cattura e infine

Questi tre metodi collegano i gestori a una promessa:

fetchUser(1).then((user) => console.log(user.name));
// Asha

fetchUser(-1)
  .then((user) => console.log("never runs", user))
  .catch((error) => console.log("caught:", error.message))
  .finally(() => console.log("finally"));

// caught: Invalid id
// finally

then funziona in caso di successo, catch funziona in caso di fallimento e finally funziona in entrambi i casi. Ciò rende finally il posto giusto per la pulizia, ad esempio nascondere uno spinner di caricamento. Non riceve argomenti, perché non dovrebbe preoccuparsi del risultato.

Concatenare le promesse

L’idea chiave è che then restituisce sempre una nuova promessa. Qualunque cosa restituisca il tuo gestore diventa il valore di quella nuova promessa:

Promise.resolve(2)
  .then((n) => n * 10)
  .then((n) => n + 1)
  .then((n) => console.log("chain:", n));

// chain: 21

Se un gestore restituisce un’altra promessa, la catena attende che la situazione si stabilizzi prima di proseguire. Questo è ciò che trasforma i callback nidificati in una sequenza piatta di passaggi:

getUser(id)
  .then((user) => getOrders(user.id))
  .then((orders) => getInvoice(orders[0].id))
  .then((invoice) => console.log(invoice.total))
  .catch(handleError);

Come gli errori viaggiano attraverso una catena

Una promessa rifiutata salta ogni then finché non raggiunge un catch. Anche gettare dentro un conduttore conta come un rifiuto. E un catch che ritorna normalmente riporta la catena in carreggiata:

Promise.resolve("start")
  .then(() => {
    throw new Error("step 2 failed");
  })
  .then(() => console.log("skipped"))
  .catch((error) => {
    console.log("caught:", error.message);
    return "recovered";
  })
  .then((value) => console.log("continues:", value));

// caught: step 2 failed
// continues: recovered

Pensatela come la versione asincrona di try e catch. Uno catch alla fine solitamente copre l’intera catena. Se vuoi solo registrare un errore e fallire comunque, lancialo di nuovo dall’interno di catch.

Suggerimento: fetch rifiuta solo in caso di errori di rete. Una risposta 404 o 500 è comunque soddisfacente, quindi controlla tu stesso response.ok. Il nostro trucco sui codici di stato HTTP spiega il significato di ciascun codice.

Promise.all, allSettled, razza e altro

Questi metodi statici coordinano più promesse contemporaneamente. Tutti prendono un array e restituiscono una promessa.

Metodo Soddisfa quando Rifiuta quando Usalo per
Promise.all Tutto soddisfa Nessuno rifiuta Tutti i risultati sono obbligatori
Promise.allSettled Tutto sistemato Mai Vuoi ogni risultato
Promise.race Il primo a stabilirsi soddisfa Il primo a liquidare gli scarti Timeout
Promise.any Il primo soddisfa Tutti rifiutano La prima fonte di successo

Per testarli, abbiamo utilizzato due piccoli aiutanti, uno che funziona dopo un ritardo e uno che fallisce dopo un ritardo:

const wait = (ms, value) =>
  new Promise((resolve) => setTimeout(() => resolve(value), ms));
const fail = (ms, message) =>
  new Promise((_, reject) => setTimeout(() => reject(new Error(message)), ms));

Promise.all

await Promise.all([wait(300, "a"), wait(100, "b"), wait(200, "c")]);

// [ 'a', 'b', 'c' ]   took about 300 ms

Due dettagli da notare. I risultati mantengono l’ordine di input, anche se b è arrivato primo. E il tempo totale è stato di circa 300 ms, il tempo dell’attività più lenta e non la somma di 600 ms, perché tutti e tre erano già in esecuzione contemporaneamente. Se uno di loro rifiuta, tutti rifiutano immediatamente:

await Promise.all([wait(100, "a"), fail(50, "b failed")]);

// rejected: b failed

Promise.allSettled

Questo attende tutto e segnala ogni risultato, quindi un fallimento non perde il resto. Si adatta a una dashboard in cui ciascun widget viene caricato in modo indipendente:

const results = await Promise.allSettled([wait(50, "a"), fail(50, "b failed")]);
results.map((r) => r.status);

// [ 'fulfilled', 'rejected' ]

Promise.race e Promise.any

await Promise.race([wait(300, "slow"), wait(100, "fast")]);   // fast
await Promise.any([fail(50, "x"), wait(100, "ok")]);          // ok

La differenza è che race prende il primo per risolversi, anche se fallisce, mentre any ignora i fallimenti finché qualcosa riesce. Un uso classico di race è l’aggiunta di un timeout a una richiesta lenta, sebbene l’attività più lenta continui a essere eseguita in background a meno che non venga annullata.

Promesse e asincrono/attendono

async e await sono un modo più leggibile per lavorare con le stesse promesse. Una funzione async restituisce sempre una promessa e await mette in pausa quella funzione finché non viene stabilita una promessa:

async function showInvoice(id) {
  try {
    const user = await getUser(id);
    const orders = await getOrders(user.id);
    console.log(orders.length);
  } catch (error) {
    console.log("Failed:", error.message);
  }
}

I rifiuti diventano errori generati, quindi i normali try e catch funzionano. Hai ancora bisogno di Promise.all per il lavoro parallelo, perché aspettando una chiamata dopo l’altra le esegui in sequenza. La nostra guida JavaScript async/await approfondisce questo aspetto.

Le promesse e il ciclo degli eventi

I gestori delle promesse non vengono mai chiamati immediatamente, anche quando la promessa è già stata saldata. Vengono eseguiti al termine del codice corrente e prima di qualsiasi timer. Ecco la prova:

setTimeout(() => console.log("timeout"), 0);
Promise.resolve().then(() => console.log("microtask"));
console.log("sync");

// sync
// microtask
// timeout

Il codice sincrono viene eseguito per primo. Poi arriva la coda di microtask, che contiene i gestori delle promesse. Solo allora il ciclo degli eventi riprende la attività successiva, ad esempio un timer. Questa è una domanda popolare nelle interviste e spiega perché un setTimeout pari a zero non è proprio immediato.

Promesse vs richiamate

Preoccupazione Richiamate Promesse
Sequenziamento Nidificato, più profondo ad ogni passo Una catena piatta
Errori Controllato ad ogni livello Uno catch può coprire la catena
Lavoro parallelo Contatori manuali Promise.all
Chiamato due volte per sbaglio? Possibile Non è possibile accontentarsi due volte

Errori comuni

  • Dimenticando di tornare dentro then. Senza un return, il passo successivo riceve undefined e non attende la tua promessa interiore.
  • No catch affatto. Ciò provoca un rifiuto non gestito e in Node.js interrompe il processo per impostazione predefinita.
  • Annidamento invece di concatenamento. L’inserimento di then all’interno di then ricrea l’inferno delle richiamate. Restituisci la promessa e continua la catena.
  • Racchiudere una promessa in new Promise. Se una funzione restituisce già una promessa, usala.
  • Utilizzando forEach con callback asincroni. Non aspetta. Utilizza for...of o Promise.all con map, come mostrato nella nostra guida ai metodi di array JavaScript.
  • Pensare che una promessa possa essere annullata.Non può da sola. Per le richieste, utilizzare AbortController.

Considerazioni finali

Le promesse si riducono a poche regole: una promessa viene mantenuta una volta, then restituisce una nuova promessa e gli errori viaggiano lungo la catena finché qualcosa non li cattura. Una volta che queste regole sembrano naturali, async e await smettono di essere magiche. Per esercitarti, riscrivi una funzione basata su callback utilizzando le promesse, quindi recupera due endpoint con Promise.all e gestisci correttamente un errore.

Domande frequenti

Cos’è una promessa in JavaScript?

Una promessa è un oggetto che rappresenta il risultato finale del lavoro asincrono. Inizia come in sospeso, quindi si soddisfa con un valore o si rifiuta con un motivo.

Qual è la differenza tra then e catch?

poi corre quando una promessa si realizza, e cattura corre quando la rifiuta. catch è quindi effettivamente dotato solo di un gestore di rifiuto e può anche rilevare gli errori generati nei passaggi precedenti.

Qual è la differenza tra Promise.all e Promise.allSettled?

Promise.all rifiuta non appena una promessa viene rifiutata. Promise.allSettled li aspetta sempre tutti e segnala lo stato, il valore o il motivo di ciascuno.

Dovrei usare promesse o async/await?

Lavorano insieme, poiché l’attesa si basa sulle promesse. La maggior parte del codice viene letto meglio con async/await, mentre Promise.all e metodi simili rimangono utili per il lavoro parallelo.

Le promesse corrono parallele?

JavaScript esegue un pezzo di codice alla volta su un thread, ma funziona come se le richieste di rete avvenissero in background. Molti di questi possono essere in corso contemporaneamente.

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 →