Testes de Mutação baseado no artigo de Mário Correia, Testes de Mutação, 2006, acessível emhttp://deec.fe.up.pt/~ei02070/tqs/ 7 Dezembro 2006 Teste e Qualidade de Software, 2006/07, Mário Correia 1 Índice Introdução Processo de teste com mutação Jester Problemas com a técnica Comparação com testes de cobertura Notas finais Teste e Qualidade de Software, 2006/07, Mário Correia 2 Introdução Objectivo dos Testes de Mutação: ●Verificar a qualidade dos testes. Designações alternativas para Testes de Mutação: ●Test tester [Jester, 2005]; ●Testing the testing [Himsworth, 2003]; ●Automated error seeding [Jester, 2005]. Teste e Qualidade de Software, 2006/07, Mário Correia 3 Introdução Ideias chave: ●Injecção de falhas no código original originam mutantes; ●A cada mutante é aplicado os testes originais: ●Se os testes passam -> testes devem ser melhorados; ●Se os testes falham -> o mutante diz-se neutralizado; ●Se os testes detectam as falhas artificiais podemos assumir que detectará falhas reais; ●Falhas injectadas pela aplicação de operadores de mutação. Teste e Qualidade de Software, 2006/07, Mário Correia 4 Processo de teste com mutação Strong mutation testing: ●Mutantes executados até terminarem; ●Permite a recuperação de falhas; ●Resultados muito precisos; ●Gasta muito tempo. Weak mutation testing: ●Mutantes terminam após detecção de falha; ●Não permite a recuperação de falhas; ●Resultados pouco precisos; ●Gasta pouco tempo. Teste e Qualidade de Software, 2006/07, Mário Correia 5 Processo de teste com mutação Firm mutation testing: ●Compromisso entre Strong e Weak mutation testing; ●Mutantes terminam execução algures entre o código do mutante e o fim do programa; ●Deve ser o mais cedo possível para poupar tempo; ●Mas suficientemente tarde para permitir recuperar de falhas. Teste e Qualidade de Software, 2006/07, Mário Correia 6 Jester The Junit test tester: ●Testes de Mutação em Java (com portings para Python e C#). Operadores de mutação: ●Modificação de números literais: ex.: 0 para 1; ●Alteração de true por false e vice-versa; ●Alteração de if( para if(true || ; ●Alteração de if( para if(false && . Teste e Qualidade de Software, 2006/07, Mário Correia 7 Jester: tutorial O código exemplo para demonstrar o funcionamento do Jester será o problema dos Extensos dado nas aulas de TQS. Criar projecto e copiar ficheiros do Jester: ●jester.cfg: configuração do Jester; ●ignorelist.cfg: construções da linguagem a ignorar; ●mutations.cfg: mutações a aplicar; ●jester.jar: jar do Jester; ●lib/junit.jar: jar do Junit. Teste e Qualidade de Software, 2006/07, Mário Correia 8 Jester: tutorial Lançar Jester em consola: ●java -classpath .:lib/jester.jar:lib/junit.jar:src/ jester.TestTester extensos.test.TestExtensos src/ > resultados.txt Teste e Qualidade de Software, 2006/07, Mário Correia 9 Jester: tutorial Após o Jester terminar, analisa-se os resultados: Teste e Qualidade de Software, 2006/07, Mário Correia 10 Jester: tutorial Teste e Qualidade de Software, 2006/07, Mário Correia 11 Jester: tutorial Teste e Qualidade de Software, 2006/07, Mário Correia 12 Jester: notas O Jester apenas executa se os testes passarem no código original; ●O Jester realiza as mutações directamente no código original -> manter cópia do projecto ou ter o projecto sob controlo de versões; ●O código deve ser compilado para a mesma pasta onde reside o código fonte (não pode ser para a pasta bin/ habitual no Eclipse). ● Teste e Qualidade de Software, 2006/07, Mário Correia 13 Jester: avaliação da ferramenta Jester it’s really a “jest” of mutation, [Offutt, 2005] ●Operadores muito simples; ●Trocar 0 por 1 é praticamente inútil pois os testes irão detectá-lo de certeza -> Operadores instáveis; ●Jester resume-se a testar condições. ●Ferramenta muito ineficiente. ● Teste e Qualidade de Software, 2006/07, Mário Correia 14 Jester: avaliação da ferramenta [Bybro, 2003] propõe uma ferramenta de mutação para Java, com uma vasta gama de operadores: ● Teste e Qualidade de Software, 2006/07, Mário Correia 15 Problemas com a técnica Vasto número de mutantes: ●Escolha criteriosa dos operadores de mutação. ●Processo dispendioso em tempo: ●Eliminação de mutantes equivalentes - mutantes com o mesmo comportamento que o original; ●Processo Weak ou Firm. ●Detecção de mutantes equivalentes. ●Neutralização dos chamados stubborn mutants: mutantes não equivalentes mas difíceis de neutralizar. ● Teste e Qualidade de Software, 2006/07, Mário Correia 16 Comparação com testes de cobertura Testes de Cobertura de código: ●Verificam se todas as possíveis condições de execução de um programa, são cobridas pelos testes; ●Saber que uma instrução não está a ser executada pelos testes prova que não está a ser testada; Contudo, o inverso não é verdade: ●Se uma linha de código é executada, isso não significa que está a ser verdadeiramente testada. Testes de Mutação: ●Alteram o código pela introdução de falhas, permitindo verificar se efectivamente os testes cobrem a situação que foi alterada. Teste e Qualidade de Software, 2006/07, Mário Correia 17 Notas finais Testes de Mutação ajudam a melhorar a qualidade dos testes; ●Podem guiar o processo de criação de testes; ●Usados em complemento com outro tipo de testes, em especial testes de cobertura de código; ●Técnica valiosa para sistemas confiáveis e tolerantes a falhas, em conjunto com injecção de falhas por hardware; ●Mutação pode ser aplicada a outras áreas: ex.: geração de dados de teste complexos [Shan and Zhu, 2006]. ● Teste e Qualidade de Software, 2006/07, Mário Correia 18