Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouCarla Imperial Tavares Alterado mais de 8 anos atrás
1
SBMF 2008, Salvador-BA, Brasil Marcelo d'Amorim damorim@cin.ufpe.br Fundamentos do Teste de Software
2
Motivação econômica Teste e depuração é responsável por + de 50% do custo total de desenvolvimento [Myers-1979, NIST-report-2002] Defeitos escapados podem ter consequências desastrosas Exemplo: Mars Orbiter (1999), Ariane 5 (2001)
3
Verificação e Validação (V&V) Theorem proving Static analysis Testing Inspection Walkthroughs
4
Verificação e Validação (V&V) Theorem proving Static analysis Testing Inspection Walkthroughs
5
Definição: Testes (processo) Atividade(s) de encontrar erros no software
6
Limitações Não prova corretude como theorem proving Não é automático como análise estática Porém... É técnica de V&V dominante na indústria Documenta intenções e designs Pode ser combinada com técnicas formais para encontrar erros de forma mais sistemática. Por exemplo, Kernel do Linux [Cadar et al., 2006], Protocolos de rede [d´Amorim et al., 2005], Escalonador de tempo real [Penix et al., 2000], etc.
7
Definição: Teste (artefato) “A set of test inputs, execution conditions, and expected results developed for a particular objective, such as to exercise a particular program path or to verify compliance with a specific requirement” [IEEE, do178b]
8
Definição: Teste (artefato) “A set of test inputs, execution conditions, and expected results developed for a particular objective, such as to exercise a particular program path or to verify compliance with a specific requirement” [IEEE, do178b]
9
Exemplo public class Customer { String getName() {…} } public class Bank{ static Bank createBank() {…} Customer createCustomer(String name) {…} }
10
Exemplo public class Customer { String getName() {…} } public class Bank{ static Bank createBank() {…} Customer createCustomer(String name) {…} } Bank bank = Bank.createBank(); String name = “customer1“; Customer cust = bank.createCustomer(name); Assert.assertEquals(name, cust.getName());
11
Exemplo public class Customer { String getName() {…} } public class Bank{ static Bank createBank() {…} Customer createCustomer(String name) {…} } Bank bank = Bank.createBank(); String name = “customer1“; Customer cust = bank.createCustomer(name); Assert.assertEquals(name, cust.getName()); Entrada e resultado esperado :
12
Exemplo public class Customer { String getName() {…} } public class Bank{ static Bank createBank() {…} Customer createCustomer(String name) {…} Customer search(String name) {…} } Bank bank = Bank.createBank(); String name = “customer1“; Customer cust = bank.search(name); if (cust == null) { Customer cust = bank.createCustomer(name); Assert.assertEquals(name, cust.getName()); } Condições de execução :
13
Terminologia: Falta e Falha IEEE STD. 982.2-1988 (http://standards.ieee.org/) http://standards.ieee.org/ Fault (falta, bug ou defeito) : problema Failure (falha, ou erro) : manifestação do problema Mais detalhes… Software Metrics and Reliability [Rosenberg et al., ISSRE’98]
14
Quiz: Localize falta e falha no pgm. abaixo // pre condicao: v != null public static void sort(int[] v) { for (int i = 0; i <= v.length; i++) { …v[i] … }
15
Quiz: Localize falta e falha no pgm. abaixo // pre condicao: v != null public static void sort(int[] v) { for (int i = 0; i <= v.length; i++) { …v[i] … } CAUSA EFEITO
16
Teste e Depuração Teste é atividade de localizar falhas! Depuração é atividade de localizar faltas!
17
Teste e Depuração Teste é atividade de localizar falhas! Depuração é atividade de localizar faltas! No exemplo anterior Atividade de teste revela um erro no uso de v[i]. E.g., com sort(new int[]{}); Depuração localiza o defeito na condição de parada do loop: i <= v.length
18
Terminologia: suíte e regressão Suíte de testes é o mesmo que conjunto de testes Regressão é o evento de uma falha em um teste que já passou Suíte de regressão serve para capturar falhas com origem na modificação contínua do programa
19
Enquete: Voce já usou? JUnit3 JUnit4 NUnit Ant Make
20
Agenda do curso Demo Junit (framework de testes) Testes no desenvolvimento Qualidade de suíte de testes Demo EclEmma (cálculo de cobertura) Demo MuClipse (cálculo de score de mutação) Automação da geração de testes Demo TARGET (geração baseada em modelos) Demo Randoop (geração aleatória)
21
Demo JUnit
22
Testes no desenvolvimento
23
Gerência de bugs (E.g., bugzilla) Teste contínuo
24
programadortestador gerente cliente alguns papéis
25
programadortestador gerente requisitos atribuição cliente
26
programadortestador gerente Bug tracker
27
Sistema de bug tracking Objetivo: gerenciar ciclo de vida de bugs Programadores e testadores modificam status de report Gerentes tem acesso a informação valiosa Exemplo: frequência de erro por módulo Exemplo: Bugzilla (open-source). http://www.bugzilla.org/
28
Máquina de estados de um bug no Bugzilla
29
Teste contínuo Execução ininterrupta de testes Alternativas Unidade (localmente) ver http://groups.csail.mit.edu/pag/continuoustesting/ Sistema (no servidor) ver http://www.javaworld.com/javaworld/jw-11-2006/jw-1101-ci.html Problemas (mais críticos quando usado localmente) Pode impactar performance Pode reportar falso alarmes (devido a modificações incompletas)
30
Resumo Ferramenta de gerência de erros E.g., bugzilla, clearquest, etc. Ferramenta de integração contínua E.g., cruisecontrol, continuum, etc. Controle de versão E.g., cvs, svn, etc. Ferramenta de build E.g., ant, make, maven, etc.
31
Qualidade de suíte de testes
32
Problema Usuário não sabe quão adequada é uma suíte de testes para encontrar erro. Em resumo, como medir qualidade? Duas soluções Cobertura Score de Mutação
33
Definição: cobertura Valor que indica quanto uma suíte de testes cobre um programa de acordo com um critério particular Exemplo Cobertura de métodos indica o percentual de métodos de uma aplicação que um conjunto de testes exercita Princípio Maior cobertura aumenta chances de encontrar o erro
34
Simplificação didática Testar a estrutura de um programa equivale a testar um grafo
35
Control-Flow Graph (CFG) stmt0; while (condA){ if (condB){ stmt1; stmt2; } stmt3; } stmt4
36
Control-Flow Graph (CFG) stmt0; while (condA){ if (condB){ stmt1; stmt2; } stmt3; } stmt4 stmt0 condA stmt1; stmt2; stmt3 condB stmt4
37
Control-Flow Graph (CFG) stmt0 condA stmt1; stmt2; stmt3 condB stmt4 b c a f d e t0 t1t6 t2 t3 t4 t5
38
Quiz O que é uma sequência de teste para um grafo?
39
Quiz O que é uma sequência de teste para um grafo? Sequência de transições a partir do nó inicial que termina em uma folha
40
Cobertura de Grafos Exemplo de sequência de teste t0; t6 b c a f d e t0 t1t6 t2 t3 t4 t5
41
Critérios de adequação de grafo Nó Transição Caminho
42
Critérios de adequação de grafo Nó Teste suíte TS é adequado a nó (i.e., cobre todos os nós) se para cada nó n em G existe t em TS que cobre n (i.e., origem ou destino de t é n) Transição … Caminho …
43
Critérios de adequação de grafo Nó Teste suíte TS é adequado a nó (i.e., cobre todos os nós) se para cada nó n em G existe t em TS que cobre n (i.e., origem ou destino de t é n) Transição … Caminho … Em geral, número de caminhos de um grafo é infinito
44
Exercício Reporte suíte de teste adequada a nó Reporte suíte de teste adequada a transição Existe suíte de teste adequada a caminho de até N transições?
45
Demo EclEmma
46
Problema Usuário não sabe quão adequada é uma suíte de testes para encontrar erro Duas soluções Cobertura Score de Mutação
47
Teste de Mutação Verifica se uma suíte de teste é capaz de encontar uma falha no programa modificado com um bug (Fault seeding/injection) Princípio Uma suíte capaz de encontrar vários erros artificiais pode encontrar mais erros reais
48
Teste de Mutação P T0 T1 T2 … Tn Como saber se TS é adequada para encontrar erros? TS =
49
Teste de Mutação P’ é uma versão que contém um erro! O que se pode concluir sobre TS? P T0 T1 T2 … Tn P’ T0 T1 T2 … Tn TS =
50
Teste de Mutação P’ é uma versão que contém um erro! O que se pode concluir sobre TS? P T0 T1 T2 … Tn P’ T0 T1 T2 … Tn TS = Inadequado para encontrar erro introduzido em P’
51
Teste de Mutação O que o programador deve fazer ao perceber isto? P T0 T1 T2 … Tn P’ T0 T1 T2 … Tn TS =
52
Teste de Mutação O que o programador deve fazer ao perceber isto? P T0 T1 T2 … Tn P’ T0 T1 T2 … Tn TS = Adicionar novo teste para capturar erro em P’
53
Teste de Mutação Novo teste deve passar em P e falhar em P’ Definição: TS distingue programas P e P’ P T0 T1 T2 … Tn P’ T0 T1 T2 … Tn TS = Tn+1
54
Terminologia Mutante Operador de Mutação Mutante morto Mutante sobrevivente Mutante equivalente
55
Terminologia Mutante: Programa original modificado Operador de Mutação: Definição de uma transformação (de original para mutante) Mutante morto: Quando a suíte de teste consegue distinguir mutante do original Mutante sobrevivente: Não morto (acima) Mutante equivalente: Semântica do mutante é equivalente ao original
56
Mutantes sobreviventes Duas razões para P’ sobreviver ao teste de distinção de P em relação a TS Suíte TS não consegue distinguir P e P’ P e P’ são equivalentes => problema indecidível!
57
Metodologia (Parte 1) Input: P: Pgm, OPS: set of Op Output: set of Pgm Pseudo-code: gerarMutantes /******************************************************* * gera vários novos programas derivados de P. * Para cada um, identifica um operador de * mutação em OPS e uma posicão para aplicá-lo * em P. Em geral, cada mutante inclui apenas * uma modificação. *******************************************************/
58
Metodologia (Parte 2) Input: P: Pgm, TS: set of Pgm, {P1, P2, …, Pn}: set of Pgm Output: (survivors: set of Pgm, killed: set of Pgm) Pseudo-code: encontreSobreviventes for each Pm in {P1,P2, …,Pn} do // distinguir mutante if (exists some T in TS s.t. RUN(T,Pm) == FAIL) killed = killed U {Pm} else survivors = survivors U {Pm} done return (survivors, killed)
59
Metodologia (Parte 3) P TS Set of Mutants OPs gerarMutantesencontreSobreviventes sobreviventes novos testes
60
Score de Mutação Está para o teste de falhas assim como cobertura está para o teste estrutural Score: #mortos / (#mutantes - #equivalentes) Ex. 10 mutantes, 5 mortos, 2 equivalentes. Score = 5/8 = 0.625 (62.5%)
61
Limitações Não se sabe se o erro introduzido por um operador de mutação é relevante para encontrar erros reais Identificação de mutantes equivalentes é manual Consome tempo do testador e é passível a erro
62
Demo MuClipse
63
Automação da geração de testes
64
Duas preocupações Entrada (sequência + dados) Classificador Várias técnicas Model-Based Testing (e.g., TARGET), Random Testing (e.g., RANDOOP), Symbolic Testing (e.g., Symstra), Concolic Testing (e.g., DART), etc.
65
Model-Based Testing (MBT) Modelo orienta o teste de programas Modelo representa comportamento esperado (spec) Testes são gerados a partir do modelo Violação indica que o sistema não está em conformidade com o modelo Principais limitações Incompletude do modelo Dificuldade na construção do modelo
66
TARGET Entrada são requisitos e parâmetros de geração Documentos Word estruturados descrevem os requisitos Cada arquivo descreve uma feature com vários casos de uso. Um caso de uso possui diversos fluxos (principal, alternativos, e excepcionais). Saída é uma suíte de teste Planilhas no Excel descrevem os casos de teste
67
Demo TARGET
68
Random Testing Geração de entradas Seleção de sequência e dados randômica e incremental Principal limitação Degrada com o aumento no tamanho do espaço de estados
69
Randoop Entrada é um conjunto de classes e parâmetros de configuração Saída é uma suíte de testes Geração do classificador Derivado de conjunto de testes [Pacheco & Ernst, 2005] Específicos da linguagem [Pacheco et al., 2007] Informados pelo usuário
70
Feedback-directed random test generation. Carlos Pacheco et al., ICSE 2007
71
Demo RANDOOP
72
Desafios Melhorar automação Geração de classificadores (oracles) Geração de dados Geração de sequências Melhorar escalabilidade Escalar técnicas além do teste de unidade
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.