Beruflich Dokumente
Kultur Dokumente
wilkerson.andrade@gmail.com
Sumrio
Introduo ao Teste de Software Teste Funcional JUnit Teste Estrutural EMMA
Introduo
Por que testar?
Avaliar a qualidade ou aceitabilidade Descobrir problemas
Objetivos:
Mostrar que a aplicao faz o esperado Mostrar que a aplicao no faz mais do que o esperado
Teste no debugging
Debugging o processo de encontrar/localizar defeitos
Terminologia
Erro
Engano ou omisso causado por uma ao humana Ocorre durante a codificao Tende a ser propagado
Falta
Representao de um erro Sinnimo de defeito ou bug Falta de comisso - representao incorreta Falta de omisso representao ausente
Terminologia
Falha
Impossibilidade de um sistema ou componente de executar uma funo requisitada Ocorre quando um software com falta executado evidenciada atravs de sada incorreta, trmino anormal, no satisfao de restries de tempo e espao
Especificao de Requisitos
Falta Projeto
Soluo de faltas
Erro
Isolao de faltas
Erro Falta
Implementao
Classificao de faltas
Caso de Teste
Comportamento a ser testado, normalmente definido em termos de estmulos de entrada e respostas esperadas Especifica o que se quer testar:
Pr-estado da implementao e seu ambiente Condies Entradas de teste Resultados esperados
Caso de Teste
Resultados esperados incluem:
Mensagens geradas pela implementao Excees Valores retornados Estado esperado da implementao e seu ambiente
Caso de Teste
ID do Caso de Teste
Propsito Pr-condies
Teste X Comportamento
Teste fundamentalmente associado a comportamento A viso comportamental ortogonal em relao a viso estrutural Desenvolvedores possuem uma viso estrutural Os documentos bsicos so escritos por desenvolvedores Testadores geram os testes a partir dos documentos gerados
Teste X Comportamento
Especificao (esperado)
S P
Programa (observado)
Casos de Teste
[Jorgensen, 2002] T
Filosofia:
Teste o quanto antes Teste sempre Teste o suficiente
Casos de teste podem ser identificados mais cedo durante a fase de requisitos Analistas e projetistas podem expressar e entender melhor requisitos e assegurar que so testveis
Testabilidade
Propriedade que indica a facilidade e preciso na avaliao dos resultados de um teste Um produto testvel se oferece suporte a:
Gerao de testes Implementao Verificao de seus resultados de forma precisa
Testabilidade
Requisitos constituem a fonte bsica para a gerao de testes de sistema e de aceitao Testadores devem garantir que os documentos gerados propiciam um nvel suficiente de entendimento para a gerao de testes e que sejam corretos, completos, consistentes e no-ambguos
Dimenses de Teste
Quem executa os testes?
Equipe dedicada e/ou desenvolvedores
Dimenses de Teste
Quando o teste ser executado?
Escalonamento dentro do processo de desenvolvimento
Vantagens de Teste
Se conduzidos de forma rigorosa:
Contribuem para aumentar a confiabilidade do software Evidenciar caractersticas de qualidade Verificar o software no ambiente operacional
Limitaes de Teste
Nmero de possveis combinaes muito grande ou infinito:
Espao de Estado/Entrada Seqncias de Execuo (branching e dynamic binding) Sensibilidade a Falta habilidade do cdigo esconder faltas Correo coincidental um cdigo correto pode produzir resultados corretos para algumas entradas
Limitaes de Teste
Prova de Correo = Teste Exaustivo Certos aspectos podem ser impossveis de implementar
Situaes em que o sistema no pode produzir uma resposta indecibilidade
No pode verificar requisitos diretamente Testes com pouco valor podem ser produzidos se requisitos esto incorretos ou incompletos
Teste Funcional
Teste Funcional
Tambm conhecido como Teste Black-Box Parte do pressuposto que qualquer programa pode ser visto como uma funo que mapeia valores do domnio de entrada em valores do contradomnio O principal objetivo verificar se uma dada implementao est de acordo com a sua respectiva especificao A nica informao usada a especificao do software
Teste Funcional
Vantagens
Os casos de teste so independentes de implementao O desenvolvimento dos casos de teste podem ocorrer paralelamente com o desenvolvimento do software
Desvantagens
Dificuldade em quantificar a atividade de teste No se pode garantir que partes essenciais ou crticas do software foram executadas
Teste Funcional
As principais tcnicas de teste funcional:
Testes derivados de especificao Partio por Equivalncia Anlise de Valores Limites Teste Baseado em Estado-Transio
Teste Funcional
Testes Derivados de Especificao
Baseado na especificao, os testes so gerados de acordo com as vrias expresses contidas na mesma No se pode precisar que as expresses contidas na mesma refletiro as expresses contidas no cdigo, mas isso tende a ser uma prtica comum em vrios trechos
Teste Funcional
Partio por Equivalncia
Significa identificar parties dos domnios das entradas e sadas onde os elementos, supostamente, fariam com que o sistema se comportasse da mesma forma Parties so identificadas no somente em parmetros de funes, mtodos, etc., mas tambm em dados acessados, tempo, seqncia de entradas e sadas bem como em estados
Teste Funcional
Anlise de Valores Limites
Esta tcnica se baseia na hiptese de que erros geralmente so encontrados nas regies limites das parties Ex.: uma funo que trabalha no domnio dos inteiros possui como um valor limite o 0 Neste ponto estamos interessados em procurar por erros
(i)
(ii)
Teste 11
a 1
100 100
12 13 14 15
Consideraes
Teste funcional se preocupa com a satisfao de contratos (especificaes)
Dependendo do tipo e do nvel de teste
Testes funcionais so executados nas fases de desenvolvimento, principalmente, e de deployment (aceitao) possvel automatizar a gerao tanto dos testes quanto dos casos de teste, desde que se tenha especificaes formalizadas O ferramental existente para automatizao de testes funcionais bastante abrangente
Introduo
JUnit um framework open source usado para o desenvolvimento e execuo de testes escritos em Java Desenvolvido por Eric Gamma e Kent Beck A maioria das IDEs incorporam o JUnit dentro de seu ambiente de desenvolvimento
JBuilder JDeveloper Netbeans Eclipse
Como instalar?
Incluir o arquivo junit.jar no classpath
Use asseres do JUnit para verificar os resultados do teste e para causar falhas se o resultado no for o esperado
Descrio Verifica se uma condio verdade Verifica se uma condio falsa Verifica se dois objetos so iguais Verifica se um objeto no null Verifica se um objeto null Verifica se dois objetos apontam para um mesmo objeto Verifica se dois objetos no apontam para um mesmo objeto Faz com que um teste falhe
Como funciona?
Para cada mtodo de teste public void xxx(), a ferramenta executa: O mtodo anotado com @Before O prprio mtodo xxx() O mtodo anotado com @After
Um teste pode terminar, falhar ou causar uma exceo
Anotaes
Anotao @BeforeClass @AfterClass @Before @After @Test @Ignore Descrio
Mtodos invocados antes da execuo da sute de teste Mtodos invocados aps a execuo da sute de teste Mtodos que so executados antes de todos os testes Mtodos que so executados depois de todos os testes Mtodos reais de teste Testes que ainda no foram implementados podem ser desabilitados temporariamente
Fixture
So os dados utilizados por vrios testes
public class CollectionNamesTest { protected Collection<String> stringCollection; @Before public void setUp() throws Exception { stringCollection = new ArrayList<String>(); stringCollection.add("Maria"); } @Test public void testLength(){ assertEquals(1, stringCollection.size()); } @Test public void testToString(){ assertEquals("[Maria]", stringCollection.toString()); } ...
public void testInvalidCode() { try { Product product = new Product(-2); fail("Should have caused Exception!"); } catch (Exception e) { assertNotNull(e.getMessage()); }
TestSuite
Representa uma composio de testes Boa prtica: crie uma classe AllTests em cada pacote de testes
@RunWith(Suite.class) @SuiteClasses({CelsiusTemperatureTest.class, FahrenheitTemperatureTest.class}) public class AllTests { }
TestSuite
Boa prtica: crie uma classe para a execuo de todos os testes da sua aplicao
Inclua nesta classe as suites de teste de cada pacote
@RunWith(Suite.class) @SuiteClasses({tempconverter.app.AllTests.class, tempconverter.scales.AllTests.class}) public class AllTests { }
Teste Estrutural
Teste Estrutural
O principal objetivo deste tipo de teste testar detalhes procedimentais Os requisitos de teste so extrados de uma implementao em particular Os critrios desta tcnica utilizam grafo de fluxo de controle (grafo de programa) tambm conhecido como teste WhiteBox
Teste Estrutural
Vantagens
Testa partes do software que no esto na especificao
Desvantagens
No reconhece comportamentos que esto na especificao mas no foram implementados
Teste Estrutural
As principais tcnicas de teste estrutural:
Baseada em Fluxo de Controle Teste de Comandos Teste de Ramos Teste de Condio Teste de Condio Mltipla Baseada em Fluxo de Dados Baseada na Complexidade Critrio de MacCabe (Caminhos Base)
Teste Estrutural
Grafo de Fluxo de Controle
Consiste de um grafo direcionado Os ns representam blocos de comandos
Um bloco de comando um conjunto de expresses tal que se a primeira expresso for executada, todas as demais tambm o so
Os arcos representam precedncia ou transferncia de controle A representao de fluxo de controle permite uma anlise independente da funo
Teste Estrutural
Grafo de Programa
Representaes bsicas
Teste Estrutural
Exemplo 1: programa com um caminho
... { double x = 10.0; 1 double r = sqr(x); 2 return r; 3 }
1
Teste Estrutural
Exemplo 2: programa com dois caminhos
... { double x = readDouble(); 1 String msg = ; 2 if(x >= 0){ 3 msg = sqr(x) = + sqr(x); 4 } else { msg = Error; 5 } System.out.println(msg); 6 }
1
3 4
6
Teste Estrutural
Exemplo 3: programa com loop
... { double x = readDouble(); 1 String msg = ; 2 while(x != 0.0){ 3 if(x >= 0){ 4 msg = sqr(x) = + sqr(x); 5 } else { msg = Error; 6 } System.out.println(msg); 7 } System.out.println(FIM); 8 }
1
2
3
4
5
7 8
1. Program Triangle 5 6 7 8 4 2. Dim a,b,c AS Integer 3. Dim IsATriangle As Boolean #Step 1: Get Input 9 4. Output(Enter 3 integers) 5. Input(a,b,c) 10 11 6. Output(Side A is , a) 7. Output(Side B is , b) 12 8. Output(Side C is , c) #Step 2: Is A Triangle? 13 9. If (a<b+c) AND (b<a+c) AND (c<a+b) 10. Then IsATriangle = True 21 14 11. Else IsAtriangle = False 12.EndIf 15 16 #Step 3: Determine Triangle Type 13.If IsATriangle 18 17 14. Then If (a=b) AND (b=c) 15. Then Output(Equilateral) 19 16. Else If (a<>b) AND (a<>c) AND (b<>c) 17. Then Outpput(Scalene) 20 18. Else Output(Isosceles) 19. EndIf 20. EndIf 22 21. Else Output(Not a Triangle) 22.EndIf 23 23.End Triangle
Teste Estrutural
Teste de Comandos
O critrio que todos os comandos do programa sejam executados pelo menos uma vez Em outras palavras, deve-se percorrer todos os ns do grafo pelo menos uma vez
Teste Estrutural
Teste de Ramos
O critrio de teste exercitar todas as sadas verdadeiro e falso de todas as decises Em outras palavras, deve-se percorrer todos os arcos do grafo pelo menos uma vez Cobre o Teste de Comandos
Teste Estrutural
Teste de Condio
O critrio de teste que todas as condies de uma deciso requeiram os valores verdadeiro e falso pelo menos uma vez (se possvel)
Teste Estrutural
Teste de Fluxo de Dados
Estabelece requisitos de teste que seguem o modelo de dados usados dentro do programa Requerem que sejam testadas as interaes que envolvam definies de variveis e subseqentes referncias a estas definies Torna os casos de teste mais rigorosos
Teste Estrutural
Teste de Fluxo de Dados
Cada ocorrncia de uma varivel dentro de um programa pode ser classificada como sendo uma das seguintes: def: definio c-use: uso-computacional p-use: uso-predicativo
Teste Estrutural
Teste de Fluxo de Dados
Definio: quando uma varivel definida atravs de uma leitura ou quando ela aparece do lado esquerdo de um comando de atribuio, isto , dado um valor varivel Uso-computacional: quando a varivel usada na avaliao de uma expresso ou em um comando de sada Uso-predicativo: quando a varivel ocorre em um predicado e portanto, afeta o fluxo de controle do programa
Teste Estrutural
Critrios do Teste de Fluxo de Dados:
Todas-Definies: requer que cada definio de varivel seja exercitada pelo menos um vez, seja por c-uso ou por p-uso Todos-Usos: requer que todas as associaes entre uma definio de varivel e seus subseqentes usos (c-usos e p-usos) sejam exercitadas pelos casos de teste, atravs de pelo menos um caminho livre de definio, ou seja, um caminho onde a varivel no redefinida
Consideraes
uma tcnica mais propensa a automao Um problema a impossibilidade, em geral, de determinar se um caminho executvel e quais valores para faz-lo Problemas triviais podem no ser detectados por critrios de fluxo de controle Teste Estruturais devem ser usados com Testes Funcionais
Consideraes
Analisadores de cobertura podem ser usados para unir as duas abordagens de teste Essas ferramentas geram mtricas de cobertura dos casos de teste Quando deveramos parar de testar?
Quando o tempo esgotar-se Quando os testes no encontram mais faltas Quando no se consegue identificar mais casos de teste Quando a mtrica de cobertura escolhida for alcanada
Introduo
EMMA uma ferramenta open source usada para medir e gerar relatrios de cobertura de cdigo Java Verifica quais partes da aplicao esto sendo exercitadas pelo seu conjunto de testes Desenvolvida por Vlad Roubtsov
Caractersticas
EMMA instrumenta classes de maneira offline e on the fly Tipos de cobertura suportados:
Classe Mtodo Linha Bloco
Caractersticas
Tipos de relatrio:
Texto simples HTML XML
EMMA no precisa acessar o cdigo fonte A instrumentao pode ser realizada em um .class individual ou em um .jar inteiro Pode ser integrada ao ANT
Como instalar?
Incluir o arquivo emma.jar no classpath
3 7
COVERAGE BREAKDOWN BY PACKAGE: [method, %] [block, %] [name] 100% (4/4) 91% (64/70) search 100% (3/3) 100% (52/52) default package --------------------------------------------------
Usar filtros
>java emmarun -cp out;somelib.jar -ix +Main,+search.*
Main