720 likes | 837 Views
Fundamentos do Teste de Software. SBMF 2008, Salvador-BA, Brasil Marcelo d'Amorim damorim@cin.ufpe.br. 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
E N D
Fundamentos do Teste de Software SBMF 2008, Salvador-BA, Brasil Marcelo d'Amorim damorim@cin.ufpe.br
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)
Verificação e Validação (V&V) • Theorem proving • Static analysis • Testing • Inspection • Walkthroughs
Verificação e Validação (V&V) • Theorem proving • Static analysis • Testing • Inspection • Walkthroughs
Definição: Testes (processo) • Atividade(s) de encontrar erros no software
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.
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]
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]
Exemplo public class Customer { String getName() {…} } public class Bank{ static Bank createBank() {…} Customer createCustomer(String name) {…} }
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());
Exemplo public class Customer { String getName() {…} } public class Bank{ static Bank createBank() {…} Customer createCustomer(String name) {…} } Entrada e resultadoesperado: Bank bank = Bank.createBank(); String name = “customer1“; Customer cust = bank.createCustomer(name); Assert.assertEquals(name, cust.getName());
Exemplo public class Customer { String getName() {…} } public class Bank{ static Bank createBank() {…} Customer createCustomer(String name) {…} Customer search(String name) {…} } Condições de execução: 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()); }
Terminologia: Falta e Falha • IEEE STD. 982.2-1988 (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]
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] … } }
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
Teste e Depuração • Teste é atividade de localizar falhas! • Depuração é atividade de localizar faltas!
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., comsort(new int[]{}); • Depuração localiza o defeito na condição de parada do loop: i <= v.length
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
Enquete: Voce já usou? • JUnit3 • JUnit4 • NUnit • Ant • Make
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)
Testes no desenvolvimento • Gerência de bugs (E.g., bugzilla) • Teste contínuo
programador testador alguns papéis cliente gerente
programador testador atribuição atribuição requisitos cliente gerente
programador testador Bug tracker gerente
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/
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)
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.
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
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
Simplificação didática • Testar a estrutura de um programa equivale a testar um grafo
Control-Flow Graph (CFG) stmt0; while (condA){ if (condB){ stmt1; stmt2; } stmt3; }stmt4
Control-Flow Graph (CFG) stmt0 stmt0; while (condA){ if (condB){ stmt1; stmt2; } stmt3; }stmt4 condA condB stmt4 stmt1; stmt2; stmt3
Control-Flow Graph (CFG) a stmt0 t4 t0 condA b t1 t6 condB c f t2 t5 stmt4 stmt1; stmt2; d t3 e stmt3
Quiz • O que é uma sequência de teste para um grafo?
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
Cobertura de Grafos • Exemplo de sequência de teste • t0; t6 a t4 t0 b t1 t6 c f t2 t5 d t3 e
Critérios de adequação de grafo • Nó • Transição • Caminho
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 • …
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
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?
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
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 errosreais
Teste de Mutação T0 T1 T2 … Tn TS = • Como saber se TS é adequada para encontrar erros? P
Teste de Mutação T0 T0 T1 T1 T2 T2 … … Tn Tn TS = • P’ é uma versão que contém um erro! • O que se pode concluir sobre TS? P’ P
Teste de Mutação T0 T0 T1 T1 T2 T2 … … Tn Tn TS = • P’ é uma versão que contém um erro! • O que se pode concluir sobre TS? P’ P Inadequado para encontrar erro introduzido em P’