Data

16 jan, 2014

Automatizando seus testes com DBUnit + MySQL

Publicidade

Olá, pessoal!

No artigo de hoje vamos ver como rodar unit tests usando o DBUnit com MySql. O DBUnit é uma API para fazermos testes unitários usando um banco de dados. Para rodar os testes automatizados é muito simples: precisamos apenas escolher o banco que vamos rodar e de um (ou mais) arquivos .xml, que vai representar os dados a serem testados.

Para começar, crie um projeto Java.

  • Primeiro passo é criar o arquivo hibernate.cfg.xml com as configurações do banco, onde os testes serão executados:
<hibernate-configuration>
 <session-factory >
  <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
  <property name="hibernate.connection.password">camilo</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost/test</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
  <property name="hibernate.show_sql">true</property>
 </session-factory>
</hibernate-configuration>
  • Criar uma classe que obtém a SessionFactory com  base nas informações do arquivo hibernate.cfg.xml:
public class HibernateUtil {
	private static SessionFactory sessionFactory; 

	public static SessionFactory getSessionFactory() {
		sessionFactory =  new Configuration().configure().buildSessionFactory();
		return sessionFactory;
	}
	
}
  • Criaremos um arquivo .xml que representa a tabela do banco, conforme abaixo:
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<login id="1" login="camilo" senha="124"/>
<login id="2" login="neto" senha="234"/>
</dataset>
  • Agora vamos criar a nossa classe de Teste. Para questão apenas de explicação, subscrevi alguns métodos da classe do DBunit para explicar como as coisas funcionam, porém em outros é necessário implementarmos para que o DBunit saiba onde ele terá que conectar e pegar os dados:
public class DBunitTest extends DatabaseTestCase{
	private Session session;
	private IDatabaseConnection conn;
	private IDataSet dataSet;
	private FileInputStream loadFile;
	
	public DBunitTest() {
		try {
			session = HibernateUtil.getSessionFactory().openSession();			
		} catch (Exception e) {
		e.getMessage();
		}
	}
	
	@Before
	public void setUp() throws Exception {	
//		a cada execução dos testes ele limpa e insere
		getSetUpOperation();	
	}

//	limpa tudo que tem nas tabelas e faz um insert 
	@Override
	protected DatabaseOperation getSetUpOperation() throws Exception {
		return DatabaseOperation.CLEAN_INSERT;
	}

/* aqui que tá o pulo do gato
 * (non-Javadoc)
 * @see org.dbunit.DatabaseTestCase#getConnection()
 * fornecemos a forma de conexão ao banco, estou usando o Hibernate
 * não usar o método session.getConnection() ele está deprecated e vai sumir na versão 4.0
 */
	@Override
	protected IDatabaseConnection getConnection() throws Exception {
		conn = new DatabaseConnection(new Configuration().configure().buildSettings().getConnectionProvider().getConnection());
		return conn;
	}
/* 
 * (non-Javadoc)
 * @see org.dbunit.DatabaseTestCase#getDataSet()
 * 
 * fazer o load dos dados que serão testados
 */
	@Override
	protected IDataSet getDataSet() throws Exception {
		loadFile = new FileInputStream("src/datalogin.xml");
		dataSet =  new  FlatXmlDataSet(loadFile);
		return dataSet;
	}
}

Para facilitar o entendimento, a explicação está nos comentários in line, assim você lê, olha e aprende direto no código.

Testando

Agora vamos testar. Para isso, certifique-se que o MySql foi inicializado e adicione no final da classe DBunitTest o seguinte teste:

@Test
	public void testCheckLoginDataLoaded() throws Exception{
		assertNotNull(getDataSet());
		int rowCount = getDataSet().getTable("login").getRowCount();
		assertTrue(rowCount!=0);	}

O teste é muito simples, apenas quero garantir que estamos conectados ao BD com os dados do dataset (observe que temos assert que verifica isso).  O resultado será:

dbunitgreen

Simples, não? Agora é apenas adicionar os cenários de testes no seu dataset, fazer as devidas implementações do DAO e chamar através dos seus testes.

Vou ficando por aqui… Até mais!