In questo articolo vedremo un esempio completo di test eseguiti su un semplice set di dati.
Ci sono diversi modi di eseguire i test con PgTAP.
È possibile usare pg_prove, uno script installabile attraverso il CPAN, oppure si può scrivere una funzione plpgsql
che esegua i test.
In questo esempio, useremo una funzione.
Creiamo un file che contenga i test, chiamamolo risultati_test.sql.
Scriviamo la funzione che lancia i test direttamente nel file, con il nostro editr preferito.
CREATE OR REPLACE FUNCTION risultati_test()
RETURNS SETOF TEXT
AS $$
BEGIN
-- Controlliamo la presenza degli oggetti:
-- Tabella foo
RETURN NEXT tables_are(
'public',
ARRAY[ 'foo' ]
);
-- Schema nuovo_schema
RETURN NEXT schemas_are(
ARRAY['public','nuovo_schema']
);
-- Controlla che sia presente la funzione say_hello
RETURN NEXT can(
ARRAY['say_hello']
);
-- Controlla che la funzione say_hello sia scritta in SQL
RETURN NEXT function_lang_is(
'say_hello',
'sql'
);
-- Controlla che la funzione say_hello non generi errori
RETURN NEXT lives_ok(
'SELECT say_hello()'
);
-- Controlla che la tabella foo contenga esattamente certi valori
-- provate a cambiare uno dei valori ed osservare come si comporta il test
RETURN NEXT results_eq(
'SELECT * FROM foo',
'VALUES (1),(2),(3),(4),(5)'
);
END;
$$ LANGUAGE plpgsql;
Adesso creiamo il file che esegue questa funzione, chiamiamolo test.sql
BEGIN;
\i risultati_test.sql
SELECT PLAN(6); -- Necessario!
SELECT risultati_test();
ROLLBACK;
La prima riga dà inizio ad una transazione. È consigliato inserire i test in una transazione che esegua un rollback prima di terminare, così da essere sicuri che lo stato del databse venga mantenuto intatto.
Successivamente, tramite il comando di psql
\i, importiamo il filerisultati_test.sql, che crea la funzione che lancia i test.La riga successiva,
SELECT PLAN(6);, serve a specificare il numero di test che intendiamo eseguire (6 in questo caso). È necessaria e controlla che l'esecuzione di un numero di test diverso rispetto a quello specificato, restituisca un fallimento.La riga
SELECT risultati_test();lancia la funzione che esegue i test.
Abbiamo finito di scrivere i nostri test, possiamo eseguirli con:
psql -f test.sql pgtap_db
Il risultato dovrebbe essere:
BEGIN
CREATE FUNCTION
plan
------
1..6
(1 row)
testfunction
------------------------------------------------------
ok 1 - Schema public should have the correct tables
ok 2 - There should be the correct schemas
ok 3 - Schema pg_temp_2 or pg_catalog or public can
ok 4 - Function say_hello() should be written in sql
ok 5
ok 6
(6 rows)
ROLLBACK
Si spiega da solo, no? :)
In effetti, lo scopo del protocollo TAP è di essere il più comprensibile possibile.
Una serie di ok (in caso di successo) e di not ok (in caso di fallimento) rendono estremamente
facile l'interpretazione dei test.
2ndQuadrant Italia utilizza estensivamente PgTAP, il tempo speso a scrivere i test risulta di vitale importanza per la manutenzione dei nostri progetti.


