Testes de Software –
Parte 2
UMC
JUnit
• Junit:– framework open-source,
– criado por Erich Gamma e Kent Beck,
– suporte à criação de testes automatizados – linguagem de programação Java.
• Facilita a criação de código para a automação de testes com apresentação dos resultados.
• Pode ser verificado se cada método de uma classe funciona da forma esperada, exibindo possíveis erros ou falhas.
• O programador tem a possibilidade de usar esta ferramenta para criar um modelo padrão de testes, muitas vezes de forma automatizada.
• Permite a realização de testes de unidades, conhecidos como "caixa branca", facilitando assim a correção de métodos e objetos.
• O teste de unidade testa o menor dos componentes de um sistema de maneira isolada.
JUnit
• Arquitetura - A API do JUnit é organizada da seguinte forma: – Obs: versão 3 do JUNIT.
- Existe uma classe Test que contem um método runTest responsável por fazer testes particulares.
- Duas classes herdam da classe Test.
– a classe TestCase, que testa os resultados de um método,
– a classe TestSuite que faz um único teste em mais de um método registrando os resultados.
JUnit
• Método de comparação – assertEquals()
– O método assertEquals é um método que pode ser implementado de várias formas diferentes.
– Ele recebe como parâmetro o resultado do método que está sendo testado e o resultado esperado pelo desenvolvedor caso o método testado esteja correto.
– O tipo desses valores passados como parâmetro pode ser vários (int, double, String, etc…).
• Métodos setUp() e tearDown()
– O método setUp() é utilizado para sinalizar o início do processo de teste. Vem antes do método de teste.
– O método tearDown() sinaliza o final do processo, desfazendo o que o setUp() fez. Vem depois do método de Teste.
JUnit
• Passo 1: para cada classe a ser testada criar uma classe de Teste – Exemplo:
• classe Conta terá como classe de teste ContaTest • A classe de Teste deve herdar da classe TestCase
do framework JUnit TestCase assertEquals() assertNotNull() assertNull() fail() setUp() tearDown() run() ContaTest
JUnit
import junit.framework.*;
public class ContaTest extends TestCase { public ContaTest(String name) {
super(name); } ... } Importar classes do framework JUnit Herdar da classe TestCase Definir um construtor que recebe uma String
JUnit
• Passo 2: criar métodos de teste cujos nomes iniciam com
a palavra “test” e possuem tipo de retorno void. Exemplo
para a classe ContaTest:
– public void testCredito()
– public void testDebito()
– public void testCreditoNegativo()
– public void testDebitoNegativo()
JUnit
• Passo 3: para cada método de teste definir seu
comportamento:
– invocação de métodos da classe do sistema a ser
testada
– avaliação do resultado dos métodos sendo
testados usando os métodos assertEquals(), fail(),
assertNull(), assertNotNull() do framework JUnit
JUnit
public class ContaTest extends TestCase { ...
public void testCreditar(){
Conta contaNum111_Saldo200 = new Conta(111, 200.0); Conta contaNum111_Saldo50 = new Conta(112, 50.0); contaNum111_Saldo50.creditar(150.0); this.assertEquals(contaNum111_Saldo200, contaNum111_Saldo50); } } Declaração do método de teste
JUnit
• Alguns métodos do JUnit para teste:
– assertEquals (objetoEsperado, objetoTeste);
– assertTrue (expressaoBooleana);
– assertNull(objeto);
– assertNotNull(objeto);
– fail (mensagem);
JUnit
public class ContaTest extends TestCase { ...
public void testDebitar(){
Conta contaNum111_Saldo50 = new Conta(111, 50.0); Conta contaNum111_Saldo1 = new Conta(111, 1.0); try {
contaNum111_Saldo50.debitar(51.0);
} catch(SaldoInsuficienteException saldo){ fail("Operacao de Debito falhou");
}
this.assertEquals(contaNum111_Saldo1, contaNum111_Saldo50); }
JUnit
public class ContaTest extends TestCase { ...
public void testDebitoNegativo(){
Conta contaNum111_Saldo50 = new Conta(111, 50.0); try {
contaNum111_Saldo50.debitar(51.0);
fail("Deveria lançar SaldoInsuficienteException"); } catch(SaldoInsuficienteException saldo){
} } }
JUnit
• Caso necessário, pode-se definir configurações iniciais para serem
executadas antes de cada método de teste usando o método
setUp()
– configuração de objetos comuns aos casos de teste
– configuração de recursos comuns aos casos de teste
(exemplo: abertura de conexões de banco de dados, socket,
etc)
• Para liberar recursos utilizados pelos métodos de teste pode-se usar
o método
tearDown()
– Exemplos de recursos que podem ser liberados: streams,
fechar conexões de banco de dados, apagar/mover arquivos
de dados.
JUnit
public class ContaTest extends TestCase { Conta contaNum111_Saldo50;
Conta contaNum111_Saldo1; ...
public void setUp(){
this.contaNum111_Saldo50 = new Conta(111, 50.0); this.contaNum111_Saldo1 = new Conta(111, 1.0); }
... }
Execução antes de cada método de teste
JUnit
• Cada uma dessas unidades define um conjunto de estímulos (chamada de método), e de dados de entrada e saída associados a cada estímulo. • As entradas são parâmetros e as saídas são o valor de retorno,
exceções ou o estado do objeto.
• Teste unitário executa um método individualmente e compara uma saída conhecida após o processamento da mesma.
• Por exemplo:
Assert.assertEquals(2, algumMetodo(1));
– A expressão acima verifica se a saída de algumMetodo() é 2 quando esse método recebe o parâmetro 1.
– Assim sendo, o conceito chave de um teste de unidade é exercitar um código e qual o resultado esperado.
JUnit
• Exemplo de como codificar classes de testes em Java:
1. Crie uma classe que estenda junit.framework.TestCase para cada classe a ser testada:
import junit.framework.*;
class SuaClasseTest extends TestCase { … }
2. Para cada método a ser testado defina um método public void test???() no test case SuaClasseTest:
SuaClasse:
public int Soma(Object o ...) { ... } SuaClasseTest:
JUnit
• Exemplo simples
import junit.framework.*;
public class SimpleTest extends TestCase { public SimpleTest(String name) {
super(name); }
public void testSimpleTest() { int answer = 2; assertEquals((1+1), answer); } } 1 2 3 4 5
JUnit
import junit.framework.*;
Como estamos usando algumas construções criadas pelos fabricantes do Junit, temos de importar qualquer uma das classes que desejamos usar; a maioria destas reside no subdiretório do framework, daí a declaração de importação. public class SimpleTest extends TestCase {
Nossa classe simples precisa definir seu(s) próprio(s) método(s) de teste para, na verdade, ser de alguma utilidade; assim ela estende a classe TestCase que nos dá a capacidade de definir os nossos próprios métodos de teste.
public SimpleTest(String name) { super(name); }
A cada teste é dado um nome, assim quando vermos os resultados de todo o teste de saída, podemos ver de qual teste um erro foi gerado se o teste falhar. O construtor oferece essa funcionalidade, passando o parâmetro passado em construção para a classe pai.
1
2
JUnit
public void testSimpleTest() { int answer = 2;
Teste incluído neste caso de teste. Tem o mesmo nome do método
original, com a palavra test na frente. Podemos definir variáveis e realizar operações aritméticas como qualquer outro programa Java.
assertEquals((1+1), answer); }
Esta teste simples testa se 1+1 é igual ao valor da resposta, através do método assertEquals() da classe TesteCase estendida.
Obs: no lugar do parâmetro (1+1), chamamos o método que realiza o cálculo no programa original.
4
JUnit
• JUnit – Analisando o resultado
• Quando os testes forem executados em modo gráfico, os métodos testados podem apresentar os seguintes resultados:
JUnit
• Exemplo de Teste
Classe a ser testada
JUnit
• Resultado em caso de SUCESSO
• O test case CalculoTest.java está usando a declaração assertiva do método assertEquals(), que é assinado com dois parâmetros principais: o valor esperado, e valor retornado.
• Para isso instanciamos os atributos(variáveis) PassaValor1 = 10, PassaValor2 = 5 e RetornoEsperado = 15.
• Para o atributo RetornoFeito atribuímos o resultado do método ExecutaCalculo() da classe Calculo, passando como parâmetros PassaValor1 e PassaValor2.
• Por final usamos o método assertEquals (RetornoEsperado, RetornoFeito), para comparar o valor esperado com o valor retornado após a execução do método ExecultaCalculo().
JUnit
• Na lateral esquerda da tela temos o resultado da execução do teste através do JUnit, que nesse exemplo retornou com sucesso(verde), pois os valores passados(10 e 5) certamente quando somados retornam 15.
JUnit
• Execução com falha.
• Para isso, mudaremos o atributo PassaValor2 para 6, dessa forma,
claramente que 10 somado a 6 não dá 15 (valor esperado), dessa forma, o JUnit retornará uma falha (vermelha), observe também, que na parte
inferior da lateral esquerda da tela, ele mostra qual método falhou, e qual foi à falha.
JUnit
Método para teste da Classe Cálculo – criado pelo JUnit Tela: