Eng.ª do Software - 10. Testes de software

12,703 views
12,520 views

Published on

Testes de software. Unidade de Engenharia do Software I para o curso de METI no ISCTE-IUL no 2.º semestre do ano lectivo de 2009/2010.

Published in: Education
1 Comment
7 Likes
Statistics
Notes
  • Muito bom! :D
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
12,703
On SlideShare
0
From Embeds
0
Number of Embeds
43
Actions
Shares
0
Downloads
496
Comments
1
Likes
7
Embeds 0
No embeds

No notes for slide

Eng.ª do Software - 10. Testes de software

  1. 1. Engenharia do Software I<br />Manuel Menezes de Sequeira<br />DCTI, ISCTE-IUL<br />Manuel.Sequeira@iscte.pt, D6.02<br />As apresentações desta série baseiam-se nas apresentações disponibilizadas por IanSommerville, tendo sido alteradas e adaptadas primeiro por  Anders Lyhne Christensen e finalmente por Manuel Menezes de Sequeira.<br />
  2. 2. Na aula anterior<br />Verificação e validação<br />Planeamento da verificação e validação<br />Inspecções de software<br />Análise estática automática<br />Desenvolvimento de software em sala limpa<br />2009/2010<br />2<br />Engenharia do Software I<br />
  3. 3. Testes de software<br />2009/2010<br />3<br />Engenharia do Software I<br />
  4. 4. Sumário<br />Testes de software<br />Teste de sistemas<br />Teste de componentes<br />Desenho de casos de teste<br />Automatização de testes<br />2009/2010<br />4<br />Engenharia do Software I<br />
  5. 5. Objectivos<br />Discutir diferença entre testes de validação e de defeitos<br />Descrever princípios de testes de sistema e de componentes<br />Descrever estratégias para gerar casos de teste para sistemas<br />Compreender características essenciais das ferramentas de automatização de testes<br />2009/2010<br />5<br />Engenharia do Software I<br />
  6. 6. Processo de testes<br />Testes de componentes<br />Teste de componentes individuais do programa<br />Usualmente responsabilidade de desenvolvedor do componente (excepto por vezes em sistemas críticos)<br />Testes derivados da experiência do desenvolvedor<br />Testes de sistema<br />Teste sistemas ou um subsistemas (compostos de componentes)<br />Responsabilidade de equipa de testes independente<br />Testes baseados em especificação do sistema<br />2009/2010<br />Engenharia do Software I<br />6<br />
  7. 7. Fases de teste<br />2009/2010<br />7<br />Engenharia do Software I<br />Testes de componentes<br />Testes de sistemas<br />Desenvolvedor do software<br />Equipa de testes independente<br />
  8. 8. Testes de defeitos<br />Objectivo é descobrir defeitos em programas<br />Teste com sucesso leva programa a comportamento anómalo<br />Mostram presença e não ausência de defeitos<br />2009/2010<br />Engenharia do Software I<br />8<br />
  9. 9. Objectivos do processo de testes<br />Testes de validação<br />Demonstra a desenvolvedor e cliente do sistema que software cumpre requisitos<br />Teste com sucesso mostra que sistema se comporta como pretendido<br />Testes de defeitos<br />Descobre erros ou defeitos no software levando a comportamento incorrecto ou que não corresponde à especificação<br />Teste com sucesso leva sistema a comportar-se incorrectamente, assim expondo um defeito no sistema<br />2009/2010<br />Engenharia do Software I<br />9<br />Um teste que não descubra erros ou defeitos é inconclusivo.<br />
  10. 10. Processo de testes de software<br />2009/2010<br />10<br />Engenharia do Software I<br />Casos de teste<br />Dados de teste<br />Resultados dos testes<br />Relatórios dos testes<br />Desenhar casos de teste<br />Preparar dados de teste<br />Executar programa com dados de teste<br />Comparar resultado com casos de teste<br />
  11. 11. Políticas de testes<br />Testes exaustivos podem mostrar ausência de defeitos<br />Testes exaustivos geralmente impossíveis<br />Políticas de testes definem abordagem a usar na escolha de testes de sistema<br />Testar todas funcionalidades acessíveis em menus<br />Testar combinações de funcionalidades acedidas no mesmo menu<br />Quando for necessário introduzir dados do utilizador, testar todas funcionalidades com entradas correctas e incorrectas<br />2009/2010<br />Engenharia do Software I<br />11<br />
  12. 12. Testes de sistemas<br />Envolvem integrar componentes de modo a formarem sistema ou subsistema<br />Podem envolver testar incremento a fornecer a cliente<br />2009/2010<br />Engenharia do Software I<br />12<br />
  13. 13. Fases dos testes de sistemas<br />2009/2010<br />Engenharia do Software I<br />13<br />
  14. 14. Testes de integração<br />Envolve<br />Construir sistema a partir de componentes<br />Ir testando para revelar problemas gerados por interacção entre componentes<br />Integração deve ser incremental para simplificar localização de erros<br />2009/2010<br />Engenharia do Software I<br />14<br />
  15. 15. Tipos de integração<br />2009/2010<br />Engenharia do Software I<br />15<br />
  16. 16. Testes de integração incrementais<br />2009/2010<br />16<br />Engenharia do Software I<br />T1<br />T1<br />T1<br />A<br />A<br />A<br />T2<br />T2<br />T2<br />B<br />B<br />B<br />T3<br />T3<br />T3<br />C<br />C<br />T4<br />T4<br />D<br />T5<br />Sequência de testes 3<br />Sequência de testes 2<br />Sequência de testes 1<br />
  17. 17. Abordagens aos testes<br />2009/2010<br />Engenharia do Software I<br />17<br />Descendente<br />Facilita validação arquitectónica, i.e., descoberta de erros na arquitectura do sistema<br />Permite demonstração limitada do sistema mesmo em fases iniciais do desenvolvimento<br />Observação dos testes pode exigir código extra<br />Ascendente<br />Facilita muitas vezes implementação dos testes<br />Observação dos testes pode exigir código extra<br />
  18. 18. Testes de lançamento<br />Processo de teste do lançamento do sistema a fornecer a clientes<br />Objectivo principal: aumentar confiança de fornecedor no cumprimento de requisitos<br />Normalmente de caixa preta ou funcionais<br />Baseados só na especificação do sistema<br />Testadores não conhecem implementação<br />2009/2010<br />Engenharia do Software I<br />18<br />
  19. 19. Testes de caixa preta<br />2009/2010<br />19<br />Engenharia do Software I<br />Dados de entrada do teste<br />Entradas causadoras de anomalias<br />Sistema<br />Resultados de saída do teste<br />Resultados reveladores de defeitos<br />
  20. 20. Linhas de orientação para testes<br />Escolher entradas<br />Gerando todas as mensagens de erro<br />Levando a transbordamentos de memória<br />Repetir várias vezes mesma entrada ou sequência de entradas<br />Forçar geração de saídas inválidas<br />Forçar cálculo de valores além dos limites<br />2009/2010<br />Engenharia do Software I<br />20<br />Dicas para equipa escolher testes que revelem defeitos no sistema.<br />
  21. 21. Cenário de teste<br />Na Escócia, uma estudante está a estudar a história americana e foi convidada a escrever um artigo sobre a “mentalidade de fronteira no oeste americano de 1840 a 1880”. Para o fazer, precisa de encontrar fontes bibliográficas numa série de bibliotecas. Assim, autentica-se no sistema LIBSYS e usa o mecanismo de pesquisa para descobrir se pode aceder a documentos originais da época. Descobre fontes bibliográficas em várias bibliotecas universitárias dos EUA e descarrega cópias de algumas dessas fontes. No entanto, para um dos documentos é necessário que a sua universidade confirme que ela é realmente estudante e que a fonte será utilizada para fins não comerciais. A estudante usa o mecanismo do LIBSYS que permite solicitar essa autorização e regista o seu pedido. Se o pedido for concedido, o documento será transferido para o servidor da biblioteca e impresso. Ela receberá então uma mensagem do LIBSYS dizendo que irá receber uma mensagem de correio electrónico assim que o documento impresso estiver disponível para recolha.<br />2009/2010<br />Engenharia do Software I<br />21<br />
  22. 22. Testes de sistema<br />Testar mecanismo de autenticação usando credenciais válidas e inválidas para verificar se utilizadores com credenciais válidas são aceites e se utilizadores com credenciais inválidas são rejeitados.<br />Testar mecanismo de pesquisa usando diferentes interrogações a diferentes fontes de informação para verificar se mecanismo de facto encontra documentos.<br />Testar mecanismo de apresentação para verificar se informação é apresentada correctamente.<br />Testar mecanismo de pedido de autorização para descarregamento.<br />Testar resposta via correio electrónico que indica que documento descarregado está disponível.<br />2009/2010<br />Engenharia do Software I<br />22<br />
  23. 23. Casos de uso<br />Podem ser base para obtenção de testes de sistema<br />Ajudam a identificar operações a testar e ajudam a conceber os casos de teste necessários<br />A partir de diagrama de sequência associado, indentificar entradas e saídas a usar nos testes<br />2009/2010<br />Engenharia do Software I<br />23<br />
  24. 24. Diagrama de sequência da recolha de dados meteorológicos<br />2009/2010<br />24<br />Engenharia do Software I<br />sd data collection<br />: CommunicationsController<br />: WeatherStation<br />: WeatherData<br />getReport()<br />acknowledge()<br />getReport()<br />getSummary()<br />acknowledge()<br />
  25. 25. Testes de desempenho<br />Testes de lançamento podem envolver teste a propriedades emergentes<br />Testes de desempenho<br />Testes de fiabilidade<br />Planear série de testes com carga crescente até desempenho ficar inaceitável<br />2009/2010<br />Engenharia do Software I<br />25<br />
  26. 26. Testes de estresse<br />Sujeitam sistema a cargas superiores a máximo previsto tentando revelar defeitos<br />Aferem comportamento em caso de falha<br />Sistema não pode falhar catastroficamente<br />Falhas não podem levar a perdas inaceitáveis de serviço ou dados<br />Muito relevantes para sistemas distribuídos que podem sofre degradação séria perante rede sobrecarregada<br />2009/2010<br />Engenharia do Software I<br />26<br />
  27. 27. Testes de componentes ou testes unitários<br />Processo de testar isoladamente componentes individuais<br />É processo de teste de defeitos<br />2009/2010<br />Engenharia do Software I<br />27<br />
  28. 28. Componentes ou unidades (de modularização)<br />Rotinas<br />Funções e procedimentos isolados<br />Operações de classes e seus objectos<br />Classes e respectivas propriedades e operações<br />Componentes compósitos com interface definida para aceder à sua funcionalidade<br />2009/2010<br />Engenharia do Software I<br />28<br />
  29. 29. Testes de classes (de objectos)<br />Cobertura completa de classe por testes implica<br />Testar todas as operações<br />Alterar e inspeccionar todas as propriedades<br />Fazer objectos passar por todos os estados representativos<br />Fazer objectos passar por todos os possíveis fluxos de controlo<br />Herança dificulta desenho de testes para classes, pois informação está disseminada<br />2009/2010<br />Engenharia do Software I<br />29<br />
  30. 30. Interface de estação meteorológica<br />2009/2010<br />30<br />Engenharia do Software I<br />WeatherStation<br />+ reportWeather()<br />+ calibrate(instruments)<br />+ test()<br />+ startup(instruments)<br />+ shutdown(instruments)<br />
  31. 31. Teste da estação meteorológica<br />Necessário definir casos de teste para<br />reportWeather()<br />calibrate()<br />test()<br />startup()<br />shutdown()<br />2009/2010<br />Engenharia do Software I<br />31<br />
  32. 32. Teste da estação meteorológica<br />Usando modelo de transição de estados<br />Identificar sequências de transição a testar<br />Identificar sequências de eventos que as causem<br />Exemplo<br />Esperando<br />Calibrando<br />Testando<br />Transmitindo<br />Esperando<br />2009/2010<br />Engenharia do Software I<br />32<br />
  33. 33. Testes de interfaces<br />Detectar anomalias devidas a<br />Erros de interface<br />Suposições inválidas acerca das interfaces<br />Especialmente importantes em desenvolvimento orientado para objectos (classes de objectos definidas pela interface)<br />2009/2010<br />Engenharia do Software I<br />33<br />
  34. 34. Testes de interfaces<br />2009/2010<br />34<br />Engenharia do Software I<br />Casos de teste<br />B<br />A<br />C<br />
  35. 35. Tipos de interfaces<br />2009/2010<br />Engenharia do Software I<br />35<br />
  36. 36. Erros de interface<br />2009/2010<br />Engenharia do Software I<br />36<br />
  37. 37. Linhas de orientação para testes de interface<br />Invocar rotinas com valores extremos dos argumentos<br />Invocar rotinas com argumentos nulos onde parâmetros forem ponteiros ou referências<br />Tentar fazer os componentes falhar<br />Fazer testes de estresse em sistemas com passagem de mensagens<br />Variar ordem de activação de componentes em sistemas com memória partilhada<br />2009/2010<br />Engenharia do Software I<br />37<br />
  38. 38. Desenho de casos de teste<br />Desenho de casos de teste (entradas e saídas) usados para testar sistema<br />Objectivo: criar conjunto de testes eficazes na validação e nos testes de defeitos<br />Abordagens<br />Testes baseados em requisitos<br />Testes de partição<br />Testes estruturais<br />2009/2010<br />Engenharia do Software I<br />38<br />
  39. 39. Testes baseados em requisitos<br />Requisitos têm de ser testáveis<br />Técnica de testes de validação<br />Conjunto de testes derivado para cada requisito<br />2009/2010<br />Engenharia do Software I<br />39<br />Princípio geral da engenharia de requisitos<br />
  40. 40. Requisitos do LIBSYS<br />2009/2010<br />Engenharia do Software I<br />40<br />
  41. 41. Testes do LIBSYS<br />2009/2010<br />Engenharia do Software I<br />41<br />
  42. 42. Testes de partições<br />Entradas e saídas muitas vezes em diferentes classes cujos membros estão relacionados<br />Cada classe é partição ou domínio de equivalência para cujos membros comportamento do programa é equivalente<br />Devem escolher-se casos de teste em cada partição<br />2009/2010<br />Engenharia do Software I<br />42<br />
  43. 43. Partições de equivalência<br />2009/2010<br />43<br />Engenharia do Software I<br />entradas válidas<br />entradas inválidas<br />Sistema<br />saídas<br />
  44. 44. Partições de equivalência<br />2009/2010<br />44<br />Engenharia do Software I<br />3<br />11<br />4<br />10<br />7<br />Número de entradas<br />Menos de 4<br />Entre 4 e 10<br />Mais de 10<br />9 999<br />100 000<br />10 000<br />99 999<br />50 000<br />Valores da entrada<br />Menos de 10 000<br />Entre 10 000 e 99 999<br />Mais de 99 999<br />
  45. 45. Especificação de rotina de pesquisa<br />procedure Search(element : inElement_T;<br /> sequence : inarray (Integer range <>) ofElement_T;<br />elementFound : inout Boolean;<br /> index : inout Integer) is<br />with<br /> Pre => -- the sequence has at least one element<br />sequence'FIRST <= sequence'LAST,<br /> Post => <br /> -- the element is found and is referenced by index<br /> (elementFoundand sequence(index) = element) or<br /> -- the element is not in the sequence<br /> (notelementFoundand<br />not (exists i, sequence'FIRST <= i <= sequence'LAST,<br /> sequence(i) = element));<br />2009/2010<br />Engenharia do Software I<br />45<br />Artificial…<br />
  46. 46. Partição das entradas<br />Entradas<br />Que não cumprem a pré-condição<br />Que cumprem a pré-condição<br />Em que o elemento ocorre na sequência<br />Em que o elemento não ocorre na sequência<br />2009/2010<br />Engenharia do Software I<br />46<br />
  47. 47. Linhas de orientação para testes (sequências)<br />Usar sequências vazias<br />Usar sequências com um único elemento<br />Usar sequências com diferentes comprimentos em diferentes testes<br />Forçar acesso a primeiro elemento, último elemento e elemento central<br />2009/2010<br />Engenharia do Software I<br />47<br />
  48. 48. Partição das entradas<br />2009/2010<br />Engenharia do Software I<br />48<br />
  49. 49. Casos de teste<br />2009/2010<br />Engenharia do Software I<br />49<br />
  50. 50. Testes estruturais<br />Também conhecidos por testes de caixa branca<br />Derivação de casos de teste de acordo com estrutura do programa<br />Conhecimento do programa usado para identificar casos de teste adicionais<br />Objectivo é exercitar todas instruções do programa e não todos possíveis caminhos<br />2009/2010<br />Engenharia do Software I<br />50<br />
  51. 51. Testes estruturais<br />2009/2010<br />51<br />Engenharia do Software I<br />Dados de teste<br />derivar<br />testar<br />Código do componente<br />Resultados do teste<br />
  52. 52. Especificação de rotina de pesquisa binária<br />procedureSearchIncreasing(element : inElement_T;<br /> sequence : inarray (Integer range <>) ofElement_T;<br />elementFound : inout Boolean;<br /> index : inout Integer) is<br />with<br /> Pre => -- the sequence is increasing<br /> (foralli, sequence'FIRST <= i < sequence'LAST,<br /> sequence(i) <= sequence(i + 1)),<br /> Post =><br /> -- the element is found and is referenced by index<br /> (elementFoundand sequence(index) = element) <br />or<br /> -- the element is not in the sequence<br /> (notelementFoundand<br />not (exists i, sequence'FIRST <= i <= sequence'LAST,<br /> sequence(i) = element));<br />2009/2010<br />Engenharia do Software I<br />52<br />
  53. 53. Partição das entradas<br />Entradas<br />Que não cumprem a pré-condição<br />Que cumprem a pré-condição<br />Em que o elemento ocorre na sequência<br />Em que o elemento não ocorre na sequência<br />Sequência vazia<br />Sequência com um único elemento<br />Sequência com um número par de elementos<br />Sequência com um número ímpar de elementos<br />2009/2010<br />Engenharia do Software I<br />53<br />
  54. 54. Partições de equivalência<br />2009/2010<br />54<br />Engenharia do Software I<br />Centro<br />Primeiro<br />Último<br />Centro + 1<br />Centro - 1<br />Inferiores<br />Superiores<br />Classes de equivalência<br />
  55. 55. Casos de teste<br />2009/2010<br />Engenharia do Software I<br />55<br />
  56. 56. Teste de caminhos<br />Objectivo: assegurar que conjunto de casos de teste garante que cada caminho é executado pelo menos uma vez<br />Começar por obter grafo de fluxo do programa mostrando nós representando decisões do programa e arcos representando o fluxo de controlo<br />Instruções com condições são por isso nós do grafo de fluxo de controlo<br />2009/2010<br />Engenharia do Software I<br />56<br />
  57. 57. Implementação da pesquisa binária<br />public <T extends Comparable<T>> <br />void search(final T element, final List<T> sequence) { <br /> 1 indexOfFoundElement = -1;<br /> 2 found = false;<br /> 3 int left = 0;<br /> 4 int right = sequence.size() - 1;<br /> 5 while(left <= right) {<br /> 6 final int middle = (left + right) / 2;<br /> 7 int comparison = sequence.get(middle).compareTo(element);<br /> 8 if(comparison == 0) {<br /> 9 found = true;<br />10 indexOfFoundElement = middle;<br />11 return;<br />12 } else if(comparison < 0)<br />13 left = middle + 1;<br /> else<br />14 right = middle - 1;<br /> }<br />15 }<br />2009/2010<br />Engenharia do Software I<br />57<br />
  58. 58. Grafo de fluxo da pesquisa binária<br />2009/2010<br />58<br />Engenharia do Software I<br />1<br />2<br />3<br />4<br />left > right<br />5<br />left <= right<br />6<br />comparison < 0<br />7<br />13<br />comparison == 0<br />comparison != 0<br />8<br />9<br />12<br />14<br />10<br />comparison > 0<br />11<br />15<br />
  59. 59. Caminhos independentes<br />2009/2010<br />59<br />Engenharia do Software I<br />1<br />1<br />1, 2, 3, 4, 5, 15<br />1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11<br />1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 5, …<br />1, 2, 3, 4, 5, 6, 7, 8, 12, 14, 5, …<br />2<br />2<br />3<br />3<br />4<br />4<br />left > right<br />5<br />5<br />left <= right<br />6<br />6<br />comparison < 0<br />7<br />7<br />13<br />13<br />comparison == 0<br />comparison != 0<br />8<br />9<br />12<br />8<br />9<br />12<br />14<br />14<br />10<br />comparison > 0<br />10<br />11<br />15<br />11<br />15<br />
  60. 60. Caminhos independentes<br />Desenvolver casos de teste que levem a execução de cada um dos caminhos<br />Um analisador dinâmico de programas pode ser usado para verificar que todos os caminhos foram executados<br />2009/2010<br />Engenharia do Software I<br />60<br />
  61. 61. Automatização de testes<br />Testar é caro<br />Bancadas de trabalho para testes ajudam a automatizar o processo<br />Bancadas de trabalho para testes<br />Ferramentas para poupar tempo e custo dos testes<br />Sistemas como JUnit suportam execução automática de testes<br />Maioria são sistemas abertos, assim suportando especificidades das organizações<br />Por vezes difíceis de integrar com bancadas de trabalho fechadas para desenho e análise<br />2009/2010<br />Engenharia do Software I<br />61<br />
  62. 62. Uma bancada de trabalho para testes<br />2009/2010<br />62<br />Engenharia do Software I<br />Gerador de dados de teste<br />Especificação<br />Oráculo<br />Dados de teste<br />Gestor de testes<br />Código fonte<br />Programa em teste<br />Resultados dos testes<br />Previsões dos testes<br />Analisador dinâmico<br />Relatório de execução<br />Simulador<br />Comparador de ficheiros<br />Relatório dos resultados dos testes<br />Gerador de relatórios<br />
  63. 63. Adaptação da bancada de trabalho para testes<br />Scripts para simuladores de interfaces com o utilizador e padrões para geradores de dados<br />Preparação manual de saídas dos testes para posterior comparação<br />Desenvolvimento de comparadores de ficheiros especializados<br />2009/2010<br />Engenharia do Software I<br />63<br />
  64. 64. A reter<br />Testes<br />Revelam erros em sistema<br />Não demonstram ausência de erros<br />De componentes: desenvolvedores<br />De sistema: outra equipa<br />De integração: incrementos a sistema<br />De lançamento: sistema a fornecer<br />Desenhados recorrendo a experiência e linhas de orientação<br />2009/2010<br />Engenharia do Software I<br />64<br />
  65. 65. A reter<br />Testes de interface revelam defeitos em interfaces de componentes compósitos<br />Partições de equivalência para descobrir casos de teste – casos em partição têm comportamento equivalente<br />Análise estrutural analisa programa e deriva casos de teste<br />Automatização de testes reduz custos através de múltiplas ferramentas software<br />2009/2010<br />Engenharia do Software I<br />65<br />
  66. 66. A ler<br />IanSommerville, Software Engineering, 8.ª edição, Addison-Wesley, 2006<br />Capítulo 23<br />2009/2010<br />Engenharia do Software I<br />66<br />

×