Testes Unitarios Com PostgreSQL
-
Upload
diogo-biazus -
Category
Technology
-
view
1.143 -
download
2
description
Transcript of Testes Unitarios Com PostgreSQL
Testes Unitários com PostgreSQLPGDay-RS 2009
Quem sou eu?
Diogo BiazusColaboradorInstrutor e ConsultorEmpresá[email protected]
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. epic=# SELECT test.test_tipo_sanguineo(); test_tipo_sanguineo --------------------- (1 row)
Caso não passe retornamos ao passo 4.
Legal, mas...
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:pgTAPPGUnitO 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 protected]