segunda-feira, 4 de julho de 2016

DbUnit

Como prometido no post anterior, hoje vou testar e falar sobre o DbUnit. Para quem não está familiarizado, o DbUnit é uma extensão para o JUnit para Teste de Unidade para aplicações com banco de dados.

Através do DbUnit é possível definir e verificar o estado do banco de dados em um dado instante durante o teste. É possível inserir dados e ler dados do banco através de arquivos simples XML.

Imagine que você precise testar interações em seu código que geram dados que são armazenados, alterados ou excluídos do banco de dados. É possível verificar sua aplicação através do DBUnit da mesma maneira que se faz um teste para a aplicação em si. Por exemplo, imagine que sua aplicação é um sistema de compra e venda, você quer testar esse sistema, sua loja começa com certos produtos que podem ser inseridos no banco através do XML simples e também verificadas. Após cada compra, sua loja deve remover o produto e alterar a informação sobres compras realizadas. Todas essas situações podem ser verificadas com o DbUnit.

Para fazer um teste simples, eu segui o tutorial do seguinte site: Marc Philipp. Neste caso temos apenas uma tabela de pessoas com idade, nome e último nome. Essas pessoas podem ser adicionadas e também podem ser buscadas. Para realizar esse tutorial eu usei:
  • Netbeans
  • Projeto Maven Aplicação Java
  • JUnit 4.12
  • Hamcrest 1.3
  • DbUnit 2.5
  • O banco de dados H2
  • Spring Data
  • Hibernate Core e EntityManager
Começamos criando o POJO Person que define a entidade pessoa:

Criamos depois o repositório. Eu escolhi usar o JpaRepository que cuidada de cada detalhe do acesso aos dados no banco:

Além disso precisamos definir o DataSource e uma EntityManager. Esses são criados através de uma classe de configuração do Spring que define beans para o DataSource e o EntityManager:

Finalmente vamos trabalhar em nossos testes. Queremos conectar com e modificar o banco de dados. Fazemos isso através do repository obtido do contexto gerado pela configuração descrita anteriormente. Vamos inserir no banco os seguintes dados:

Essa é a primeira facilidade que verificamos no DbUnit, poder inserir dados através de um XML muito simples. Depois de inseridos esses dados, vamos testar se foram inseridos corretamente e o que acontece caso se pesquise um nome não inserido:

Podemos observar na linha 42 a leitura do arquivo XML e na linha 49 a inserção dos dados no banco. Já nas linhas 53 e 62 temos os testes de busca pelo objeto que possui o nome Charlie e busca por um objeto inexistente no banco.

É evidente a infinidade de coisas interessante que se pode fazer com essa ferramenta, espero ter ajudado. O projeto completo pode ser clonado através do Git do seguinte repositório: https://leandro_stlima@bitbucket.org/leandro_stlima/dbunit.git.

No próximo post falarei sobre o Mockito, frameworking para Mocking ou maquete, emulação, de objetos em Testes de Unidade.

segunda-feira, 27 de junho de 2016

Concordion

Tenho tentado melhorar minha prática como programador Java e partido para conhecer melhor o mundo da programação através de automação de testes. Tipicamente a primeira coisa que se vê pela frente, até pelas facilidades das IDE, é o JUnit. Mas existe um mundo de opções de teste para códigos Java e um me chamou muito a atenção, o Concordion.

Concordion é uma ferramenta que usa uma abordagem por exemplos de comportamento (examples of behavior). O mais interessante é que escrevendo a especificação em alto nível e inserindo exemplos que englobam o comportamento esperado do código em todas as suas possibilidades ou nas possibilidades permitidas/esperadas, já está se escrevendo o teste para o sistema. Isso é possível escrevendo a especificação com o script Markdown ou com HTML.

Por exemplo, imagine a seguinte especificação:

Quebrador de Nomes

Para tornar os emails para clientes algo mais personalizado, deseja-se saber o primeiro nome e o último nome do cliente. No entanto, ao se cadastrar, o cliente informa o nome inteiro apenas. 

O sistema, portanto, deve quebrar o nome em suas partes.

Exemplo

O nome Jane Smith deve ser quebrado no primeiro nome Jane e o último nome Smith.

Exemplo

O nome completo Sting deve ser quebrado apenas no primeiro nome Sting.

Exemplo

O nome completo Sir Bob Geldof deve ser quebrado em seu primeiro nome Bob e o último Geldof.

Exemplo

O nome Maria de los Santos deve ser quebrado em Maria e, como último nome, de los Santos.
O legal dessa especificação é que está bastante claro para o cliente e para o desenvolvedor, não deixando brechas para desentendimentos.

Por trás dessa especificação está um Markdown simples de escrever:



Através dos links no script, o código de teste:
cria o HTML e insere os resultados. No HTML gerado é possível ver se todos os testes foram executados, se houve erros e quando há, verificar o stack.

Para se divertir, esse é meu código para separador de nomes:
O projeto também pode ser baixado com o Git no seguinte repositório: https://leandro_stlima@bitbucket.org/leandro_stlima/concordion.git
No próximo post eu vou falar sobre as ferramentas de testes para banco de dados.