Prévia do material em texto
ACH 2006 Engenharia de Sistemas de Informação I Prof. Marcelo Medeiros Eler marceloeler@usp.br Escola de Artes, Ciências e Humanidades - Universidade de São Paulo Aula 18 - Teste de Software: Análise de Mutantes mailto:marceloeler@usp.br Objetivos Apresentar a técnica de teste baseada em erros Apresentar o critério de teste de mutação Propor exercícios para exercitar os conceitos da técnica Como encontrar todas as falhas de um software? Um conjunto de casos de teste com qualidade ótima é capaz de revelar todas as falhas de um software Para encontrar todas as falhas e garantir que o software está livre de defeitos é necessário testá-lo em todas as condições e com todos os dados de entrada possíveis Como encontrar todas as falhas de um software? Entretanto, as condições, os cenários, os dados de entrada e suas combinações tendem a ser infinitos ou muito grandes Portanto, criar um conjunto de casos de teste ótimo é geralmente impossível ou impraticável Uma pergunta importante neste cenário Como criar um conjunto de casos de teste que seja: ● Finito e factível? ● Capaz de revelar o maior número de falhas perceptíveis? ● Capaz de revelar as falhas mais críticas ou relevantes do software? Esta pergunta esconde algumas outras: ● Como selecionar cenários/dados para criar bons casos de teste? ● Quantos testes são necessários para testar um software ou parte dele? ● Como saber se os testes criados são suficientes? Técnicas e critérios de teste Um bom caso de teste é aquele que tem uma alta probabilidade de revelar uma falha ainda não descoberta Portanto, técnicas e critérios de teste foram propostos para orientar o testador na tarefa de derivar os casos de teste com base nos artefatos do projeto (especificação, código, modelos, etc): ● Teste Adhoc ● Teste Exploratório ● Teste Funcional ou Caixa-Preta ● Teste Estrutural ou Caixa-Branca ● Teste Baseado em Erros Critérios de teste Definem requisitos de teste que devem ser satisfeitos pelos casos de teste Um critério é satisfeito somente quando todos os requisitos que ele define são satisfeitos Ajudam a responder às questões: ● Como selecionar valores de entrada para criar bons casos de teste? ● Quantos casos de teste devem ser criados? ● Quando parar de testar? Teste funcional ou caixa-preta (aula anterior) Teste estrutural ou teste caixa-branca Técnica de teste baseada em erros Os requisitos de teste são derivados a partir dos erros mais freqüentes cometidos durante o processo de desenvolvimento do software Critério mais conhecido: ● Teste de Mutação (Análise de Mutantes, Mutação de interface) Teste de Mutação Hipótese do Programador Competente ● Programadores experientes escrevem programas corretos ou muito próximos do correto. Efeito de Acoplamento ● Casos de teste capazes de revelar erros simples são tão sensíveis que, implicitamente, também são capazes de revelar erros mais complexos. Teste de Mutação ● Consiste em introduzir pequenas mudanças no programa sob teste e observar o comportamento dos casos de teste existentes ● Isto vai avaliar a qualidade dos casos de teste existentes, ou seja, se ele é capaz de revelar falhas a partir de defeitos introduzidos artificialmente Teste de Mutação ● Considere um programa P que, em teoria, está correto P Teste de Mutação ● O que acontece com P se uma mudança for introduzida? P Mudanças P’ Teste de Mutação ● O que acontece com P se uma mudança for introduzida? ○ P’ é uma versão defeituosa de P P Mudanças P’ Teste de Mutação ● O que acontece com P se uma mudança for introduzida? ○ P’ é uma versão defeituosa de P ○ P’ é uma versão equivalente de P P Mudanças P’ Teste de Mutação ● Como descobrir? P Mudanças P’ Teste de Mutação ● Como descobrir? P Mudanças P’ T Teste de Mutação ● Como descobrir? P Mudanças P’ T Resultados Teste de Mutação ● Como descobrir? P Mudanças P’ TT Resultados Teste de Mutação ● Como descobrir? P Mudanças P’ TT Resultados Resultados Teste de Mutação ● Como descobrir? P Mudanças P’ TT Resultados Resultadoscomparar Teste de Mutação ● Como descobrir? P Mudanças P’ TT Resultados Resultados Resultados iguais Programas equivalentes? Teste de Mutação ● Como descobrir? P Mudanças P’ TT Resultados Resultados Resultados diferentes Defeito introduzido Teste de Mutação Processo para avaliar e aperfeiçoar casos de teste com base no teste de mutação 1. Geração de Mutantes 2. Execução do Programa (com casos de teste) 3. Execução dos Mutantes (com casos de teste) 4. Análise dos mutantes vivos 1 - Geração de Mutantes Para modelar os desvios sintáticos mais comuns, operadores de mutação são aplicados a um programa, transformando-o em programas similares: mutantes P 1 - Geração de Mutantes Para modelar os desvios sintáticos mais comuns, operadores de mutação são aplicados a um programa, transformando-o em programas similares: mutantes P Operadores de Mutação 1 - Geração de Mutantes Para modelar os desvios sintáticos mais comuns, operadores de mutação são aplicados a um programa, transformando-o em programas similares: mutantes P Operadores de Mutação P1 P2 P3 P4 ... Pn 1 - Geração de Mutantes Operadores de Mutação - Limites de condicionais - Incrementos - Retornos falsos/verdadeiros/nulos - Negação - Substituição de constantes - ... Exemplo: https://pitest.org/quickstart/mutators/ 1 - Geração de Mutantes Operadores de Mutação - Limites de condicionais - Incrementos - Retornos falsos/verdadeiros/nulos - Negação - Substituição de constantes - ... Exemplo: https://pitest.org/quickstart/mutators/ 1 - Geração de Mutantes Seleção dos operadores de mutação - São dependentes de linguagem de programação - Abrangentes - Capazes de modelar a maior parte dos erros - Pequena cardinalidade - Problemas de custo - Quanto maior o número de operadores utilizados, maior o número de mutantes gerados 1 - Geração de Mutantes 2 - Execução do Programa O programa original é executado contra os casos de teste existentes Idealmente, todos os casos de teste devem passar, indicando que o programa sob teste está “correto” 3 - Execução dos Mutantes Os mutantes gerados são executados contra os casos de teste existentes M1 M2 M3 M4 M5 M6 M7 3 - Execução dos Mutantes Os mutantes gerados são executados contra os casos de teste existentes M1 M2 M3 M4 M5 M6 M7 T T T T T T T 3 - Execução dos Mutantes Os mutantes gerados são executados contra os casos de teste existentes M1 M2 M3 M4 M5 M6 M7 T T T T T T T 3 - Execução dos Mutantes Os mutantes gerados são executados contra os casos de teste existentes M1 M2 M3 M4 M5 M6 M7 T T T T T T T Morto Morto Morto MortoVivo Vivo Vivo 3 - Execução dos Mutantes Os mutantes gerados são executados contra os casos de teste existentes M1 M2 M3 M4 M5 M6 M7 T T T T T T T Morto Morto Morto MortoVivo Vivo Vivo Defeitos possivelmente inseridos pelas mutações não foram detectados pelos casos de teste! 4 - Análise dos Mutantes Vivos Identificar a quantidade de mutantes mortos e vivos Identificar os mutantes equivalentes Calcular o score de mutação: SM(P,T) = MM(P,T) / (M(P) - ME(P)) - SM = Score de Mutação - MM = Número de Mutantes Mortos - M(P) = Número de Mutantes Gerados - ME = Número de Mutantes Equivalentes 4 - Análise dos Mutantes Vivos Quanto maior o score de mutação, melhor O objetivo é chegar ao score = 1 (100% de mutantes mortos) Aperfeiçoar os casos de teste para aumentar o score de mutação 3 - Execução dos Mutantes Execução dos casos de testes aperfeiçoados M1 M2 M3 M4 M5 M6 M7 T’ T’ T’ T’ T’ T’ T’ 3 - Execução dos Mutantes Execução dos casos de testes aperfeiçoados M1 M2 M3 M4 M5 M6 M7 T’ T’ T’ T’ T’ T’ T’ Morto Morto Morto MortoMorto Morto Vivo 4 - Análise dos Mutantes Vivos SM(P,T) = MM(P,T) / (M(P) - ME(P)) - SM = Score de Mutação - M = 7 - MM = Mutantes Mortos (6) - ME = Mutantes Equivalentes (0) SM = 6/(7-0) SM = 0,86 3 - Execuçãodos Mutantes Execução dos casos de testes aperfeiçoados M1 M2 M3 M4 M5 M6 M7 T’ T’ T’ T’ T’ T’ T’ Morto Morto Morto MortoMorto Morto Vivo Equivalente 4 - Análise dos Mutantes Vivos SM(P,T) = MM(P,T) / (M(P) - ME(P)) - SM = Score de Mutação - M = 7 - MM = Mutantes Mortos (6) - ME = Mutantes Equivalentes (1) SM = 6/(7-1) SM = 1 Teste de Mutação ● 100% de cobertura estrutural não garante a efetividade do conjunto de casos de teste na detecção de defeitos ● O teste de mutação leva o testador a aperfeiçoar os casos de testes de tal forma que os defeitos inseridos resultem em falhas nos casos de teste ● Desta forma, a capacidade de detecção de falhas dos casos de teste aumenta, que é o objetivo final da atividade de teste de software Exemplo O bom e velho método para classificar um Triângulo Exemplo O bom e velho método para classificar um Triângulo: Exemplo O bom e velho método para classificar um Triângulo: Arquivo: ExemploMutanteTriangulo.pdf https://drive.google.com/file/d/1yxTAoQLiy6TPu1I7NUtsMFCI-1KLaTDb/view?usp=sharing Ferramenta (Java): PITEST https://pitest.org/ https://pitest.org/quickstart/maven/ Ferramenta (Java): PITEST Ferramenta (Java): PITEST Ferramenta (Java): PITEST Ferramenta (Java): PITEST ACH 2006 Engenharia de Sistemas de Informação I Prof. Marcelo Medeiros Eler marceloeler@usp.br Escola de Artes, Ciências e Humanidades - Universidade de São Paulo Aula 18 - Teste de Software: Análise de Mutantes mailto:marceloeler@usp.br