PgTAP, l'importanza dei test in PostgreSQL - Parte 2

Commenti

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 file risultati_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.


blog comments powered by Disqus