testes unitarios com postgresql

Post on 03-Jul-2015

1.143 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Testes unitários em PostgreSQL usando Epic (http://www.epictest.org/)

TRANSCRIPT

Testes Unitários com PostgreSQLPGDay-RS 2009

Quem sou eu?

Diogo BiazusColaboradorInstrutor e ConsultorEmpresáriodiogob@gmail.com

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/diogob@gmail.com

top related