Baixe o app para aproveitar ainda mais
Prévia do material em texto
JUnit Disciplina: Teste de Software Prof. Sidney Nogueira DEPARTAMENTO DE ESTATíSTICA E INFORMÁTICA n Aprender funções básicas do JUnit como criar/ executar testes e test suites n Referência utilizada http://www.vogella.com/articles/JUnit/article.html Objetivo n Framework bastante simples para escrever testes automáticos em Java n Atualmente na versão 5.X n Criado para testar unidades de código Java n Métodos n Classes n Componentes JUnit n Boa prática é colocar o código de testes separado do código da aplicação n Outra classe n Outro pacote n Outro projeto n Código de teste é colocado em uma classe chamada classe de testes n Métodos de teste anotados com @Test JUnit n Para baixar o projeto do Eclipse com todo o código do banco de exemplo http://goo.gl/2NFOJ4 Banco Exemplo n Criando uma classe de testes no Eclipse n File → New → JUnit → JUnit Test case Criando classe de testes n Exemplo: Classe de testes chamada TestConta package br.ufrpe.poo.banco.negocio; import static org.junit.Assert.*; import org.junit.*; public class TestConta { @Test public void testeConstrutor() { Conta c = new Conta("1",100); assertEquals("Numero incorreto", "1”, c.getNumero()); assertEquals("Saldo incorreto", 100, c.getSaldo(), 0); } } Classe de testes n Métodos estáticos de JUnit que comparam o valor esperado (expected) vs o encontrado (current): n Passo caso valores sejam iguais n Falha caso valores sejam diferentes (AssertException) n Dá erro quando exceção é levantada durante o teste n Exemplo: public static void assertEquals(double esperado, double atual, double tolerancia) Métodos de verificação (assertion) n Ordem de execução dos métodos dentro de uma classe de testes não é garantida n Crie métodos independentes n Para rodar um teste no Eclipse n Run → Run As → JUnit Test n Para rodar fora do Eclipse use a classe n org.junit.runner.JUnitCore Rodando classe de testes n Resultado da execução no Eclipse da Classe TestConta (4 passam, 1 falha e 1 ignorado) Rodando classe de testes n Significado dos vereditos de JUnit n Error: aconteceu uma exceção n Fail: método de asserção falhou n Pass: todos os métodos asserção passaram n Objetivo é deixar a barra totalmente verde! n Corrigindo o teste: caso o problema seja no testes n Corrigindo a implementação: caso o problema seja no SUT Rodando classe de testes n Outros métodos de verificação Métodos de verificação Anotação Descrição Fail (String) Faz o teste falhar assertTrue([mensagem], boolean condicao) Verifica que a condição booleana é verdadeira assertEquals([message], esperado, atual) Verifica que os valores (objetos) são iguais n Outros métodos de verificação Métodos de verificação Anotação Descrição assertNull([mensagem], object) Verifica que a referência é nula assertNotNull([message], object) Verifica que a referência não é nula assertSame([mensagem], esperado, atual) Verifica que referências apontam para mesmo objeto. assertNotSame([mensagem], esperado, atual) Verifica que referências não apontam para mesmo objeto. n Exemplo: método de teste de TestConta que utiliza fail @Test public void testeDebitarSaldoSuficiente() { Conta c = new Conta("123",300); try { c.debitar(200); } catch (SaldoInsuficienteException e) { fail("Excecao nao deveria ter sido levantada porque existe saldo"); } assertEquals(100, c.getSaldo(), 0); } Classe de testes n Principais anotações Anotações na classe de testes Anotação Asssinatura método Descrição @Test public void m() Identifica um método de teste @Before public void m() Método que é rodado antes de cada teste @After public void m() Método que é rodado após cada teste @BeforeClass public static void m() Método rodado antes de todos os testes @AfterClass public static void m() Método rodado depois de todos os testes n Outras anotações Rodando classe de testes Anotação Descrição @Ignore Ignora o teste (usado quando teste fica desatualizado). @Test (expected = Exception.class) Passa quando o método lança a exceção indicada. @Test(timeout = 50ms) Falha se a execução do método demora mais do que o tempo indicado. n Exemplo: método de teste de TestConta que usa a anotação expected @Test (expected = SaldoInsuficienteException.class) public void testeDebitarForaLimite() throws SaldoInsuficienteException { Conta c = new Conta("123",300); c.debitar(301); } Classe de testes n Quando testando uma unidade rodamos apenas a classe de testes correspondente n Quando queremos testar várias classes criamos uma suite de testes formada pelas classes de teste que queremos executar n Suite de testes para um pacote n Suite de testes para todas as classes do projeto n Suite de testes de regressão n etc Criando uma suite de testes n Criando uma suite de testes no Eclipse n File → New → Java → JUnit → JUnit Test Suite Criando uma suite de testes n A classe a seguir corresponde a suite de testes com duas classes de teste (TestConta e TestePoupanca) package br.ufrpe.poo.banco.negocio; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({ TesteConta.class, TestePoupanca.class }) public class AllTests { } Criando uma suite de testes n A classe a seguir corresponde a suite de testes que inclui a suite de testes de negocio package br.ufrpe.poo.banco; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({br.ufrpe.poo.banco.negocio.AllTests.class}) public class TodosOsTestes { } Criando uma suite de testes n Pode ser conveniente rodar os teste sem utilizar a interface do Eclipse n Testes JUnit podem ser executados independente do Eclipse n Exemplos: n Rodar os testes pela linha de comando n Utilizar o Ant para criar scripts que compilem, executam testes e geram relatórios Rodando test suite sem GUI do Eclipse n Soluções de integração contínua combinam controle de versão do código com execução dos testes n Quando o desenvolvedor envia um nova versão do código o servidor: n Compila o código, roda os testes, gera relatórios, notifica os responsáveis sobre os resultados n Exemplo: Jenkis é um servidor de integração contínua para projetos Java/Scala Rodando test suite sem GUI do Eclipse n O código a seguir roda todos os testes e imprime apenas os testes que falharam package br.ufrpe.poo.banco; import org.junit.runner.*; import org.junit.runner.notification.Failure; public class RodarTodosOsTestes { public static void main(String[] args) { Result result = JUnitCore.runClasses(TodosOsTestes.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } } Rodando test suite sem GUI do Eclipse n É possível criar uma classe de testes parametrizada por dados n Cada teste roda uma vez para cada parâmetro fornecido n Isto é útil para criar testes a partir de massas de dados n Valor de entrada e respectiva saída fornecidos Classe de teste parametrizada n Primeiraparte da classe de testes parametrizada TesteTransferencia package br.ufrpe.poo.banco.negocio; @RunWith(Parameterized.class) public class TesteContaTransferencia { private double saldoOrigemAntes, saldoDestinoAntes, valorTransferir, saldoOrigemDepois, saldoDestinoDepois; public TesteContaTransferencia(double oa, double da, double v, double od, double dd) { this.saldoOrigemAntes = oa; ... } ... Classe de teste parametrizada n Segunda parte da classe de testes parametrizada TesteContaTransferencia @Parameters public static Collection<Object[]> data() { Object[][] data = new Object[][] { { 100, 100, 50, 50, 150 }, { 100, 100, 100, 0, 200 } }; return Arrays.asList(data); } @Test public void testTransferencia() throws SaldoInsuficienteException { Conta origem = new Conta("1",this.saldoOrigemAntes); Conta destino = new Conta("2", this.saldoDestinoAntes); origem.debitar(this.valorTransferir); destino.creditar(this.valorTransferir); assertEquals(this.saldoOrigemDepois, origem.getSaldo(), 0); assertEquals(this.saldoDestinoDepois, destino.getSaldo(), 0); } } Classe de teste parametrizada
Compartilhar