TAP (Test Anything Protocol) è una semplice interfaccia per i test basata su file di testo. TAP nasce col Perl, ma ad oggi ha implementazioni per i più famosi linguaggi di programmazione. PgTAP è l'implementazione di TAP in PostgreSQL.
Non mi dilungherò a descrivere il motivo per cui i test sono importanti, specialmente nell'ottica dello sviluppo agile, che 2ndQuadrant adotta con successo.
PgTAP, sfruttando una sintassi estremamente semplice, permette di testare a fondo il proprio database.
Presupponendo che PgTAP sia stato installato correttamente in un database chiamato pgtap_db, procediamo con la creazione di alcuni oggetti sui quali eseguiremo dei test.
Per informazioni circa l'installazione di PgTAP in un determinato database, rimando alla documentazione ufficiale.
$ psql -c "CREATE TABLE foo AS SELECT generate_series(1,5) AS x" pgtap_db
SELECT 1
$ psql -c "CREATE SCHEMA nuovo_schema" pgtap_db
CREATE SCHEMA
$ psql -c "CREATE FUNCTION say_hello() RETURNS TEXT LANGUAGE SQL AS $$SELECT 'Hello World'::TEXT$$;" pgtap_db
CREATE FUNCTION
Tipi di utilizzo
PgTAP può essere utilizzato per testare qualsiasi aspetto del database. In particolare:
- Presenza di oggetti nel database
- Controllo dell'esecuzione di query
- Controllo dei risultati di una query
- Altro
Descriverò in ordine questi aspetti e poi vedremo un esempio pratico.
Presenza di oggetti nel database
Si può controllare l'esistenza di qualsiasi tipo di oggetto nel database. Questo tipo di funzioni ha più o meno la stessa firma, in particolare:
*tipo_di_oggetto*_are( [schema,] [,description] )
Dove:
tipo_di_oggettoè la categoria di oggetti di cui vogliamo testare la presenza, ad esempio tabelle (tables), funzioni (functions), schemi (schemas) ecc.schemadefinisce lo schema in cui gli oggetti devono trovarsi, questo parametro ha senso solo se non si sta testando la presenza dello schema stesso.array_di_nomiè un array contenente i nomi degli oggetti che devono essere presenti perchè il test abbia successo
Importante: Per avere successo, tutti gli elementi specificati nell'array devono essere presenti. In caso di assenza di almeno uno degli elementi, il test fallirà.
descriptionè una descrizione del test
Nota:
Ovviamente, nel caso di schemas_are, il primo parametro, schema, viene omesso.
Controllo dell'esecuzione di query
È possibile testare in modo semplice che una query venga eseguita senza o con errori. Per farlo sono disponibili le funzioni:
throws_ok( query [, errcode] [, errmsg] [, description] )
lives_ok( query [, description] )
performs_ok( query, milliseconds [, description])
Queste tre funzioni controllano rispettivamente:
Che la query generi un'eccezione. È possibile specificare l'errore voluto tramite il parametro
errcodeChe la query non generi un'eccezione
Che la query termini entro
millisecondsmillisecondi
Controllo dei risultati di una query
Spesso si ha bisgno di controllare che una query restituisca esattamente un certo insieme di risultati. PgTAP ha diverse funzioni per questo scopo, la principale è:
results_eq( sql, array [, description] )
Molto intuitivamente, questo test passerà se l'insieme di risultati della query sarà esattamente uguale ai valori presenti in array.
Nell'esempio completo presente più in basso, vedremo come sfruttare questa funzione.
Altro
Vi sono poi altri tipi di test, ma citiamo qui solo i più importanti. Per una lista completa invitiamo a consultare la documentazione ufficiale.
- Per controllare qualsiasi elemento usando un'espressione regolare:
matches( anyelement, regex [, description] )
- Per controllare che un utente sia un superutente:
is_superuser( user [, description] )
- Per controllare che una funzione sia scritta in un determinato linguaggio:
function_lang_is( [schema,] function [, args[]] , language [, description])
- Per stampare messaggi di diagnostica che non interferiscano con i test:
diag( text )
Nel prossimo articolo vedremo un esempio pratico, dove eseguiremo dei test su un set di oggetti creati per l'occasione.
A presto!


