testes unitarios com postgresql
DESCRIPTION
Testes unitários em PostgreSQL usando Epic (http://www.epictest.org/)TRANSCRIPT
![Page 1: Testes Unitarios Com PostgreSQL](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/1.jpg)
Testes Unitários com PostgreSQLPGDay-RS 2009
![Page 3: Testes Unitarios Com PostgreSQL](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/3.jpg)
Como você gostaria de dar manutenção em suas funções?
![Page 4: Testes Unitarios Com PostgreSQL](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/4.jpg)
Como você se sente dando manutenção em suas funções?
![Page 5: Testes Unitarios Com PostgreSQL](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/7.jpg)
Programador sem testes:
![Page 8: Testes Unitarios Com PostgreSQL](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/10.jpg)
Passo a passo...
![Page 11: Testes Unitarios Com PostgreSQL](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/17.jpg)
Epic comes to the rescue
![Page 18: Testes Unitarios Com PostgreSQL](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/20.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/21.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022042504/559582201a28ab1d548b461a/html5/thumbnails/22.jpg)
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');