J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

23
JUnit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br

Transcript of J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Page 1: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

JUnit

Um Framework Para Testes

Sylvia CamposRodrigo Lumack

{scls, rlmb}@cin.ufpe.br

Page 2: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Motivação

Todos os programadores sabem que devem testar seu código

Quanto mais curto o prazo menos testes são realizados

Necessidade de testar cada método separadamente

Centralizar o código de testes

Regras já definidas para apresentação de erros

Possibilidade de automatização

Page 3: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Testes em Software

Revelam erros no código

Garantem que a implementação respeita a especificação

Devem ser automatizados a fim de serem facilmente executados sempre que necessário

Garantem a qualidade do software durante todo o ciclo de vida

Page 4: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Testes Automatizados

Avaliam se um programa funciona como esperado

Exemplo: main()

Validam os requisitos

Page 5: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Testes de Unidade

Testam a aplicação em seus menores componentes, isoladamente

Testam unidades lógicas Métodos

Objetos

Maior número de erros detectados

Erros mais fáceis de corrigir

Devem ser executados continuamente

Page 6: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Testes de Integração

Testam como uma coleção de unidades interage entre si ou com o ambiente onde executam

Executados continuamente (caso as unidades em desenvolvimento dependam de outras)

Page 7: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Testes Funcionais

Ponto de vista do usuário

Testam casos de uso

Validam a interface com o usuário, as operações requisitadas, etc.

São menos estáveis do que os outros tipos

Page 8: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

JUnit

Framework para facilitar o desenvolvimento e a execução de testes de unidade em programas Java

Modelo de programação para a criação de testes de unidade

Sugerido por Kent Beck

Page 9: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

JUnit

API para construir testes junit.framework.*

Aplicações para executar testes TestRunner

Page 10: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

JUnit

O framework JUnit pode ser resumido em uma classe pai para todos os casos de teste (chamada TestCase) que fornece ferramentas para rodar testes, gerar relatórios e definir conjuntos de testes

Page 11: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Escrevendo uma classe de teste

Assuma uma classe Conta Para testar a classe definimos uma classe

ContaTest

import test.framework.TestCase;

public class ContaTest extends TestCase {

public ContaTest(String testCase) {

super(testCase);

}

}

Page 12: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Escrevendo uma classe de teste

Para testar o método creditar(double valor) definimos o método testCreditar() na classe ContaTest;

public void testCreditar() {

Conta c = new Conta(1, 100);

c.creditar(50.0);

assertTrue(c.getSaldo() == 150);

}

Para cada método da classe Conta é definido um método na classe ContaTest

Page 13: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Principais Asserções

assertEquals(objEsperado, objRecebido);

assertTrue(expBooleana);

assertNull(obj);

assertNotNull(obj)

assertSame(obj1, obj2);

fail(mensagem);

Page 14: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Instalando e Rodando o JUnit

www.junit.org

Descompacte o arquivo junit3.8.1.zip.

Baixe a classe Conta.java em www.cin.ufpe.br/~scls/ES

Incluir o arquivo junit.jar no classpath

Crie uma classe ContaTest que será o test case da classe Conta.

Page 15: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Funcionamento

O TestRunner recebe uma subclasse de junit.framework.TestCase e executa o método run(Test) Obtém dados de TestSuite - suite()

TestSuite usa Java Reflection para descobrir os métodos de teste

Page 16: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Funcionamento

public static Test suite(){ return new TestSuite(ContaTest.class);

}

public static void main(String[] args){

junit.textui.TestRunner.run(suite());

}

Page 17: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

TestSuite

Composição de testes

public static Test suite() {

TestSuite suite = new TestSuite();

suite.addTest(new ContaTest("testGetSaldo"));

suite.addTest(new ContaTest("testCreditar"));

return suite;

}

Um TestSuite é usado pelo TestRunner para saber quais métodos devem ser executados como testes

Page 18: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

TestSuite

Para executar mais de um teste de uma vez e/ou reusar testes de outras classes (testes regressivos)

public static Test suite() {

TestSuite suite = new TestSuite();

suite.addTest(new ContaTest("testSaldoConta"));

suite.addTest(new ContaTest("testCredito"));

suite.addTest(PoupancaTest.suite());

return suite;

}

Page 19: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Como funciona

As asserções causam falhas quando os resultados não estiverem corretos test.framework.AssertionFailedError

Cada instância de TestCase será utilizada para executar um dos métodos de teste As alterações que ele fizer ao estado do objeto

não afetarão as demais classes

Page 20: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Boas Práticas

Escreva o código de testes antes da implementação. Dessa forma, você terá uma implementação dirigida por contrato

Teste somente métodos que podem estar quebrados (assim, métodos get e set não devem ser testados na maioria dos casos)

Teste sempre que possível

Page 21: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Testes conduzem o projeto OO

1. Decida o que o componente deve fazer.

2. Projeto o componente (sua interface pública)

3. Escreva os testes de unidade

4. Escreva o componente até que todos os testes passem

5. Escreva teste para outras possibilidade de falha

6. Escreva testes antes de corrigir um bug

7. Execute todos os testes antes de publicar uma alteração (regressão)

Page 22: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

Referências

http://www.junit.org

Page 23: J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.

JUnit

Um Framework Para Testes