Testes Unitários com PostgreSQL PGDay-RS 2009
Quem sou eu? <ul><li>Diogo Biazus </li><ul><li>Colaborador
Instrutor e Consultor
Empresário
[email_address] </li></ul></ul>
Como você gostaria de dar manutenção em suas funções?
Como você se sente dando manutenção em suas funções?
TDD <ul><ul><li>É 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. </li></ul></ul>
Problemas de desenvolver sem testes <ul><ul><li>Quando o código está pronto?
Qual o comportamento esperado?
Se eu modificar o código, como garanto a ausência de regressões?  </li></ul></ul>
Programador sem testes:
Ok, estou convencido. Como começo? <ul><ul><li>Antes de programar qualquer rotina pense: </li></ul></ul>  <ul><ul><li>Qual...
Parece complicado? <ul><ul><li>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. </li></ul></ul>
Passo a passo...
Passo 1 <ul><ul><li>Preciso de uma rotina que valide o tipo sangüineo.
O que ela deve fazer? </li></ul></ul><ul><ul><ul><li>Verificar se um conjunto de caracteres representa um tipo sangüineo e...
Passo 2 <ul><ul><li>Crio o teste. </li></ul></ul>  CREATE OR REPLACE FUNCTION test.test_tipo_sanguineo() RETURNS void AS $...
Upcoming SlideShare
Loading in …5
×

Testes Unitarios Com PostgreSQL

1,382 views

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,382
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Testes Unitarios Com PostgreSQL

  1. 1. Testes Unitários com PostgreSQL PGDay-RS 2009
  2. 2. Quem sou eu? <ul><li>Diogo Biazus </li><ul><li>Colaborador
  3. 3. Instrutor e Consultor
  4. 4. Empresário
  5. 5. [email_address] </li></ul></ul>
  6. 6. Como você gostaria de dar manutenção em suas funções?
  7. 7. Como você se sente dando manutenção em suas funções?
  8. 8. TDD <ul><ul><li>É um método para se desenvolver como o sujeito da primeira foto.
  9. 9. Teste duas vezes, codifique uma.
  10. 10. Muito comum em programação OO.
  11. 11. Ainda pouco usado em bancos de dados. </li></ul></ul>
  12. 12. Problemas de desenvolver sem testes <ul><ul><li>Quando o código está pronto?
  13. 13. Qual o comportamento esperado?
  14. 14. Se eu modificar o código, como garanto a ausência de regressões? </li></ul></ul>
  15. 15. Programador sem testes:
  16. 16. Ok, estou convencido. Como começo? <ul><ul><li>Antes de programar qualquer rotina pense: </li></ul></ul>  <ul><ul><li>Qual a funcionalidade que ela deve implementar?  </li></ul></ul>  <ul><ul><li>Quais serão os parâmetros? </li></ul></ul>  <ul><ul><li>Qual será a saída? </li></ul></ul>
  17. 17. Parece complicado? <ul><ul><li>Fazer testes nos obriga a pensar um pouco mais antes de programar.
  18. 18. Rotinas fáceis de testar geralmente tem interfaces mais simples.
  19. 19. Tudo isso colabora para que tenhamos rotinas coesas. </li></ul></ul>
  20. 20. Passo a passo...
  21. 21. Passo 1 <ul><ul><li>Preciso de uma rotina que valide o tipo sangüineo.
  22. 22. O que ela deve fazer? </li></ul></ul><ul><ul><ul><li>Verificar se um conjunto de caracteres representa um tipo sangüineo existente (A, B, AB, O). </li></ul></ul></ul><ul><ul><li>Quais serão os parâmetros? </li></ul></ul><ul><ul><ul><li>O conjunto de caracteres a ser testado. </li></ul></ul></ul><ul><ul><li>Qual será o retorno? </li></ul></ul><ul><ul><ul><li>Verdadeiro ou Falso - Vulgo boolean </li></ul></ul></ul>
  23. 23. Passo 2 <ul><ul><li>Crio o teste. </li></ul></ul>  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;
  24. 24. Passo 3 <ul><ul><li>Executo o teste e verifico a falha. </li></ul></ul>  epic=# SELECT test.test_tipo_sanguineo(); ERROR:  function valida_tipo_sanguineo(unknown) does not exist ...
  25. 25. Passo 4 <ul><ul><li>Crio a função. </li></ul></ul>  CREATE OR REPLACE FUNCTION valida_tipo_sanguineo(ptipo varchar) RETURNS boolean AS $$ BEGIN     RETURN lower(ptipo) IN ('a', 'b', 'ab', 'o'); END; $$ LANGUAGE plpgsql;
  26. 26. Passo 5 <ul><ul><li>Executo o teste novamente e verifico se ele passa. </li></ul></ul>  epic=# SELECT test.test_tipo_sanguineo();  test_tipo_sanguineo ---------------------    (1 row) <ul><ul><li>Caso não passe retornamos ao passo 4. </li></ul></ul>
  27. 27. Legal, mas... <ul><ul><li>Em grande volume rodar os testes manualmente se torna impraticável.
  28. 28. Eu vim para essa palestra esperando ver umas ferramentas descoladas...
  29. 29.   ... ou pelo menos ganhar algum brinde. </li></ul></ul>
  30. 30. Epic comes to the rescue
  31. 31. O framework de testes Epic <ul><ul><li>Existem outras opções para o PostgreSQL: </li></ul></ul><ul><ul><ul><li>pgTAP
  32. 32. PGUnit </li></ul></ul></ul><ul><ul><li>O Epic no entanto é o que mais me agrada.
  33. 33. Equilibra simplicidade e funcionalidade. </li></ul></ul>
  34. 34. 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.  
  35. 35. 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;
  36. 36. Executando testes com o Epic epic=# SELECT * from test.run_all();             name             |    module   | result | errcode | errmsg ----------------------------+---------------+--------+----------+--------  test_tipo_sanguineo | validacoes | [OK]   |             | (1 row)
  37. 37. Alguns detalhes <ul><ul><li>O comentário module serve para separarmos os testes em módulos, ele é obrigatório.
  38. 38. As funções de teste devem estar no schema test e devem começar o seu nome com test_
  39. 39. Para executar apenas um módulo podemos usar: </li></ul></ul>    epic=# SELECT * from test.run_module('validacoes');
  40. 40. Para mais informações http://www.epictest.org/ [email_address]

×