180 likes | 323 Views
Testes de Mutação baseado no artigo de Mário Correia, Testes de Mutação, 2006, acessível em http://deec.fe.up.pt/~ei02070/tqs/ 7 Dezembro 2006. Introdução Processo de teste com mutação Jester Problemas com a técnica Comparação com testes de cobertura Notas finais. Índice.
E N D
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
Introdução Processo de teste com mutação Jester Problemas com a técnica Comparação com testes de cobertura Notas finais Índice
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]. 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. Introduçã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. 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. Processo de teste com mutação
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 && . Jester
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. Jester: tutorial
Lançar Jester em consola: java -classpath .:lib/jester.jar:lib/junit.jar:src/ jester.TestTester extensos.test.TestExtensos src/ > resultados.txt Jester: tutorial
Após o Jester terminar, analisa-se os resultados: Jester: tutorial
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).
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.
Jester: avaliação da ferramenta [Bybro, 2003] propõe uma ferramenta de mutação para Java, com uma vasta gama de operadores:
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.
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.
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].