Friday, April 27, 2007

DBUnit – Integrando Junit e Banco de dados

Pessoal, o texto abaixo eu retirei de uma apresentação que realizei sobre o DBUnit, esta com cara de texto de apresentação !! :)



Sobre DBunit:

DbUnit é uma extensão do Junit

Destinado a projetos que utilizam banco de dados

Deixa sua Base em um estado conhecido entre a execução dos testes unitários

È uma solução para os problema que podem ocorrer quando casos de teste corrompem a Base, causando falhas nos testes subsequentes

Tem habilidade de exportar e importar os dados da Base em XML


The Problem is ...
Você tem uma Banco de dados SQL
Algumas stored procedures, ou não : )
Camada de código situada entre sua aplicação e o Banco de dados.

The Question is ...
Como ter certeza que seus testes unitários estão lendo e escrevendo dados corretamente.

Alguns pontos
Um bom conjunto de teste é aquele que é auto-suficiente e cria todo os dados necessários ( o que fazemos hoje ! )
Os testes podem ser simplificados se você conhecer o estado da Base antes de executar os testes
Deletar e Inserir dados em todos os testes gasta muito tempo. Concordam ???


Provável solução
Preciso mais de um Banco de dados:
Banco de dados do desenvolvedor
Banco de dados dos testes unitários
Banco de dados dos testes de integração

Provável problema
Com múltiplos bancos, você precisa garantir o sincronismo da estrutura
Caso altere uma tabela, terá que replicar a alteração nas outras bases


Solução DBunit
Solução elegante para controlar a dependência entre o banco e sua aplicação

Permite desenvolvedores gerenciar o estado do banco sobre os testes

O banco pode ser populado com dados antes dos testes unitário serem executados

O banco pode retorna para o estado pre – teste unitário

Instalação
Download do framework no site
http://dbunit.sourceforge.net
Importa o .jar para sua IDE


DataSet
Os testes unitário precisam de dados no banco para trabalharem
Você precisa de um dataset (Coleção de dados)
Criar manualmente um xml dataset
Exportar dados existentes do Banco


DatabaseTestCase
Criar um classe que extenda DatabaseTestCase
Criar metodos:
getConnection()
getDataSet()



setUp() and tearDown()

Momento para garantir um estado no banco
Pré teste
Pós teste


protected void setUp() throws Exception {
DatabaseOperation.REFRESH.execute(getConnection(), getDataSet());
}

protected void tearDown() throws Exception {
DatabaseOperation.REFRESH.execute(getConnection(), getDataSet());
}


Database Operation

Operação Decrição
DatabaseOperation.UPDATE Atualiza o banco com o conteúdo do dataset. Assume que os dados a serem atualizados existam no banco, caso contrário ocorrerá erro.
DatabaseOperation.INSERT Insere no banco o conteúdo do dataset. Assume que os dados a serem insereridos não existam no banco, caso contrário ocorrerá erro.
DatabaseOperation.DELETE Deleta do banco somente o conteúdo do dataset.
DatabaseOperation.DELETE_ALL Deleta do banco todo conteúdo
DatabaseOperation.TRUNCATE Truncate tables present in the specified dataset. If the dataset does not contains a particular table, but that table exists in the database, the database table is not affected. Table are truncated in reverse sequence.
DatabaseOperation.REFRESH Atualiza ou insere no banco o conteúdo do dataset. Caso o dado foi modificado ele faz um update, caso o dado não exista ele faz um insert.
DatabaseOperation.CLEAN_INSERT Faz um DELETE_ALL e depois um INSERT.
DatabaseOperation.NONE Não faz absolutamente nada



Conclusão

DbUnti possui habilidade para gerência o estado do banco sobre o ciclo de vida do teste unitário
Permite abstrair o estado do banco, assim tornando rápido e fácil a criação de testes unitários

1 comment:

Ramon Talles said...

Muito boa a explicação sobre o DBUnit. me tirou de um sufoco grande aqui valeu!!