230 likes | 307 Views
Teste baseado em falhas. Problema. Usuário não sabe se a suíte de teste é adequada ou não para encontrar erro Solução 1: Medir cobertura Mas… cobrir mais implica em encontrar mais erros?. Problema. Usuário não sabe se a suíte de teste é adequada ou não para encontrar erro
E N D
Problema • Usuário não sabe se a suíte de teste é adequada ou não para encontrar erro • Solução 1: Medir cobertura • Mas… cobrir mais implica em encontrar mais erros?
Problema • Usuário não sabe se a suíte de teste é adequada ou não para encontrar erro • Solução 1: Medir cobertura • Mas… cobrir mais implica em encontrar mais erros? • Solução 2: Introduzir erro intencionalmente (fault seeding/injection) • Permite identificar se a suíte encontrará ou não os erros injetados.
T0 T1 T2 … Tn Teste de Mutação TS = • Como saber se TS é adequada para encontrar erros? P
T0 T0 T1 T1 T2 T2 … … Tn Tn Teste de Mutação TS = • P’ é uma versão que contém um erro! • O que se pode concluir sobre TS? P’ P
T0 T0 T1 T1 T2 T2 … … Tn Tn Teste de Mutação 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’
T0 T0 T1 T1 T2 T2 … … Tn Tn Teste de Mutação TS = • O que o programador deve fazer ao perceber isto? P’ P
T0 T0 T1 T1 T2 T2 … … Tn Tn Teste de Mutação TS = • O que o programador deve fazer ao perceber isto? P’ P Adicionar novo teste para capturar erro em P’
T0 T1 T2 … Tn Teste de Mutação TS = • Novo teste deve passar em P e falhar em P’ • Definição: TS distingue programas P e P’ T0 T1 P’ P T2 … Tn Tn+1 Tn+1
Terminologia • Mutante • Operador de Mutação • Mutante morto • Mutante sobrevivente • Mutante equivalente
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
Modelo de falhas • Caracterização dos problemas frequentes em um domínio • E.g., reentrância em AOP, null-pointer em OO, deadlocks em programação concorrente, etc. Gerador de mutantes (operadores de mutação) usam esta caracterização para criar mutantes
Mutantes sobreviventes • Duas razões para Pm sobreviver ao teste de distinção de P em relação a TS • Suíte TS não consegue distinguir Pm e P • P e Pm são equivalentes => problemaindecidível!
Métodologia (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. *******************************************************/
Métodologia (Parte 2) Input: P: Pgm, TS: set of Pgm, {P1, P2, …, Pn}: set of Pgm Output: /*survivors*/ set of Pgm x /*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)
Metodologia (Parte 3) Set of Mutants gerarMutantes encontreSobreviventes P OPs TS sobreviventes novos testes
Score de Mutação • Métrica usada no teste de mutaçao • Está para o teste de falhas assim com cobertura está para o teste estrutural • Definição: #mortos / (#mutantes - #equivalentes)
Exemplo • Qual o score para o cenário 10 mutantes, 5 mortos, 2 equivalentes?
Exemplo • Qual o score para o cenário 10 mutantes, 5 mortos, 2 equivalentes? • Score = 5/(10-2) = 5/8 = .625 = 62.5%
Nota: Definição de score • Definição: #mortos / (#mutantes - #equivalentes) É comum desconsiderar #equivalentes, pois não é possível identificar de forma automatizada e ainda precisa!
Nota: Definição de score • Definição: #mortos / #mutantes Aproximação pessimista do score ideal!
Principais limitações • Não se sabe se erro introduzido por um operador de mutação é relevante • Classificar um mutante como equivalente é manual (caro e passível de erro) • Custo alto: Número de mutantes elevado requer várias execuções do teste
Resumo • Modelo de falhas • Mutante morto • Mutante sobrevivente • Mutante equivalente • Score de mutação