testes unitarios com postgresql

23
Testes Unitários com PostgreSQL PGDay-RS 2009

Upload: diogo-biazus

Post on 03-Jul-2015

1.143 views

Category:

Technology


2 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Testes Unitarios Com PostgreSQL

Testes Unitários com PostgreSQLPGDay-RS 2009

Page 2: Testes Unitarios Com PostgreSQL

Quem sou eu?

Diogo BiazusColaboradorInstrutor e ConsultorEmpresá[email protected]

Page 3: Testes Unitarios Com PostgreSQL

Como você gostaria de dar manutenção em suas funções?

Page 4: Testes Unitarios Com PostgreSQL

Como você se sente dando manutenção em suas funções?

Page 5: Testes Unitarios Com PostgreSQL

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.

Page 6: Testes Unitarios Com PostgreSQL

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?

Page 7: Testes Unitarios Com PostgreSQL

Programador sem testes:

Page 8: Testes Unitarios Com PostgreSQL

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?

Page 9: Testes Unitarios Com PostgreSQL

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.

Page 10: Testes Unitarios Com PostgreSQL

Passo a passo...

Page 11: Testes Unitarios Com PostgreSQL

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

Page 12: Testes Unitarios Com PostgreSQL

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;

Page 13: Testes Unitarios Com PostgreSQL

Passo 3

Executo o teste e verifico a falha. epic=# SELECT test.test_tipo_sanguineo();ERROR: function valida_tipo_sanguineo(unknown) does not exist ...

Page 14: Testes Unitarios Com PostgreSQL

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;

Page 15: Testes Unitarios Com PostgreSQL

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.

Page 16: Testes Unitarios Com PostgreSQL

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.

Page 17: Testes Unitarios Com PostgreSQL

Epic comes to the rescue

Page 18: Testes Unitarios Com PostgreSQL

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.

Page 19: Testes Unitarios Com PostgreSQL

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.

Page 20: Testes Unitarios Com PostgreSQL

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;

Page 21: Testes Unitarios Com PostgreSQL

Executando testes com o Epic

epic=# SELECT * from test.run_all(); name | module | result | errcode | errmsg ----------------------------+---------------+--------+----------+-------- test_tipo_sanguineo | validacoes | [OK] | | (1 row)

Page 22: Testes Unitarios Com PostgreSQL

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');

Page 23: Testes Unitarios Com PostgreSQL

Para mais informações

http://www.epictest.org/[email protected]