Nós, desenvolvedores, deveríamos estar acostumados com a criação de testes automatizados↳Testes 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) →, pois escrevê-los faz parte do processo de metodologias ágeis↳Agile11 conteúdosO antiágil: quais as práticas que te afastam do AgileGestão Dev & TI · ago 2020Adoção de metodologias ágeis em TI pode fazer a diferença em um mundo de rápidas mudançasGestão Dev & TI · mai 2023Webinar HostGator mostra como usar Metodologias Ágeis para tirar um projeto do papelGestão Dev & TI · mai 2019Ver tudo em Gestão Dev & TI →.
Sem processos de desenvolvimento ágeis será que você é ágil mesmo?
Essa é um pergunta para refletirmos. O simples fato de utilizamos alguma metodologia como Scrum, Kamban, Lean, e continuarmos desenvolvendo da mesma maneira, acredito eu que seja um dos erros de equipes que se julgam ágeis.
Mas voltando ao nosso foco, que é conversar sobre testes automatizados, vamos falar um pouco mais sobre o framework DBUnit. Ele é uma extensão do JUnit para criação de testes de banco de dados↳Banco de dados134 conteúdosSQL ou NoSQL: eis a questão!!Data · mar 2020Banco de dados: como organizar e dar segurança para milhões de dados de loteriasData · mai 20215 serviços gratuitos na cloud para bancos de dados PostgresData · fev 2025Ver tudo em Data →, entre outras coisas. Escrever objetos Mocks para fazer testes em que há acesso a banco de dados é uma estratégia para resolver esse tipo de teste. Outra estratégia seria acessar uma base de dados de desenvolvimento e executar os testes nela, muitos frameworks fazem dessa forma.
Utilizando o DBUnit teremos algumas facilidades como:
- Limpeza de registros após testes;
- Comparação direta de registros;
- Retorno de estado pós-teste;
- Popular banco antes do teste.
O DBUnit irá funcionar como um facilitador para os nossos testes.
Criando nossos Teste com JUnit, DBUnit e Spring
Construiremos nossa aplicação baseado em JUnit 4.x, pois é muito mais confortável utilizar anotações de testes e o Spring para fazer a nossa injeção de dependência, assim podemos separar configurações de testes da de implementação real. Para fazer o nosso build e gerenciar as dependências, vamos utilizar do Maven 2 (Confira as novidades do Maven 3.0 aqui).
Adicionando as dependências no nosso pom.xml
Editaremos nosso pom.xml para que atenda às nossas necessidades, para isso vamos adicionar as dependências do JUnit 4.x, DBunit e ao Spring conforme abaixo:
<?xml version="1.0" encoding="UTF-8"?><br /><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br /> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><br /> <modelVersion>4.0.0</modelVersion><br /> <groupId>brenooliveira</groupId><br /> <artifactId>testes-automatizados</artifactId><br /> <packaging>war</packaging><br /> <version>1.0.0-SNAPSHOT</version><br /> <name>Testes Automatizados com JUnit, DBUnit e Spring</name><br /> <url>http://www.brenooliveira.com.br/</url><br /><br /> <dependencies><br /><br /> <dependency><br /> <groupId>junit</groupId><br /> <artifactId>junit</artifactId><br /> <version>4.8.2</version><br /> <scope>test</scope><br /> </dependency><br /><br /> <dependency><br /> <groupId>org.dbunit</groupId><br /> <artifactId>dbunit</artifactId><br /> <version>2.4.8</version><br /> <scope>test</scope><br /> </dependency><br /><br /> <dependency><br /> <groupId>org.springframework</groupId><br /> <artifactId>spring</artifactId><br /> <version>2.5.6</version><br /> </dependency><br /><br /> <dependency><br /> <groupId>org.springframework</groupId><br /> <artifactId>spring-test</artifactId><br /> <version>2.5.6</version><br /> </dependency><br /><br /> <dependency><br /> <groupId>mysql</groupId><br /> <artifactId>mysql-connector-java</artifactId><br /> <version>5.0.8</version><br /> </dependency><br /><br /> </dependencies><br /> <build><br /> <plugins><br /> <plugin><br /> <artifactId>maven-compiler-plugin</artifactId><br /> <configuration><br /> <compilerVersion>1.6</compilerVersion><br /> <source>1.6</source><br /> <target>1.6</target><br /> </configuration><br /> </plugin><br /> </plugins><br /> </build><br /></project>No pom.xml acima apenas adicionamos os JARS do JUnit, DBUnit e dois JARS do spring um para testes.
O que iremos fazer nos testes
O exemplo será um simples update de tabela no MySQL, mas com o DBUnit você pode testar Querys mais elaboradas e inserções, entre outras coisas.
Configurando nosso DBUnit
Vamos preparar o ambiente para utilizar o DBUnit. Ele precisa de um arquivo XML, chamado dataset.xml, e na maior parte do tempo vamos trabalhar com XMLs, onde vamos definir onde nos colocamos as estruturas de nossas tabelas. No exemplo, teremos uma tabela Pessoas com a seguinte estrutura SQL:
CREATE TABLE pessoas(<br /> id int not null auto_increment,<br /> nome varchar(255) not null,<br /> aniversario date not null,<br /> primary key (id)<br />);Agora vamos definir o arquivo dataset.xml conforme abaixo:
<?xml version="1.0" encoding="UTF-8"?><br /><dataset><br /> <person id="1" nome="Breno Oliveira" aniversario="1985-12-26" /><br /></dataset>Observe que o XML criado é muito parecido com o SQL. Os nomes dos campos do SQL se transformam propriedades da nossa tag.
Temos nosso primeiro dataset, mas o DBUnit ainda espera um dataset de retorno. Como mencionei, vamos fazer apenas um update na tabela. Então nosso dataset ficará da seguinte forma:
<?xml version="1.0" encoding="UTF-8"?><br /><dataset><br /> <person id="1" nome="Breno Oliveira Alterado" aniversario="1985-12-26" /><br /></dataset>Configurando nosso DataSource com o Spring
O Bean abaixo define o DataSource para a conexão com um banco de dados MySQL:
<beans xmlns="http://www.springframework.org/schema/beans"<br /> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"><br /> <bean id="dataSource"<br /> class="org.springframework.jdbc.datasource.DriverManagerDataSource"<br /> p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/spronline"<br /> p:username="root" p:password="123456" /><br /><br /></beans>Sem muitas novidades na definição deste bean, ele apenas faz uma conexão com um banco de dados MySQL.
Escrevendo nosso teste
O passos para nossos teste serão:
- Carregar os dados antes para nossos métodos de teste;
- Vamos carregar o banco de dados por JDBC para simular a aplicação;
- Realizar os testes propriamente ditos, nos quais vamos comparar se o valor alterado está conforme o nosso XML de resultado esperado;
- E, finalizando nossa classe, iremos limpar a base de dados.
Observe a nossa classe de teste:
@RunWith(SpringJUnit4ClassRunner.class)<br />@ContextConfiguration(locations={"classpath:applicationContext.xml"})<br />@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})<br />public class TestDBUnitWithSpring {<br /><br /> @Autowired<br /> private DataSource dataSource;<br /><br /> @Before<br /> public void init() throws Exception{<br /> // Insere os dados no banco de dados<br /> DatabaseOperation.CLEAN_INSERT.execute(getConnection(), getDataSet());<br /> }<br /><br /> @After<br /> public void after() throws Exception{<br /> //Limpa a base de dados<br /> DatabaseOperation.DELETE_ALL.execute(getConnection(), getDataSet());<br /> }<br /><br /> private IDatabaseConnection getConnection() throws Exception{<br /> // Pega a conexão com o banco de dados<br /> Connection con = dataSource.getConnection();<br /> DatabaseMetaData databaseMetaData = con.getMetaData();<br /> IDatabaseConnection connection = new DatabaseConnection(con,databaseMetaData.getUserName().toUpperCase());<br /> return connection;<br /> }<br /><br /> private IDataSet getDataSet() throws Exception{<br /> // Pega o arquivo de para inserir<br /> File file = new File("src/test/resources/dataset.xml");<br /> return new FlatXmlDataSet(file);<br /> }<br /><br /> @Test<br /> public void testSQLUpdate() throws Exception{<br /> Connection con = dataSource.getConnection();<br /> Statement stmt = con.createStatement();<br /> // Pega o valor atual<br /> ResultSet rst = stmt.executeQuery("select * from pessoas where id = 1");<br /> if(rst.next()){<br /> // compara a partir de dataset.xml<br /> assertEquals("Breno Oliveira", rst.getString("nome"));<br /> rst.close();<br /><br /> // atualiza via SQL<br /> int count = stmt.executeUpdate("update pessoas set nome='Breno Oliveira Alterado' where id=1");<br /><br /> stmt.close();<br /> con.close();<br /><br /> // expera somente 1 linha de alteração<br /> assertEquals("one row should be updated", 1, count);<br /><br /> // Fetch database data after executing the code<br /> QueryDataSet databaseSet = new QueryDataSet(getConnection());<br /> // filtra os dados<br /> databaseSet.addTable("pessoas", "select * from pessoas where id = 1");<br /> ITable actualTable = databaseSet.getTables()[0];<br /><br /> // Carrega os dados esperados a partir do XML <br /> IDataSet expectedDataSet = new FlatXmlDataSet(new File("src/test/resources/expectedDataSet.xml"));<br /> ITable expectedTable = expectedDataSet.getTable("pessoas");<br /><br /> // Filtra colunas desnessarias dos dados atuais definidos pelo XML<br /> actualTable = DefaultColumnFilter.includedColumnsTable(actualTable, expectedTable.getTableMetaData().getColumns());<br /><br /> // Assert da base de dados atual com os dados esperados<br /> assertEquals(1,expectedTable.getRowCount());<br /> assertEquals(expectedTable.getRowCount(), actualTable.getRowCount());<br /> assertEquals(expectedTable.getValue(0, "nome"), actualTable.getValue(0, "nome"));<br /><br /> } else {<br /> fail("no rows");<br /> rst.close();<br /> stmt.close();<br /> con.close();<br /> }<br /><br /> }<br />}Anotamos a classe com @RunWith(SpringJUnit4ClassRunner.class) para o JUnit rodar os testes com o Spring Test. E também anotamos a classe com o @ContextConfiguration(locations={“classpath:applicationContext.xml”}), que define o nosso arquivos de XML onde estão nossas configurações, mas você poderia criar um arquivo somente para os testes. As demais observações deixei no código.
Para o Spring realizar a injeção de dependência, adicionamos @TestExecutionListeners({DependencyInjectionTestExecutionListener.class}), assim podemos usar o nosso @Autowired para nosso Bean de DataSource.
As demais partes do teste são detalhes. Como o foco aqui era exibir como fazer a integração, deixarei somente nos comentários do código.
Comentem!





