Testes Unitarios Com PostgreSQL - Presentation Transcript
Testes Unitários com PostgreSQL PGDay-RS 2009
Quem sou eu?
Diogo Biazus
Colaborador
Instrutor e Consultor
Empresário
[email_address]
Como você gostaria de dar manutenção em suas funções?
Como você se sente dando manutenção em suas funções?
TDD
É um método para se desenvolver como o sujeito da primeira foto.
Teste duas vezes, codifique uma.
Muito comum em programação OO.
Ainda pouco usado em bancos de dados.
Problemas de desenvolver sem testes
Quando o código está pronto?
Qual o comportamento esperado?
Se eu modificar o código, como garanto a ausência de regressões?
Programador sem testes:
Ok, estou convencido. Como começo?
Antes de programar qualquer rotina pense:
Qual a funcionalidade que ela deve implementar?
Quais serão os parâmetros?
Qual será a saída?
Parece complicado?
Fazer testes nos obriga a pensar um pouco mais antes de programar.
Rotinas fáceis de testar geralmente tem interfaces mais simples.
Tudo isso colabora para que tenhamos rotinas coesas.
Passo a passo...
Passo 1
Preciso de uma rotina que valide o tipo sangüineo.
O que ela deve fazer?
Verificar se um conjunto de caracteres representa um tipo sangüineo existente (A, B, AB, O).
Quais serão os parâmetros?
O conjunto de caracteres a ser testado.
Qual será o retorno?
Verdadeiro ou Falso - Vulgo boolean
Passo 2
Crio o teste.
CREATE OR REPLACE FUNCTION test.test_tipo_sanguineo() RETURNS void AS $$ BEGIN IF valida_tipo_sanguineo('w') THEN RAISE EXCEPTION 'w nao eh um tipo valido'; END IF; IF NOT valida_tipo_sanguineo('o') THEN RAISE EXCEPTION 'o eh valido'; END IF; END; $$ LANGUAGE plpgsql;
Passo 3
Executo o teste e verifico a falha.
epic=# SELECT test.test_tipo_sanguineo(); ERROR: function valida_tipo_sanguineo(unknown) does not exist ...
Passo 4
Crio a função.
CREATE OR REPLACE FUNCTION valida_tipo_sanguineo(ptipo varchar) RETURNS boolean AS $$ BEGIN RETURN lower(ptipo) IN ('a', 'b', 'ab', 'o'); END; $$ LANGUAGE plpgsql;
Passo 5
Executo o teste novamente e verifico se ele passa.
Em grande volume rodar os testes manualmente se torna impraticável.
Eu vim para essa palestra esperando ver umas ferramentas descoladas...
... ou pelo menos ganhar algum brinde.
Epic comes to the rescue
O framework de testes Epic
Existem outras opções para o PostgreSQL:
pgTAP
PGUnit
O Epic no entanto é o que mais me agrada.
Equilibra simplicidade e funcionalidade.
Instalando o Epic svn co http://svn.epictest.org/trunk/epic epicpsql meu_banco < epic/epic.sqlOBS: meu_banco deve ter a PL/PgSQL instalada.
Escrevendo testes com o Epic CREATE OR REPLACE FUNCTION test.test_tipo_sanguineo() RETURNS void AS $$ -- module: validacoes BEGIN PERFORM test.assert(NOT valida_tipo_sanguineo('w'), 'w nao eh um tipo valido'); PERFORM test.assert(valida_tipo_sanguineo('o'), 'o eh valido'); PERFORM test.pass(); END; $$ LANGUAGE plpgsql;
Executando testes com o Epic epic=# SELECT * from test.run_all(); name | module | result | errcode | errmsg ----------------------------+---------------+--------+----------+-------- test_tipo_sanguineo | validacoes | [OK] | | (1 row)
Alguns detalhes
O comentário module serve para separarmos os testes em módulos, ele é obrigatório.
As funções de teste devem estar no schema test e devem começar o seu nome com test_
Para executar apenas um módulo podemos usar:
epic=# SELECT * from test.run_module('validacoes');
Para mais informações http://www.epictest.org/ [email_address]
0 comments
Post a comment