Testes em Java
e Izabela Vanessa
(izabela.vmelo@gmail.com)
Por Demontiê Júnior
(demontiejunior@gmail.com)
Escrever testes é uma atividade fundamental no processo de desenvolvimento de software, porém, não é algo simples. Além disso, existem vários tipos de testes que podem ser utilizados para avaliar o programa em desenvolvimento. No PETNews deste mês, falamos um pouco sobre três tipos de testes e frameworks para cada um deles.

O processo de desenvolvimento de software envolve uma série de atividades, para as quais podem ser utilizados vários métodos, técnicas e ferramentas e tem como objetivo o desenvolvimento de softwares com alta qualidade. Para atingir esse objetivo, é preciso fazer testes para identificar erros introduzidos no processo de desenvolvimento. A atividade de teste é dividida em três etapas: criar casos de teste, rodar o programa e analisar os resultados.

A seguir, serão apresentados três tipos de testes e respectivos frameworks em Java.


TESTE DE UNIDADE

Conceito

Os testes de unidade são utilizados para testar a "menor parte testável de um programa", o que permite que cada teste seja independente dos demais. Em Java, utiliza-se testes de unidade para testar métodos de classes (testa-se toda a interface de uma classe). Esse tipo de teste facilita o uso de TDD (Test-Driven Development - em português, Desenvolvimento Dirigido por Testes), visto que podemos escrever testes para cada método, e implementá-los até que passem nos testes.

O framework

JUnit é um framework desenvolvido em Java para a utilização de testes de unidade. Ele fornece algumas annotations e métodos que auxiliam na construção dos testes. As annotations mais utilizadas no desenvolvimento de testes com JUnit são: @Before, indica que o método será chamado sempre antes de cada teste; @After, indica que o método será chamado sempre após cada teste; @Test, indica um teste de unidade. Os métodos mais utilizados são: assertTrue(boolean expression), checa se uma expressão booleana é verdadeira; assertEquals([String message], expected, actual), testa se dois valores (sejam objetos de classes ou tipos primitivos) são iguais; assertNull([message], object), checa se um objeto é nulo.

Mais informações e exemplos de código utilizando o JUnit são encontrados aqui.


TESTE DE ACEITAÇÃO

Conceito

São testes caixa preta que têm como objetivo capturar os requisitos funcionais para um sistema de software conforme expresso por um cliente (geralmente, por meio de User Stories). Ou seja, os testes são escritos sem que seu autor conheça, necessariamente, o código fonte, e especificam o que o cliente quer que seja feito pelo sistema quando um dado Caso de Uso estiver concluído. Os testes de aceitação devem ser de fácil compreensão para os clientes (pessoas que geralmente não são da área de TI - Tecnologia da Informação) de forma que possam compreendê-los e validá-los.

O framework

EasyAccept é um framework desenvolvido em Java pela equipe de pesquisa do professor Dr. Jacques Philippe Sauvé (DSC/CEEI/UFCG). O objetivo do framework é fornecer uma sintaxe simples o suficiente para que clientes que não sejam de TI possam entender os scripts de testes afim de que possam auxiliar no desenvolvimento destes.

Um tutorial com um exemplo de uso do EasyAccept pode ser encontrado aqui.


TESTE DE MUTAÇÃO

Conceito

Os testes de mutação são baseados nos erros que podem ser cometidos ao desenvolver um software. O programa que será testado sofre várias alterações. Erros são introduzidos no programa original gerando um conjunto de programas mutantes. O trabalho do testador é escolher casos de teste que mostram a diferença entre os mutantes e o programa original.

O teste de mutação é dividido em quatro etapas: execução do programa original com um conjunto de casos de testes T, geração dos programas mutantes, execução dos programas mutantes com o mesmo conjunto de casos de testes T e, por fim, análise dos mutantes.

Para gerar os programas mutantes, são necessários operadores (regras que definem as alterações que devem ser aplicadas ao produto em teste). Quando o operador é aplicado a um programa P, transforma P em um programa similar (chamado de mutante). Operadores dependem da linguagem em que o programa está escrito. Não existe uma maneira direta de definir operadores. Com isso, eles, geralmente, são projetados tendo por base a experiência no uso de uma dada linguagem. Um exemplo de operador para um programa escrito em Java é um operador que retira um comando de P.

O framework

Por ter um processamento alto (gerar e executar mutantes e comparar resultados), por ser uma atividade interativa e iterativa, é necessário o auxílio de uma ferramenta. Uma das ferramentas que podem ser usadas é o MuJava. Este framework é capaz de gerar mutantes automaticamente, o que pode nos possibilitar uma maior cobertura de testes.

Mais informações sobre o MuJava, incluindo exemplos e um tutorial de instalação de um plugin, podem ser encontradas aqui.

Jornal PETNews - Edição: Caio Paes - Revisão: Janderson Jason e Joseana Fechine
Grupo PET Computação UFCG, 2011. All rights reserved.