desenvolvimento orientado a componentes e reuso testes de software junit prof. thiago affonso de m....

42
Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana [email protected]

Upload: internet

Post on 19-Apr-2015

111 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Desenvolvimento Orientado a Componentes e Reuso

Testes de Software

JUnit

Prof. Thiago Affonso de M. N. Viana [email protected].

br

Page 2: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Por que usar testes?

• Castigo para programador• Gastos com tempo e dinheiro• Leis de Murphy– 1ª. Se uma coisa pode sair errado, sairá. – 2ª. Se tudo parece estar indo bem, é porque

você não olhou direito. – 3ª. A natureza sempre está a favor da falha

oculta.

Page 3: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Por que usar testes?

• "É de conhecimento geral entre os analistas de software que nunca se elimina o último bug de um programa. Os bugs são aceitos como uma triste realidade. Esperamos eliminá-los todos, um por um, mas nunca conseguiremos nos livrar deles."  DeMarco, Tom , Editora Campus, 91

• Desculpas:– "Depois eu escrevo o plano de testes..."– "Vamos deixar os testes para a próxima fase..."– "Na minha máquina funcionou..."– "Temos que entregar o produto na semana que vem..."

Page 4: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Falta, Erro e Falha

• Falta (Bug)

if(x > 1){

//fazer alguma coisa

}

• Erro (estado transiente que não deveria acontecer)

x = 0

• Falha (erro perceptível)– Causaria uma excecao no sistema– Tela azul

• Tolerancia a falhas– habilidade de um sistema continuar em operação mesmo na

ocorrência de falhas

Page 5: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

O que são testes de software?

• “Execuções de um programa com a intenção de encontrar erros". Myers, 1979

• Processo de testes– Foco na prevenção de erros (como outras

fases da garantia da qualidade de software); – descobrir sintomas causados por erros; – fornecer diagnósticos claros para que os

erros sejam facilmente corrigidos

Page 6: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Elementos complicadores

• erros nem sempre são óbvios; • erros diferentes podem ter a mesma

manifestação; • saber quem um programa não esta correto não

necessariamente é saber como corrigir o erro.

Page 7: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Teste x Depuração

• Objetivos do teste : mostrar que o software tem erros.

• Objetivos da depuração : encontrar a causa do erro detectado no teste, e projetar e implementar as modificações no programa para correção do erro.

Page 8: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Processo de Testes

• Etapas– Definir os processos – Medir os processos – Controlar os processos (garantir que a

variabilidade é estável e os resultados previsíveis)

– Melhorar os processos

Page 9: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Tipos de testes

• Teste Estrutural (Caixa branca)• Teste Funcional (Caixa preta)• Teste baseado em erros• Teste de unidade• Teste de sistema• Teste de regressão• Teste de aceitação

Page 10: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Teste Estrutural (caixa branca)

• Os caminhos lógicos são testados com o intuito de garantir que todos os caminhos independentes dentro de um módulo tenham sido exercitados pelo menos uma vez.

• Executa todas as decisões lógicas para valores falsos ou verdadeiros

• Executa todos os laços em suas fronteiras

• Exercita as estruturas de dados internas

Page 11: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Teste Estrutural (caixa preta)

• São usados para demonstrar que as funções dos softwares são operacionais, que a entrada é adequadamente aceita e a saída é corretamente produzida; que a integridade das informações externas é mantida.

• Atividade complementar aos testes de caixa  branca, com a finalidade de descobrir tipos/classes de erros.

• Procura descobrir erro em:– funções incorretas ou ausentes;– erros de interface;– erros nas estruturas de dados ou em acesso a bancos de

dados externos;– erros de desempenho;– erro de inicialização e término

Page 12: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Teste baseado em erros

• Consiste em incluir  propositalmente algum erro no programa e  observar o comportamento do programa com erro, comparando-o com o comportamento do programa original.

Page 13: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Teste de unidade

• Deve ser escrito pelo mesmo programador que desenvolveu o código a ser testado.

• Serve como documentação do sistema • Essencial para análise de desempenho

Page 14: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Teste de sistema

• Comparar o sistema com seus objetivos originais

• Enfatizar a análise do comportamento da estrutura hierárquica de chamadas de módulos

• Fase mais complexa, devido à quantidade de informações envolvidas

Page 15: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Teste de regressão

• Teste necessário para assegurar que modificações no programa não causaram novos erros

• baseado em arquivo de 'log'

Page 16: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Teste de aceitação

• A validação é bem sucedida quando o software funciona de uma maneira razoavelmente esperada pelo cliente . Pressman , 1995

• Expectativas dos clientes documentadas • Uso da documentação do usuário

Page 17: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Testes num nível mais prático

• Teste o código em seus limites;– Para cada pequeno trecho de código (um laço, ou if por

exemplo) verifique o seu bom funcionamento;– Tente ume entrada vazia, um único item, um vetor cheio, etc.

• Teste de pré e pós condições;– Verificar certas propriedades antes e depois de trechos de

código;• Programe defensivamente;• Sempre verificar se ocorreram erros ao abrir, ler, escrever e

principalmente fechar arquivos;• Use excecoes;• Sempre tratar as possíveis exceções;

Page 18: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Testes num nível mais prático

• Teste incrementalmente– Durante a construção do sistema;– Após testar dois pacotes independentemente teste se eles

funcionam juntos;• Teste primeiro partes simples

– Tenha certeza que partes básicas funcionam antes de prosseguir;

– Testes simples encontram erros simples;• Conheça as saídas esperadas

– Conheça a resposta certa;– Para programas mais complexos valide a saída com exemplos

conhecidos;– Numéricos - exemplos conhecidos, características;– Gráficos - exemplos, não confie apenas nos seus olhos;

Page 19: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Testes num nível mais prático

• Testar com grandes quantidades de dados– Gerados automaticamente;– Erros comuns:– Overflow nos buffers de entrada, vetores e

contadores;

• Não continue a implementação de novas características se já foram encontrados erros;– Teste em várias máquinas, compiladores e SOs(Se

possível)

Page 20: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Conclusões

• "Teste e depois codifique"  (Hetzel) 

• "Teste cedo e frequentemente" (Beizer)

Page 21: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Ferramentas

• JUnit– Framework para escrever testes

• Maiores informacoes em – http://www.testingfaqs.org/

Page 22: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

JUnit - Objetivos• Desenvolver um framework que programadores

de fato usarão para escrever testes de unidade– Testes de unidade são testes de classes

individuais• Exigir o mínimo do programador• Evitar duplicação de esforços ao escrever testes• Permitir escrever testes que retenham seu valor

ao longo do tempo

Page 23: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

JUnit: Framework Java para testes de unidade

• Framework de testes

• Integrado com várias ferramentas: Eclipse, Netbeans, ...

• Funcionamento simples e eficaz

Page 24: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Um exemplo do uso do framework

• Para testar uma classe, criamos uma classe de testes correspondente

• O mínimo que se deve fazer é o seguinte (versão 4.4+):

• Criar uma classe que tenha o nome TestNomeDaClasse.• Usar @Test ou @Test(expected= ...Exception)

antes da assinatura do método.• Fornecer um ou mais métodos com o nome test...

() sem parâmetros e sem valor de retorno.

Page 25: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

• O que foi mencionado acima é o mínimo necessário para usar o framework

• Para ter um pouco mais de controle, podemos fazer override dos seguintes métodos, se necessário:– setUp()• Usado para construir um contexto para um teste

– tearDown()• Usado para desfazer o que setUp() faz

– runTest()• Para controlar a execução de um teste particular• É raro fazer override disso

Page 26: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Escrevendo testes

• Testes de unidade: forma mais simples– Expressões num depurador– Expressões impressas em uma saída padrão– Requerem observação humana

• JUnit– Forma simples que não requer observação humana– Use a annotation @Test no método– Para verificar um valor use os métodos assertEquals

e assertNotSame

Page 27: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Escrevendo testes

• Exemplo

@Test public void testSimpleAdd() {     Money m12CHF= new Money(12, "CHF");      Money m14CHF= new Money(14, "CHF");      Money expected= new Money(26, "CHF");      Money result= m12CHF.add(m14CHF);      assertTrue(expected.equals(result)); }

Page 28: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Escrevendo testes

• Para testes similares a testes já realizados, usamos Fixture

• Útil para configurar todos os dados (conjunto de objetos) necessários a bateria de testes

• Usa annotations especiais

– @Before –inicializar toda as variáveis do método– @After – liberar os recursos alocados pelo método

• Uma vez tendo uma Fixture, pode-se escrever diversos Test Cases.

Page 29: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Escrevendo testes

public class MoneyTest {      private Money f12CHF;      private Money f14CHF;      private Money f28USD;          

@Before public void setUp() {          f12CHF= new Money(12, "CHF");          f14CHF= new Money(14, "CHF");          f28USD= new Money(28, "USD");      } }

Page 30: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Executando Testes• JUnit prove ferramentas para definir os testes a serem executados

e mostrar os resultados– org.junit.runner.JUnitCore.runClasses(TestClass1.class, ...); 

– Declare um metodo estático suite que retorna um teste public static junit.framework.Test suite() {     

return new JUnit4TestAdapter(Example.class); 

}

– Para compatibilidade com versoes anteriores do JUnit

• Exceções esperadas – verificar que o código executa com sucesso ou se comporta como esperado em situações especiais são partes do programa de teste

Page 31: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Executando Testes

new ArrayList<Object>().get(0);

@Test(expected=IndexOutOfBoundsException.class) public void empty() {      new ArrayList<Object>().get(0);  }

Page 32: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Funcionamento dos testes

• Todos os testes corretos – barra verde.

• Houve falha em algum dos testes – barra vermelha.

• Erro – foi jogada alguma exceção e não foi tratada – barra azul.

Page 33: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Componentes de um teste Junit

• Classes a serem testadas: Triangulo.javaCirculo.java

• Classe contendo os casos de testeTesteTriangulo.javaTesteCirculo.java

• Chamador dos testesTestesAceitacao.java

Page 34: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Classe com casos de teste

• Devem estender da classe

junit.framework.TestCase• Possui os métodos– setUp()– tearDown()

• Todos os casos de teste começam com “test” e não possuem parâmetros.

Page 35: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

JUnit - Casos de teste

• assert – Garante que uma determinada condição seja verdadeira. Caso não seja uma exceção é levantada(AssertionFailedError).Ex:. assert(“mensagem de erro”, var1 == var2);

• assertEquals – Verifica se dois valores passados como parâmetro são iguaisEx:. assert(“mensagem de erro”, var1, var2);

• fail – Retorna uma exceção caso execute esta linha. Ex:. fail(“não deveria passar por esta linha”);

Page 36: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Exemplos de testes

• Testando valores validos– Somente o assert é necessário.

String retorno = Triangulo.classificaTriangulo(new String[] {"4", "4", "8"});

assertEquals("Valores não deveriam formar um triângulo.","NAO É TRIÂNGULO", retorno);

Page 37: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Exemplos de testes

• Testando se operações não retornam exceções

String[] texto = new String[]{"A", "A", "A"};

try {

Sring retorno = Triangulo.classificaTriangulo(texto);

fail("Não levantou NumberFormatException para " +

trianguloString(texto));

}

Page 38: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Exemplos de testes

• Testando se operações retornam exceções indevidas

String[] texto = new String[]{"A", "A", "A"};

try {

Sring retorno = Triangulo.classificaTriangulo(texto);

} catch (NumberFormatException nfe)

{

//ok

} catch (Throwable th)

{

fail("Lançou exceção diferente de NumberFormatException

para os valores de entrada" + th.getMessage());

}

Page 39: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

SetUp

• Inicializa o ambiente para a realização dos testes

setup()caso de teste ()...setup()caso de teste()...

Page 40: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

TearDown

• Usado para “limpar” o ambiente depois da realização dos testes

setup()caso de teste ()tearDown()setup()caso de teste()tearDown()...

Page 41: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Observação Importante!

• JUnit não garante ordem de execução dos testes

• Para isso, cada caso de teste deve ser adicionado na classe chamadora.

Page 42: Desenvolvimento Orientado a Componentes e Reuso Testes de Software JUnit Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

Exercício

• Crie a classe Triangulo.java:• A classe possui um método classificar:

recebe três valores de lado e informa:– Se os lados formam um triângulo eqüilátero– Se os lados formam um triângulo isósceles– Se os lados formam um triângulo escaleno– Se os lados NÃO formam um triângulo

• Crie a classe de caso de testes• Crie uma classe que executa uma suíte de

testes