Scalare i dati di test tra i paesi viene di solito tentato aggiungendo più paesi allo stesso generatore. Funziona per un po’ e poi si ferma, perché le differenze tra i paesi non sono variazioni di un unico modello; alcune lo contraddicono.
La via d’uscita è definire ciò che è vero per ogni paese e trattare tutto il resto come un’eccezione esplicita. Questo articolo copre questa divisione, perché una popolazione generata deve essere riproducibile, e come campionare i paesi affinché la popolazione contenga i casi difficili e non solo quelli facili.
Cosa appartiene all’insieme delle invarianti?
Un’invariante è una proprietà che vale per ogni paese dell’insieme senza qualificazioni. Merita quello status perché è vera del modello dati e non di un paese particolare.
I membri tipici sono strutturali: ogni paese ha un identificatore stabile, ogni identificatore mappa su esattamente un paese, ogni paese porta un nome visualizzato e un codice, e nessun campo è richiesto per un paese il cui sistema non lo possiede. Queste affermazioni sono brevi, verificabili e vere ovunque.
Il test per stabilire se qualcosa è davvero invariante consiste nel cercare un controesempio. La maggior parte delle proprietà supera questo test, e le poche che non lo superano sono quelle che altrimenti verrebbero imposte su tutta la popolazione e produrrebbero una serie di guasti che si rivelano colpa del modello invece che dei dati.
Mantieni piccolo l’insieme delle invarianti. Un lungo elenco di invarianti è di solito un elenco di eccezioni mascherato, e diventa impossibile distinguere una vera regressione da un paese normale che si comporta normalmente.
Come appare un elenco di eccezioni?
Un’eccezione è una deviazione denominata e documentata da un’invariante, limitata a paesi specifici e con una motivazione.
| Elemento | Perché serve |
|---|---|
| Il paese o i paesi interessati | Così l’elenco può essere interrogato invece che letto |
| L’invariante da cui devia | Così la deviazione è inequivocabile |
| La motivazione | Così un lettore successivo può giudicare se si applichi ancora |
| Cosa dovrebbe fare invece il generatore | Così la deviazione è eseguibile invece che consultiva |
L’ultima riga è ciò che separa un elenco di eccezioni da un elenco di lamentele. Un’eccezione che dice solo che un paese è insolito non può essere applicata da nulla, quindi il generatore o la ignora o gestisce il paese come caso speciale altrove, e l’elenco deriva fuori passo rispetto al codice.
Dove un’eccezione si applica a un gruppo di paesi, scrivila una volta per la caratteristica condivisa e da essa fai riferimento ai paesi. Raggruppare per caratteristica invece che per elenco di codici mantiene l’affermazione significativa quando un paese viene aggiunto o rimosso dall’insieme.
Perché la generazione deve essere riproducibile?
Perché una popolazione non riproducibile non può essere sottoposta a debug. Quando appare un guasto, la prima domanda è se siano cambiati i dati o il codice, e un generatore che produce una popolazione diversa a ogni esecuzione rimuove la capacità di rispondere.
Riproducibilità significa che un dato input produce un output identico, compreso l’ordine dei record e i valori al loro interno. Ciò richiede un punto di partenza fisso per le scelte casuali e una regola che mantenga stabile la sequenza di scelta quando l’insieme di paesi cresce, così che aggiungere un paese non rimescoli i dati di tutti gli altri.
Il secondo requisito è facile da mancare. Un generatore che attinge valori da un’unica lunga sequenza legata al conteggio totale produrrà una popolazione interamente diversa quando viene aggiunto un paese, il che distrugge la possibilità di confrontare due esecuzioni. Il seeding per paese, o per paese e campo, mantiene stabile ogni voce lasciando la popolazione estendibile.
Come dovrebbero essere campionati i paesi?
Deliberatamente, e non uniformemente. Una popolazione che campiona ogni paese con uguale probabilità spende la maggior parte del suo volume sulla parte centrale della distribuzione e non contiene quasi nessuno dei casi per cui esiste la suite.
Il campionamento stratificato è la forma pratica: dividi l’insieme in gruppi che condividono le caratteristiche che contano, poi attingi da ciascun gruppo invece che dal tutto. I gruppi dovrebbero seguire gli assi lungo i quali il prodotto varia davvero: se un campo esiste, se i dati sono scarni o completi, se un paese è una dipendenza o una voce completamente specificata, se la lingua differisce dall’impostazione abituale.
Poi riempi le celle difficili di proposito invece di sperare di colpirle. Una popolazione che contiene un paese senza sistema di codice postale, un piccolo territorio e un paese il cui nome è cambiato è più utile di una popolazione parecchie volte più grande che non ne contiene nessuno.
| Asse | Cosa esercita il farlo variare |
|---|---|
| Presenza del campo | Percorsi di codice per un campo che non si applica |
| Spessore dei dati | Voci incomplete e stati sconosciuti |
| Tipo di entità | Dipendenze e codici speciali |
| Lingua del nome visualizzato | Ordinamento e normalizzazione |
Campionare lungo tutti gli assi contemporaneamente produce una matrice inutilizzabile, quindi scegli gli assi che contano per la suite in questione e dichiara quali sono stati lasciati fuori. Un’omissione non dichiarata viene letta come copertura.
Per gli sviluppatori: affermare le invarianti, affermare le eccezioni
Due livelli di asserzione mantengono onesta la popolazione. Uno verifica le invarianti su ogni record generato, il che cattura casi speciali accidentali. L’altro verifica che ogni eccezione documentata sia effettivamente prodotta, il che cattura un elenco di eccezioni che si è allontanato dal generatore.
Il secondo livello è quello che la gente salta, ed è quello che rileva il guasto silenzioso in cui un paese smette di essere generato come la documentazione dichiara. Afferma l’eccezione per nome e per forma attesa, così che un cambiamento al generatore debba essere accompagnato da un cambiamento all’elenco.
Alimenta gli stati descritti nella checklist di copertura dei dati dei paesi nelle regole di generazione invece di trattarli come un report, così che un paese il cui campo non si applica produca un record che lo dice invece di un record che sembra incompiuto. Per il livello di codifica sottostante, la guida ai codici ISO di paese e suddivisione è il contesto pertinente, e la directory dei paesi e delle regioni mostra il tipo di popolazione a cui questa generazione dovrebbe somigliare.
L’elenco delle invarianti, l’elenco delle eccezioni e gli assi di campionamento in questo articolo sono struttura illustrativa più che una specifica. Non descrivono alcuna suite di test reale, alcun set di dati reale e alcun insieme di paesi appartenente ad alcuna organizzazione, e dovrebbero essere adattati invece che adottati.
Passi successivi
Scrivi le tue invarianti su una pagina e le tue eccezioni su un’altra, poi verifica quali di esse il generatore attuale rispetti davvero. Una voce invecchiata non è lo stesso problema di una voce che non è mai stata completa, e la guida alla freschezza dei dati dei paesi copre come i due dovrebbero essere trattati diversamente.