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á:
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!




