Testes de Unidade com JUnit

LPOO 1 - Java


Prof. Rodrigo Noll @ IFRS Canoas



Versão para impressão

Testes de Unidade

Exercícios

Introdução a Testes de Unidade

  • Uma unidade de teste é um trecho de código escrito por um desenvolvedor que executa uma funcionalidade específica, que deve ser testada.
    • O percentual de código testado por esta unidade é tipicamente chamado de teste de cobertura


  • Testes de unidade são pequenas unidades de código (método ou classe) utilizadas para testar cada unidade de uma aplicação individualmente, bem como a integração dessas unidades

Introdução a Testes de Unidade

  • Os testes de unidade garantem que o código funciona como deveria.
    • Além disso, garantem que o código continua funcionando após qualquer manutenção corretiva ou evolutiva (se tiver cobertura adequada), sem precisar executar testes manuais


  • Tipicamente testes de unidade são criados no seu projeto em uma pasta de teste específica para evitar que se misturem com os códigos das funcionalidades

Teste de Unidade com JUnit

Teste de Unidade com JUnit

  • Teste de Unidade com a versão 4.x do Junit utilizam anotações para identificar métodos que são específicos de um teste.
    • Tipicamente, estes métodos fazem parte de uma classe que contém só testes, chamada de Classe de Teste (Test Class)


  • Para se criar um código, selecione:
    • File > New > Java > JUnit > JUnit Test Case

Teste Unitário com JUnit

  • Exemplo de método

@Test
public void testaMultiplica() {

   // MyClass is tested
   MinhaClasse tester = new MinhaClasse();

   // Verifica se multiplica(10,5) retorna 50
   assertEquals("10 x 5 deve ser 50", 50,
                 tester.multiplica(10, 5));
 }
                            

Teste Unitário com JUnit

  • JUnit assume que todos os métodos de teste podem ser executados em ordem arbitrária (testes não podem depender do resultado de outros testes)

  • Para escrever um teste com Junit, se utiliza a anotação @org.junit.Test e utiliza um método de asserção do Junit para verificar se o resultado do método é o esperado.

  • Para executar no Eclipse, clique com o botão direito em cima da classe de teste e selecione Run → Run As → JUnit Test.

Anotações do JUnit

Anotações do JUnit

Anotação Descrição
@Test public void method() A anotação @Test identifica que o método é um método de teste.
@Before public void method() Este método é executado antes de cada teste. Este método pode ser utilizado para preparar os ambientes de teste (ler dados de entrada, inicializar classe).
@After public void method() Este método é executado após cada teste. Este método pode limpar o ambiente de teste (por exemplo, limpar dados temporários, restaurar valores padrões). Pode economizar memóroa limpando estruturas de memória caras.
@BeforeClass public static void method() Este método é executado apenas uma vez, antes de todos os testes iniciarem. Ele pode ser usado para executar atividades intensivas de tempo, como por exemplo, conectar com o banco. Métodos anotados com essa anotação necessitam ser definidos como estáticos para funcionar no Junit.

Anotações do JUnit

Anotação Descrição
@AfterClass public static void method() Este método é executado apenas uma vez, após todos os testes terem sido concluídos. Ele é utilizado para atividades de limpeza de dados, por exemplo, desconectar do banco de dados. Métodos anotados com esta anotação devem ser estáticos para funcionar no Junit.
@Ignore Ignora um método de teste. Este método é útil quando o código original foi alterado e os testes não foram adaptados, ou o tempo de execução é muito longo para ser executado todas as vezes..
@Test (expected = Exception.class) Falha se o método não lança uma exceção esperada (nomeada).
@Test(timeout=100) Falha se o teste leva mais que 100 milisegundos.

Testando Exceções

  • A anotação @Test (expected = Exception.class) é limitada e pode testar apenas uma única exceção.
  • Para testar mais de uma, use:

try {
   deveLancarUmaExcecao();
   fail();
} catch (Exception e) {
   // Experado
   /* pode testar a mensagem para ver se foi lançada a exceção correta. */
}

                            

Declarações de Asserção

Declarações de Asserção

  • Junit fornece métodos estáticos para testar certas condições, chamados AssertX.

  • Estes métodos tipicamente iniciam com (1) uma mensagem de erro, (2) um resultado esperado e (3) um resultado real.
    • Uma asserção compara o resultado esperado com o retornado por um método e lança uma exceção (AssertionException) se a comparação falha.

Anotações do JUnit

Declaração Descrição
fail(String) Deixa o método falhar. Pode ser usado para verificar que uma parte do código não pode ser atingida ou ter um teste falhando antes da implementação do código de teste ser concluída.
assertTrue([message], boolean condition) Testa se uma condição booleana é verdadeira
assertEquals([String message], expected, actual) Testa se dois valores são os mesmos. Note: para arrays, a referência é verificada e não seu conteúdo
assertEquals([String message], expected, actual, tolerance) Testa se valores float (ou double) são iguais. A tolerância é que o número de decimais deve ser o mesmo.

Anotações do JUnit

Declaração Descrição
assertNull([message], object) Verifica que um objeto é null.
assertNotNull([message], object) Verifica que um objeto não é null.
assertSame([String], expected, actual) Verifica que duas variáveis se referem a um mesmo objeto.
assertNotSame([String], expected, actual) Verifica que duas variáveis se referem a objetos diferentes.

Declarações de Asserção

  • Você deve fornecer mensagens significativas nos textos da asserção para que seja mais fácil para o desenvolvedor identificar o problema.

  • Isso ajuda a corrigir o erro, especialmente se outra pessoa olhar para o problema (isso é, outra que não escreveu o teste ou o código).

Suite de Testes

Criando uma suite de testes

  • Se você tem várias classes de teste, você pode as combinar em uma Suíte de Teste (Test Suite).
    • Rodando a suíte, todos os testes da mesma serão executados

  • O seguinte exemplo de código mostra uma suíte de teste que define duas classes de teste a serem executadas.
    • Caso queira adicionar outra classe de teste, só adicione com a declaração @Suite.SuiteClasses.

Criando uma suite de testes


package br.edu.aulas;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({ MinhaClasseTest.class, MinhaSegundaClasseTest.class })
public class AllTests {

}
                        

Eclipse e JUnit

Eclipse e JUnit

1. Criando infraestrutura de teste
Criar Source Folder chamado "test”

Eclipse e JUnit

2. Criando classe de teste
Selecione a classe a ser testada, botão direito > New > Other > Java/Junit/Junit Test Case

Eclipse e JUnit

3. Criando classe de teste
Selecione Source Folder (Test) e next para selecionar os métodos da classe a ser testada.

Eclipse e JUnit

Se o Junit não estiver vinculado ao projeto, o Eclipse irá sugerir sua importação. Importe a biblioteca no projeto.

Eclipse e JUnit

4. Executando classe de teste
Botão direito em cima da classe de teste > Run As > JUnit Test

Eclipse e JUnit

5. Ver o resultado da execução

Importações Estáticas do JUnit

Junit utiliza métodos estáticos que nem sempre o Eclipse pode importar automaticamente.
  • Para importar automaticamente, abra Janela de Preferences > Java > Editor > Content Assist > Favorites.
  • Use o botão New Type para adicionar org.junit.Assert, que deixará disponível os métodos assertTrue, assertFalse and assertEquals.

Criação de uma Suite de Testes

Você pode criar uma suite de testes da mesma forma que criou uma classe de testes.

Exercício usando JUnit

Exercício usando JUnit

1. Crie um projeto Java chamado PrimeiroJUnit
2. Crie o Source Folder test conforme slide 13

Exercício usando JUnit

3. No Source Folder src, crie a classe abaixo

package br.edu.aulas;
public class Matematica {
    public int multiplica(int x, int y) {
        // O que segue é apenas um exemplo
        if (x > 999) {
            throw new IllegalArgumentException("X deve ser menor que 1000");
        }
        return x / y;
    }
}
                       

Exercício usando JUnit

4. Criando o Caso de Teste para classe Matematica e altere o Source Folder

Exercício usando JUnit

5. Selecione os métodos para teste e finalize. Se o Wizard perguntar para adicionar o JUnit no build path, aceite.

Exercício usando JUnit

6. Copie o código abaixo na classe de teste

package br.edu.aulas;

import static org.junit.Assert.assertEquals;

import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class MatematicaTest {
	Matematica matematica;

	@Before
	public void setup() {
		matematica = new Matematica();
	}

	@BeforeClass
	public static void testSetup() {
	}

	@AfterClass
	public static void testCleanup() {
		// Limpa os dados usados no Test Case
	}

	@Test(expected = IllegalArgumentException.class)
	public void testaOLancamentoDaExcecao() {
		matematica.multiplica(1000, 5);
	}

	@Test
	public void testMultiplica() {
		assertEquals("10 x 5 deve ser 50", 50, matematica.multiplica(10, 5));
	}
}

                       

Exercício usando JUnit

7. Execute a classe de teste conforme slide 15. A saída deve ser a imagem da esquerda.

Exercício usando JUnit

8. Crie os métodos para as operações de soma, subtração e divisão com os respectivos testes.
  • Teste com operadores positivos, negativos, nulos, divisão por Zero, etc.

Java - Testes de Unidade com JUnit

Exercícios


LPOO 1 - Java