Usare le regular expressions (RegEx) in SQL Server per generare dati di test casuali

Una regular expression (abbreviato regex o regexp talvolta chiamata rational expression) è una sequenza di caratteri che forma uno schema di ricerca, principalmente usato per trovare corrispondenze e nelle funzioni di "trova e sostituisci". Si può anche usare come generatore di dati, seguendo il concetto delle regular expressions inverse e produrre dati di test casuali da usare in database di test.

Usare le regular expressions per creare dati di test realistici

Una delle informazioni più usate è il numero di telefono, e si tratta di un buon caso di dati che possono essere utilizzati per popolare un database. Per il nostro esempio useremo i numeri di telefono degli USA e mostreremo come generarli tramite le regular expressions.

Prima di tutto è necessario comprendere la struttura dei numeri di telefono in formato USA. Essi sono definiti dal North American Numbering Plan (NANP). Il NANP è un sistema di numerazione delle zone (Numbering Plan Areas NPA) basato su numeri di telefono formati da un prefisso a tre cifre, un codice a tre cifre per l’ufficio centrale e un numero di stazione a 4 cifre. Un esempio della sintassi di un numero di telefono è riportato sotto:

### – ###- ####
Prefisso – codice ufficio centrale – numero della stazione

La regola per i numeri di telefono reali è che la prima cifra delle tre del prefisso deve essere compresa fra 2 e 9 e lo stesso vale per il codice dell’ufficio centrale. Le ultime 4 cifre del numero della stazione devono essere comprese fra 0 e 9.

Seguendo questa regola, possiamo creare una regular expression per generare numeri di telefono USA casuali utilizzando gli elementi sintattici usati nella produzione dei dati per le regular expressions riportati nell’elenco sottostante:

Sintassi

Esempio

Dati prodotti

. = Qualsiasi carattere

John

John

\ = Indica che il carattere che segue è interpretato come è, invece di essere considerato un carattere speciale

\.2

.2

() = Gli operatori all’interno delle parentesi sono raggruppati

(Gr34T)

Gr34T

{n} = Genera n istanze dell’oggetto che precede

ab{2}

abb

{n,m} = Genera almeno n istanze ma non più di m istanze dell’oggetto che precede

Rd2{2,5}

Rd22 o Rd2222 (per esempio)

{n,} = Genera n o più istanze dell’oggetto che precede

T{3,}

TTT o TTTT o TTTTT (per esempio)

* = Genera zero o più istanze dell’oggetto che precede

Rom3*

Rom o Rom33 o Rom333 (per esempio)

+ = Genera una o più istanze dell’oggetto che precede

Tun4+

Tun4 o Tun444 (per esempio)

? = Genera zero o più istanze dell’oggetto che precede

Op3n?

Op3 o Op3n

| = Genera un oggetto per ciascun lato del carattere | character

True|False

True o False

[] = Genera qualsiasi carattere all’interno delle parentesi quadre

[tRu3]

t o R o u o 3

[a-z] = Genera qualsiasi carattere nell’intervallo di caratteri specificato

[0-9A-Z]

U o 5 or Z (per esempio)

[^abc] = Genera qualsiasi carattere esclusi quelli all’interno delle parentesi quadre

[^0aT]

Y o 5 o + (ma non 0, a o T) (per esempio)

Poiché la prima cifra del prefisso a tre cifre deve essere compresa tra 2 e 9, il seguente elemento sintattico [2-9] è usato per generare un numero casuale nell’intervallo 2-9.

Le successive due cifre del prefisso vengono generate usando i seguenti elementi sintattici [0-9]{2}, dove [0-9] definisce la gamma di valori 0-9 dal quale i numeri casuali verranno generati e {2} dice al generatore di prendere due numeri casuali dall’intervallo precedente. Così la regular expression per creare il prefisso a tre cifre avrà il seguente aspetto [2-9][0-9]{2} e fornirà risultati casuali come 254, 634, 893, ecc.

Per dividere visivamente i gruppi di cifre in un numero di telefono, è usato un trattino (-) che non ha alcun significato sintattico, solo visivo

Il codice a tre cifre per l’ufficio centrale segue le stesse regole del prefisso, perciò la regular expression è la stessa del prefisso e viene applicata dopo il trattino. Di conseguenza la regular expression attuale apparirà come [2-9][0-9]{2}[2-9][0-9]{2}, e fornirà i seguenti possibili risultati: 367-245, 743-854, 423-522, etc.

Di nuovo, il trattino è usato per dividere visivamente i gruppi di cifre.

Il numero a quattro cifre della stazione può usare numeri nell’intervallo 0-9. La regular expression per questo numero è composta dagli elementi [0-9] per indicare la gamma di valori da considerare e {4} per indicare quanti sono i numeri dell’intervallo precedente da utilizzare. Questo ci dà la seguente regular espression [0-9]{4}. Esempi di possibili risultati per questa espressione sono: 0245, 4392, 7402, etc.

La completa regular expression per generare numeri di telefono USA realistici si presenta così:

[2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4},

ed i numeri causali generati avranno il seguente aspetto: 254-573-9330, 453-623-0521, 832-571-9562, etc.

Questa regular expression è utilizzata nei seguenti modi per la generazione di dati casuali.

Librerie RegEx per linguaggi di programmazione come generatori di dati

Ci sono un sacco di librerie disponibili in Internet che possono essere impiegate nei linguaggi di programmazione come PHP, Java, C++, le quali consentono la generazione di dati usando le regular expressions. Uno degli esempi potrebbe essere xeger, una libreria Java per la generazione di testo casuale tramite una regular expression. Noi impiegheremo la regular expression : [2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4} in questo esempio. Usando la libreria, si possono generare modelli di corrispondenza per le stringhe come il seguente:

String regex = "[2-9][0-9{2}-[2-9][0-9{2}-[0-9]{4}";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);

Tale codice produce i seguenti dati causali:

239-456-8845
345-542-5392
584-583-2940
879-220-3412
733-430-3290

Creare a Data Generation Plan in Visual Studio 2010 usando il generatore di regular expressions (RegEx)

Un’altra opzione è di sfruttare le funzionalità di Visual Studio 2010 per generare dati di test casuali usando un Data Generation Plan. Un Data Generation Plan permette di selezionare il modo in cui i dati di test saranno generati per specifiche tabelle e colonne. Esso incorpora diversi generatori di dati che producono dati casuali a seconda del tipo di dato della colonna. Le proprietà di questi generatori possono essere cambiate, per definire la gamma ed il formato dei dati di test.

Uno dei generatori a cui siamo interessati è quello delle Regular Expressions che può essere utilizzato nel modo seguente:

Lancia Visual Studio 2010 e carica il progetto di database. Clicca con il pulsante destro del mouse sul nodo del progetto vai sul menu Add e poi New:

Dalla finestra di dialogo Add New Item, scegli il nodo Data Generation Plan dentro al nodo Database Project e seleziona il modello vuoto Data Generation Plan dalla lista. Scrivi il nome del data generation plan nella casella Name e per procedere clicca il bottone Add:

Gli oggetti di tipo schema nel progetto di database sono passati in rassegna e tutte e le tabelle esistenti sono elencate dal Data Generation Plan. Tutte le tabelle sono automaticamente incluse nel piano per la generazione dei dati. Seleziona le tabelle per le quali generare dati ed inserisci il numero di righe da produrre per ciascuna:

Successivamente seleziona la Colonna per la quale il generatore di Regular Expression (RegEx) sarà usato e dal menu a discesa Generator seleziona il generatore di Regular Expression. Dopo che il generatore è stato impostato, si deve inserire la regular expression da usare per la produzione dei dati casuali. Questo si fa nella finestra delle proprietà della colonna selezionata; per accedere click col destro sulla colonna e selezionare Proprietà oppure premere il tasto F4. Nella finestra di dialogo inserire la regular expression desiderata (nell’esempio sottostante è la regular expression illustrata all’inizio dell’articolo [2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4} la quale produrrà numeri di telefono USA casuali):

I dati prodotti avranno il seguente aspetto:

Per avere un’anteprima dei dati di test che saranno generati, click col destro sullo schermo di generazione dei dati e clicca su Preview Data Generation. Questo mostrerà i dati in uno schermo di anteprima.

Se l’anteprima va bene, il passo successivo produrrà i dati reali. Questo si ottiene cliccando il bottone Generate Data nella barra degli strumenti oppure premendo il tasto F5. A questo punto si apre il wizard dove sono specificati i dettagli del database:

Per eseguire il piano di generazione dei dati e produrre dati per le tabelle selezionate, è necessario specificare una connessione al database e poi premere il bottone OK.

Notare che la generazione di dati di test è stata deprecata dopo Visual Studio 2010.

Generare dati di test casuali usando il generatore di Regular Expressions in ApexSQL Generate

ApexSQL Generate è uno strumento per la generazione di dati SQL, che offre la caratteristica di produrre rapidamente dati utilizzando differenti origini, con una varietà di generatori di dati.

Una delle sue caratteristiche è di produrre dati casuali tramite le regular expressions.

Lo scopo è inserire una regular expression la quale sarà usata per popolare le colonne con dei dati di test. Questo può essere fatto nel modo seguente:

  1. Stabilisci un collegamento ad un database attraverso Database connection o Alias connection:

  2. Nella griglia principale, seleziona la tabella per la quale generare dati di test e da Generation options impostare il numero di righe da produrre:

  3. Poi seleziona la colonna da riempire con i dati:

  4. Dall’elenco Generator, seleziona il generatore di Regular expression:

  5. Inserisci la regular expression nel riquadro e dopo averlo fatto, puoi vedere nel pannello di anteprima come saranno i dati. Poiché la regular expression è inserita nel riquadro, il pannello di anteprima produrrà automaticamente l’anteprima delle prime 100 righe di dati, basate sull’input corrente. Nell’esempio sottostante, abbiamo usato la regular expression illustrata all’inizio dell’articolo [2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4} la quale produrrà numeri di telefono USA casuali:

L’opzione Unique garantisce che vengano generati valori univoci.

La cosa importante da notare è che il set di dati generato è definito da un valore di Seed. Per ogni valore di Seed, c’è esattamente un set di possibili dati da generare. Per esempio, quando la regular expression dell’inizio dell’articolo è utilizzata ed il valore di Seed è 0 le prime righe di dati prodotte saranno:

Se il valore di Seed fosse diciamo 53, il set risultante sarebbe:

I set di dati generati possono essere replicati usando la stessa regular expression e lo stesso valore di Seed. Questo si può fare quando 2 o più colonne devono essere riempite con gli stessi dati e nello stesso esatto ordine.

Maggiori informazioni sul valore di Seed si possono trovare nell’articolo della KB “Seed feature in ApexSQL Generate”.

Dopo che tutte le opzioni sono impostate, il processo di generazione dei dati si può eseguire tramite il bottone Generate nella finestra principale.

July 25, 2017