Piano di test pre-produzione per un'API di contabilità
Un manuale di affidabilità per i team di ingegneria: scritture duplicate, riutilizzo dell idempotenza, firme dei webhook, eventi fuori sequenza, importi decimali in denaro, ambiti (scopes), blocchi di periodo e ripristino.
Un codice 201 Created da un'API di contabilità non dice quasi nulla. Conferma che il server ha risposto, ma non garantisce che esista esattamente una fattura, che i debiti uguaglino i crediti, che il numero di documento sia stato assegnato una sola volta o che un nuovo tentativo dopo una connessione caduta non registri una seconda copia. La maggior parte dei duplicati contabili in produzione deriva da questo divario: una modifica (mutation) registrata sul server mentre il client si trovava con un esito sconosciuto e ha riprovato silenziosamente con una nuova chiave.
Questo piano è destinato ai team che valutano un'API di contabilità prima di integrarla nei libri contabili reali. Si concentra sul comportamento in caso di errore, non sui percorsi ideali (happy paths). Ciascuna area descritta di seguito indica cosa testare, cosa verificare tramite asserzioni e cosa costituisce il superamento del test. Il contesto di implementazione qui considerato è Nordlet, la cui API utilizza chiavi di tipo bearer con ambiti definiti (scoped bearer keys), importi in stringhe decimali, chiavi di idempotenza e webhook firmati. Per la sintassi esatta degli endpoint e i contratti di risposta, consultare le pagine relative alle convenzioni API e a Come iniziare invece di affidarsi ad ipotesi.
Cosa significa realmente "superare" un test
Un test dimostra che un'integrazione contabile è sicura solo quando verifica la semantica e non i codici di stato. Per ogni scenario, la suite dovrebbe confermare:
- Effetto collaterale di business: esiste esattamente un cliente, una fattura, una registrazione prima nota (journal entry), un'assegnazione di numerazione o una transizione di pagamento.
- Integrità contabile: i debiti uguagliano i crediti e la precisione monetaria sopravvive alla serializzazione.
- Comportamento di ripetizione (replay): un nuovo tentativo restituisce il risultato originale anziché un nuovo record.
- Durabilità: i record di audit e gli eventi webhook esistono una volta che l'operazione è stata confermata (commit).
- Fallimenti senza effetti collaterali: le richieste rifiutate non consumano numeri di documento e non scrivono righe parziali nel mastro.
- Ripristino: un errore transitorio può essere ripetuto senza duplicazioni o perdite permanenti.
Le linee guida sulle API di Google tracciano chiaramente il limite: solo le operazioni la cui esecuzione ripetuta lascia lo stesso stato finale sono sicure da ripetere, e un'API dovrebbe identificare quali operazioni sono idempotenti anziché ripetere ciecamente qualsiasi errore.
Configurare un ambiente monouso e osservabile
Utilizzare un'azienda sandbox, non i libri contabili di produzione. Un'azienda sandbox di Nordlet utilizza gli stessi moduli e lo stesso comportamento API di un'azienda reale ed è contrassegnata come dato di test, il che la rende sicura per test ad alto volume di duplicati e guasti. Il flag non può essere modificato dopo la creazione, impedendo quindi che i libri contabili reali vengano riclassificati successivamente come dati di test. Si noti che l'utilizzo del sandbox viene misurato e fatturato esattamente come l'utilizzo in un'azienda reale, quindi è opportuno dimensionare i test di volume in base al listino prezzi sottoscritto.
Prima di scrivere qualsiasi test, preparare:
- Un'azienda sandbox dedicata con
isSandbox: true. - Una chiave API di test limitata ai soli moduli oggetto di test.
- Un endpoint webhook o un tunnel locale che preservi il corpo della richiesta grezzo (raw request body).
- Clienti, fornitori e un piano dei conti noto precaricati (seeded).
- Almeno due periodi contabili: uno aperto e uno chiuso a chiave (locked).
- Un orologio di test o una fixture di data, se l'implementazione ne supporta una.
- Un archivio locale che registri ogni tentativo di richiesta, chiave di idempotenza, hash di risposta, consegna del webhook e risultato della riconciliazione.
Non eseguire test di duplicazione su dati di staging condivisi. Un cliente o una fattura isolati provenienti da un'esecuzione precedente renderebbero ambigue le successive asserzioni.
La fixture per ogni modifica dovrebbe catturare il metodo, l'endpoint, il corpo completo, la chiave di idempotenza, l'ambito della chiave (key scope), un ID di correlazione del client, i timestamp di inizio e fine, lo stato della risposta, gli header, il corpo, l'ID della richiesta e se la connessione è caduta prima dell'arrivo della risposta. Utilizzare stringhe decimali fisse come "75.0000" per gli importi monetari. Nordlet rappresenta i valori monetari come stringhe decimali con un massimo di quattro cifre decimali, e la sua fattura di esempio utilizza questo formato.
L'altra metà della configurazione riguarda l'iniezione di guasti (failure injection). Il framework di test dovrebbe essere in grado di ritardare una risposta, interrompere una connessione TCP dopo che il server ha ricevuto la richiesta, restituire risposte sintetiche 429/500/502/503/504, restituire un codice diverso da 2xx dal ricevitore del webhook, consegnare lo stesso webhook due volte, riordinare gli eventi, corrompere un byte del corpo di un webhook, modificare il payload di una chiave di idempotenza mantenendo la chiave stessa, eseguire due richieste identiche contemporaneamente e bloccare un periodo tra la configurazione e la registrazione. Questi scenari valgono più di cento esempi basati sul percorso ideale.
Bloccare il contratto prima di scrivere la logica di ripetizione
Generare o recuperare lo schema OpenAPI e confrontarlo con il client. Nordlet pubblica la sua specifica OpenAPI nella sezione di riferimento API e genera i propri SDK tipizzati a partire dalla stessa specificazione, pertanto i test basati sullo schema superano le ipotesi scritte a mano.
Verificare i campi obbligatori e i tipi di dati, i campi con stringhe decimali, i formati di data e timestamp, le azioni e gli ambiti consentiti, la struttura della risposta di errore (error envelope), gli schemi degli eventi webhook, quali modifiche accettano una chiave di idempotenza e quali campi di risposta identificano l'oggetto creato.
Criteri di superamento. Il client rifiuta localmente i payload non validi laddove lo schema lo consente. Le risposte del server corrispondono allo schema documentato. Decimali non validi, date errate e campi obbligatori mancanti producono errori di validazione strutturati. Non viene effettuato alcun tentativo di ripetizione per un errore di validazione deterministico.
Modalità di guasto da intercettare. Un client analizza "121.0000" trasformandolo in un numero a virgola mobile binario (binary float) e serializza un importo leggermente diverso in un secondo momento. I numeri interi passano; le righe dell'IVA e le quantità frazionarie falliscono. Testare i valori monetari come stringhe end-to-end.
Autorizzazione e isolamento dei tenant
Utilizzare chiavi separate per la lettura e la scrittura. Testare quindi l'intera matrice: chiave mancante, chiave non valida, chiave valida con ambito di modulo insufficiente, chiave valida con l'ambito corretto, chiave appartenente a un'altra azienda e tentativo di leggere un oggetto da un'azienda differente.
Asserzioni:
- Le credenziali mancanti o non valide restituiscono
401. - Una chiave valida priva dell'autorizzazione richiesta restituisce
403. - Non viene creato alcun effetto collaterale contabile per nessuno dei due tipi di errore.
- Una richiesta andata a buon fine non può leggere o modificare i record di un'altra azienda.
- Gli errori di sicurezza non vengono mai ripetuti automaticamente.
Criterio di superamento. È possibile dimostrare sia la correttezza dell'autorizzazione sia l'isolamento dei tenant tramite letture successive al test, e non solo tramite i codici di stato.
Dimostrare una transazione pulita
Eseguire un flusso piccolo e deterministico: creare o trovare un cliente di prova, creare una fattura con importi in stringhe decimali, emetterla, leggere la fattura e il suo effetto contabile, leggere il record di audit e ricevere il webhook. L'esempio di avvio rapido di Nordlet mostra l'emissione di una fattura che assegna un numero senza interruzioni di sequenza (gapless), verifica che il periodo sia aperto e registra una prima nota bilanciata nella stessa transazione.
Asserire che la fattura raggiunga lo stato previsto, che il numero di documento sia assegnato esattamente una volta, che i debiti uguaglino i crediti, che l'IVA e i totali di riga corrispondano al calcolo arrotondato per eccesso sul valore intero (half-up calculation), che il record di audit indichi l'attore e la modifica, che il webhook venga infine consegnato e che la risposta dell'API e una successiva lettura concordino sull'ID e sullo stato della fattura.
Una distinzione importante da tenere a mente: l'arrivo di un webhook non è la prova che la modifica sia stata confermata. La risposta dell'API unita a una lettura di verifica costituiscono le asserzioni primarie della transazione. Il webhook dimostra la notifica ai sistemi a valle e viene testato separatamente.
Idempotenza: stessa chiave, stesso corpo
Generare una chiave per ciascuna operazione di business logica, e non una chiave per tentativo di rete. Inviare la modifica con la chiave K e il corpo B, salvare l'ID creato, quindi inviare esattamente la stessa richiesta una seconda volta.
Asserire che la seconda risposta rappresenti la stessa operazione, che l'ID dell'oggetto sia identico e che esista un solo oggetto di business, una sola registrazione, un solo numero di documento e un solo effetto finanziario. La risposta ripetuta deve riportare l'header di ripetizione documentato (x-idempotent-replay: true nel caso di Nordlet) e la traccia di audit non deve mostrare alcuna seconda modifica.
Due regole di memorizzazione modificano ciò che il ciclo di ripetizione dovrebbe aspettarsi, quindi testatele direttamente: un errore 4xx memorizzato viene ripetuto come qualsiasi altra risposta, mentre un errore 5xx non viene memorizzato affatto; pertanto, un nuovo tentativo dopo un errore del server riesegue l'operazione anziché ripetere la risposta. Le chiavi inoltre scadono (dopo 24 ore in Nordlet), il che limita il periodo di tempo in cui è disponibile la ripetizione.
La documentazione di Nordlet promette che l'aggiunta di un header Idempotency-Key impedisce a una richiesta ripetuta di creare un duplicato, e le sue convenzioni API definiscono l'header di ripetizione esatto e il requisito di risposta identica byte per byte. Il principio corrisponde al modello pubblicato da Stripe: una chiave identifica l'operazione logica, le ripetizioni restituiscono il risultato memorizzato e una chiave riutilizzata con parametri differenti viene rifiutata anziché modificata silenziosamente.
Criterio di superamento. Esiste esattamente una transizione di stato finanziario, indipendentemente dal numero di volte in cui il client invia la stessa richiesta all'interno della finestra di ripetizione.
Idempotenza: stessa chiave, corpo modificato
Inviare la richiesta originale con la chiave K e il corpo B1, seguita da una seconda richiesta con la chiave K e il corpo B2, dove almeno un importo, un cliente, una data o una riga differiscono.
Risultato atteso: la richiesta viene rifiutata con l'errore di riutilizzo della chiave documentato (Nordlet restituisce 422 idempotency_key_reuse), il record originale rimane intatto, non compaiono un secondo record, un nuovo numero o una modifica di audit e il client non "correla" l'errore generando una nuova chiave. Accettare silenziosamente B2 renderebbe le chiavi di ripetizione non sicure.
Richieste duplicate concorrenti
Inviare due richieste identiche con la stessa chiave nello stesso istante. A seconda del comportamento documentato, una viene eseguita mentre l'altra riceve un conflitto in corso (Nordlet restituisce 409 idempotency_in_progress) oppure entrambe osservano infine lo stesso risultato.
Asserire che entrambe le chiamate non possano creare effetti finanziari indipendenti, che venga assegnato al massimo un numero di documento, che un conflitto temporaneo venga ripetuto con la stessa chiave anziché con una nuova, che la risorsa finale sia completa e leggibile e che il record di idempotenza non rimanga bloccato in modo permanente.
Modalità di guasto. Una libreria di ripetizione che genera un nuovo UUID per ogni tentativo trasforma un'operazione logica in diverse scritture indipendenti, vanificando completamente l'idempotenza.
L'esito incerto dopo una connessione caduta
Questa è la simulazione di produzione più importante in assoluto. Inviare una modifica con la chiave K, consentire al server di confermarla, interrompere la connessione prima che arrivi la risposta, registrare l'esito come sconosciuto, quindi riprovare con la stessa chiave K e riconciliare leggendo la risorsa e i dati di audit.
Asserire che il nuovo tentativo restituisca la risposta di ripetizione originale o documentata, che esista esattamente un effetto collaterale finanziario, che il client contrassegni l'operazione come completata solo dopo una ripetizione riuscita o una lettura di riconciliazione e che non venga generata alcuna nuova chiave. Un timeout non significa "non è successo nulla". Stripe descrive l'idempotenza precisamente come protezione contro gli errori di connessione in cui il server potrebbe aver elaborato una modifica prima che il client potesse ricevere la risposta.
Una policy di ripetizione conservativa
Le decisioni di ripetizione dipendono sia dall'errore sia dal fatto che l'operazione sia idempotente, e non solo dal metodo HTTP.
Generalmente ripetibile, stessa chiave mantenuta: ripristino della connessione o timeout dopo un'operazione idempotente, 408, 429 dopo aver rispettato il valore di retry-after, e 502/503/504. Una risposta di idempotenza in corso documentata può essere ripetuta dopo un breve ritardo.
Non ripetibile senza riconciliazione: errori di validazione 400/422, errori di autenticazione 401/403, 404 per una risorsa mancante, conflitti di business 409 non correlati a una chiave in corso, un payload modificato su una chiave esistente e un rifiuto dovuto al blocco del periodo.
Asserire un backoff esponenziale limitato con jitter, un numero massimo esplicito di tentativi e di tempo trascorso, il rispetto di retry-after per i limiti di frequenza (rate limits), il mantenimento della stessa chiave tra i tentativi di una singola operazione, una nuova chiave per ogni nuova operazione e log che separino il tentativo originale dai tentativi successivi.
Testare la limitazione della frequenza (rate limiting) autonomamente. Superare la soglia documentata (Nordlet consente di default 300 richieste al minuto per chiave API, e alcuni endpoint non autenticati presentano limiti inferiori per singolo indirizzo), quindi confermare che il server restituisca la risposta di limite di frequenza superato, che il client interpreti retry-after come un ritardo anziché come un errore, che si metta in pausa invece di effettuare richieste ripetute e aggressive, e che un nuovo tentativo di modifica limitata riutilizzi la chiave originale. Gli header x-ratelimit-* riportano il budget rimanente, il che costituisce un'ottima pre-asserzione. Tenere i test sui limiti di frequenza separati dalle asserzioni finanziarie, a meno che la fixture non sia in grado di distinguere un tentativo limitato da uno andato a buon fine.
Verifica della firma del webhook
Creare un ricevitore che preservi i byte grezzi. Per ogni evento: catturare il corpo grezzo, leggere l'header x-nordlet-signature, calcolare l'HMAC-SHA256 atteso utilizzando il segreto di sottoscrizione, confrontare i valori utilizzando una funzione a tempo costante (constant-time function), analizzare il JSON solo dopo la verifica, registrare la consegna e restituire rapidamente un codice 2xx dopo l'accettazione duratura. Nordlet firma un HMAC sul corpo grezzo, lo invia come sha256=<hex> e ripete le consegne con backoff esponenziale. Le linee guida sui webhook di Stripe rafforzвают la necessità di verificare il corpo grezzo non modificato tramite un confronto a tempo costante.
Eseguire test negativi: corpo e segreto corretti, corpo corretto con segreto errato, modifica di un singolo byte nel corpo, JSON serializzato nuovamente con spazi bianchi alterati, header mancante, firma malformata, ripetizione di una vecchia consegna se lo schema include un timestamp, e firma valida consegnata alla sottoscrizione sbagliata.
Criteri di superamento. Vengono accettati solo il corpo grezzo e il segreto corretti. Le firme non valide ricevono un codice diverso da 2xx. I payload non validi non entrano mai nella coda contabile. I segreti rimangono esclusi dai log ordinari. Il gestore invia il riscontro (acknowledgment) solo dopo che l'evento è stato registrato in modo duraturo.
Webhook duplicati e fuori sequenza
L'affidabilità della consegna è un problema distinto dall'idempotenza delle API, e anche il ricevitore deve essere idempotente. Consegnare lo stesso evento due volte, consegnare un evento sale_invoice.paid prima di un evento sale_invoice.issued, restituire un errore 500 dopo aver salvato i dati ma prima di rispondere, e ripetere un evento che il consumatore ha già elaborato.
Asserire che le consegne duplicate non duplichino pagamenti, modifiche di stato o azioni di prima nota, che la chiave di deduplicazione utilizzi l'ID di consegna o di evento del provider quando disponibile (o una chiave composta documentata, mai un timestamp arbitrario), che gli eventi fuori sequenza non sovrascrivano mai uno stato più recente con uno più vecchio, che il consumatore possa recuperare lo stato corrente dall'API quando l'ordine non è sufficiente e che i tentativi non riusciti del consumatore vengano instradati attraverso una coda o un percorso per messaggi non recapitabili (dead-letter path). Stripe avverte esplicitamente che l'ordine di consegna non è garantito e consiglia di memorizzare gli ID degli eventi elaborati.
Mantenere l'endpoint snello: validare la struttura, verificare la firma, salvare o accodare, confermare la ricezione e restituire 2xx. La riconciliazione e le notifiche appartengono all'elaborazione asincrona. Testare questa logica facendo in modo che l'operazione a valle superi il timeout di consegna; un ricevitore corretto invia comunque il riscontro dopo l'accodamento duraturo.
Periodi contabili aperti e bloccati
Nordlet applica i blocchi di periodo al momento della registrazione (posting) su registrazioni manuali di prima nota, flussi di documenti e importazioni, quindi testare questo controllo in più punti. Creare documenti equivalenti datati in un periodo aperto, in un periodo bloccato, al limite appena prima del blocco, il primo giorno del periodo aperto successivo e con una data di documento valida ma una data di registrazione non valida, qualora l'API separi le due cose.
Per il caso del periodo bloccato, asserire che la richiesta venga rifiutata con l'errore di blocco di periodo documentato (un conflitto 409 in Nordlet) e che non vengano scritte righe di prima nota, che non venga consumato alcun numero di documento, che nessun documento passi allo stato registrato e che non venga attivato alcun webhook di successo. La versione con il periodo aperto dovrebbe avere successo con gli stessi valori finanziari.
Test di concorrenza (Race test). Avviare una registrazione in un periodo aperto, bloccare il periodo a metà della richiesta e confermare che l'operazione non possa aggirare il blocco. La condizione di superamento fondamentale: una registrazione confermata non deve mai finire in un periodo che era stato bloccato prima che la transazione fosse completata.
Auditabilità e riconciliazione
Per ogni modifica riuscita, confermare che l'oggetto di business esista, che la scrittura contabile esista con debiti uguali ai crediti, che il record di audit esista, che l'evento webhook esista o sia recuperabile e che il record dell'operazione punti all'ID oggetto del provider, con i tentativi di ripetizione che fanno riferimento alla stessa operazione logica.
Per ogni modifica rifiutata, confermare che non esista alcun documento parziale, che non sia stato consumato alcun numero a meno che il contratto non lo consenta, che non esista alcuna voce nel mastro, che non esista alcun webhook di successo e che l'errore contenga un ID richiesta per la diagnostica. Le convenzioni di Nordlet descrivono l'auditabilità delle modifiche e le registrazioni bilanciate come garanzie della piattaforma, con il bilanciamento imposto da un trigger di database differito al momento del commit anziché solo dal codice dell'applicazione. Trasformare queste garanzie in query di riconciliazione post-test anziché affidarsi ciecamente alla risposta HTTP.
Matrice di test principale
| Area | Azione di test | Asserzione attesa | Criterio di superamento |
|---|---|---|---|
| Autenticazione | Nessuna chiave, chiave non valida, ambito insufficiente | 401/403 strutturato; nessun effetto collaterale |
Tutti i tentativi rifiutati non creano alcun record contabile |
| Schema e denaro | Decimale non valido, data non valida, campo obbligatorio | Errore di validazione a livello di campo | Non si verificano ripetizioni o scritture parziali |
| Registrazione normale | Creazione ed emissione di una fattura in un periodo aperto | Un documento, una prima nota bilanciata, un record di audit | Lo stato letto corrisponde alle registrazioni contabili |
| Ripetizione con stessa chiave | Ripetizione di una modifica identica, stessa chiave e corpo | Risposta originale ripetuta; nessuna duplicazione | ID oggetto, numero, effetto di prima nota e audit rimangono unici |
| Corpo modificato, stessa chiave | Riutilizzo della chiave con un importo differente | Rifiuto documentato per riutilizzo della chiave | Record originale invariato; nessun nuovo dato scritto |
| Connessione caduta | Conferma (commit), interruzione, ripetizione con stessa chiave | Risposta ripetuta | Esattamente un effetto collaterale finanziario |
| Periodo bloccato | Registrazione di un documento datato in un periodo bloccato | Rifiuto per blocco di periodo | Nessuna prima nota, nessun numero, nessun webhook di successo |
| Firma webhook | Segreto errato, corpo alterato | Codice diverso da 2xx dal ricevitore | Accettati solo corpo grezzo e segreto corretti |
Cosa farei per primo
Se il tempo è limitato, eseguire i test nell'ordine che consente di intercettare i bug più costosi. Iniziare con la ripetizione in caso di connessione caduta, poiché questo singolo scenario produce la maggior parte dei duplicati reali. Passare poi alla coppia di idempotenza con stessa chiave e corpo modificato. Successivamente, i periodi bloccati, poiché una registrazione in un mese chiuso rappresenta un problema di audit che emerge tardi. La verifica della firma e i webhook fuori sequenza seguono subito dopo, mentre l'intera matrice di schema e autorizzazione può essere eseguita continuamente in CI una volta che il client si è stabilizzato.
Tutto il resto in questo piano supporta questi cinque punti. Ottenere il via libera per essi rispetto a un'azienda sandbox, con letture di riconciliazione che confermano gli effetti collaterali, consentirà di sapere che l'integrazione è sicura prima che tocchi anche un solo mastro reale. È possibile creare un'azienda sandbox e una chiave di test con ambito limitato in pochi minuti dalla pagina Come iniziare e verificare i moduli necessari consultando l'elenco delle funzionalità.
FAQ
Una risposta 2xx è sufficiente per confermare che una scrittura contabile è andata a buon fine?
No. Un codice di stato conferma che il server ha risposto, ma non che esistano esattamente un documento, un'assegnazione di numerazione e una registrazione di prima nota bilanciata. Ogni test di modifica dovrebbe far seguire alla risposta una lettura di verifica dell'oggetto, del suo effetto contabile e del relativo record di audit. Il caso pericoloso è la direzione opposta: un'operazione confermata mentre il client non ha mai ricevuto la risposta.
Devo generare una nuova chiave di idempotenza quando una richiesta va in timeout?
No, e questo è l'errore che causa la maggior parte dei duplicati in produzione. La chiave identifica l'operazione di business logica, non il tentativo di rete. Ripetere la stessa chiave, quindi riconciliare leggendo la risorsa. Una libreria di ripetizione che genera un nuovo UUID per ogni tentativo trasforma una fattura prevista in diverse scritture indipendenti.
Cosa succede se riutilizzo una chiave di idempotenza con un payload differente?
Un'API corretta la rifiuta anziché applicare silenziosamente il nuovo corpo. Nordlet restituisce 422 idempotency_key_reuse e lascia il record originale intatto. Il client dovrebbe trattare questo evento come un errore di programmazione da correggere, e non come una condizione da aggirare generando una nuova chiave.
I webhook sostituiscono la lettura di verifica dell'oggetto creato?
No. La consegna di un webhook dimostra la notifica a valle, non che la transazione sia stata confermata nel modo previsto, e l'ordine di consegna non è garantito. Verificare la firma sul corpo grezzo, eseguire la deduplicazione sull'ID di consegna o di evento e recuperare lo stato corrente dall'API ogni volta che l'ordine degli eventi da solo non è sufficiente per determinare cosa sia cambiato.
Come posso testare la registrazione in un periodo contabile bloccato?
Creare documenti equivalenti in un periodo aperto e in uno bloccato, e verificare che il caso bloccato venga rifiutato senza righe di prima nota, senza numero di documento consumato, senza transizione di stato e senza webhook di successo. Eseguire poi la versione di concorrenza: avviare una registrazione in un periodo aperto e bloccare il periodo a metà della richiesta. Una registrazione confermata non deve mai finire in un periodo che era stato bloccato prima che la transazione fosse completata.
Posso eseguire test di duplicazione ad alto volume in un'azienda sandbox?
Sì. Un'azienda sandbox si comporta come una reale, è contrassegnata come dato di test ed viene eliminata immediatamente anziché dopo la finestra di conservazione, il che la rende il luogo ideale per test distruttivi e di duplicazione. L'utilizzo del sandbox viene comunque misurato e fatturato come l'utilizzo reale, quindi è opportuno pianificare il volume anziché procedere con cicli infiniti.