DataARTIGO

Automatizando seus testes com DBUnit + MySQL

No artigo de hoje vamos ver como rodar unit tests usando o DBUnit com MySql.

Olá, pessoal!

No artigo de hoje vamos ver como rodar unit tests usando o DBUnit com MySqlMySQL8 conteúdosMySQL + Adminer + Docker Compose: montando rapidamente um ambiente para usoData · abr 2019Banco de dados MYSQL no PHPStormDev (Back & Front) · jul 2019Criando um ambiente de desenvolvimento PHP mínimo com Docker – Parte 3Dev (Back & Front) · out 2019Ver tudo em Data . O DBUnit é uma API para fazermos testes unitários usando um banco de dados. Para rodar os testes automatizadosTestes automatizados4 conteúdosComo migrei meus testes automatizados de Java para Ruby… Será que fiz bem?Dev (Back & Front) · jun 2019TDD em Nodejs: conhecendo o JestDev (Back & Front) · mar 2019Arquitetura Hexagonal na prática com exemplos em PythonDev (Back & Front) · mai 2025Ver tudo em Dev (Back & Front) é 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!

é Bacharel em Sistemas de Informação e Especialista em Gestão e Estratégia de Negócios. Trabalha com TI desde 2003 e possui as certificações SCJP 5 e SCM. Trabalhou na IBM Brasil como Analista Programador Java, passou pelo laboratório da Enterprise Computing Lab (ECL) HP como Software Engineer, Ci&amp;T como Engenheiro de Software em projeto JEE. Tem experiência internacional em Índia, Dubai e Londres. Atualmente é cofundador da ITSLabs (www.itslabs.com.br), uma start-up focada na criação de produtos web e mobile para start-ups. Também é autor dos livros "Guia do Exame SCJP", "Guia Prático JEE com Frameworks" e "TDD na prática".

Ver perfil