Testes Unitarios Com PostgreSQL

Embed Size (px)

DESCRIPTION

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

Text of Testes Unitarios Com PostgreSQL

  • 1. Testes Unitrios com PostgreSQL PGDay-RS 2009

2. Quem sou eu?

  • Diogo Biazus
    • Colaborador 3. Instrutor e Consultor 4. Empresrio 5. [email_address]

6. Como voc gostaria de dar manuteno em suas funes? 7. Como voc se sente dando manuteno em suas funes? 8. TDD

    • um mtodo para se desenvolver como o sujeito da primeira foto. 9. Teste duas vezes, codifique uma. 10. Muito comum em programao OO. 11. Ainda pouco usado em bancos de dados.

12. Problemas de desenvolver sem testes

    • Quando o cdigo est pronto? 13. Qual o comportamento esperado? 14. Se eu modificar o cdigo, como garanto a ausncia de regresses?

15. Programador sem testes: 16. Ok, estou convencido. Como comeo?

    • Antes de programar qualquer rotina pense:
    • Qual a funcionalidade que ela deve implementar?
    • Quais sero os parmetros?
    • Qual ser a sada?

17. Parece complicado?

    • Fazer testes nos obriga a pensar um pouco mais antes de programar. 18. Rotinas fceis de testar geralmente tem interfaces mais simples. 19. Tudo isso colabora para que tenhamos rotinas coesas.

20. Passo a passo... 21. Passo 1

    • Preciso de uma rotina que valide o tipo sangineo. 22. O que ela deve fazer?
      • Verificar se um conjunto de caracteres representa um tipo sangineo existente (A, B, AB, O).
    • Quais sero os parmetros?
      • O conjunto de caracteres a ser testado.
    • Qual ser o retorno?
      • Verdadeiro ou Falso - Vulgo boolean

23. 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; 24. Passo 3

    • Executo o teste e verifico a falha.

epic=# SELECT test.test_tipo_sanguineo(); ERROR: function valida_tipo_sanguineo(unknown) does not exist ... 25. Passo 4

    • Crio a funo.

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. Passo 5

    • Executo o teste novamente e verifico se ele passa.

epic=# SELECT test.test_tipo_sanguineo(); test_tipo_sanguineo--------------------- (1 row)

    • Caso no passe retornamos ao passo 4.

27. Legal, mas...

    • Em grande volume rodar os testes manualmente se torna impraticvel. 28. Eu vim para essa palestra esperando ver umas ferramentas descoladas... 29. ... ou pelo menos ganhar algum brinde.

30. Epic comes to the rescue 31. O framework de testes Epic

    • Existem outras opes para o PostgreSQL:
      • pgTAP 32. PGUnit
    • O Epic no entanto o que mais me agrada. 33. Equilibra simplicidade e funcionalidade.

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. Escrevendo testes com o Epic CREATE OR REPLACE FUNCTION test.test_tipo_sanguineo() RETURNS void AS $$ -- module: validacoesBEGIN 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. Executando testes com o Epic epic=# SELECT * from test.run_all(); name | module | result | errcode | errmsg----------------------------+---------------+--------+----------+-------- test_tipo_sanguineo | validacoes | [OK] | |(1 row) 37. Alguns detalhes

    • O comentrio module serve para separarmos os testes em mdulos, ele obrigatrio. 38. As funes de teste devem estar no schema test e devem comear o seu nome com test_ 39. Para executar apenas um mdulo podemos usar:

epic=# SELECT * from test.run_module('validacoes'); 40. Para mais informaes http://www.epictest.org/ [email_address]