TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria [email protected] www.fe.up.pt/~jpf (baseado em slides de ex-alunos) Testes de mutação, João Pascoal Faria, 2007 ‹#› Índice O que são testes de mutação? Operadores de mutação Experiência com Jester Comparação com testes de cobertura Conclusões Testes de mutação, João Pascoal Faria, 2007 ‹#› O que são testes de mutação? Técnica de avaliação (e melhoria) da qualidade dos testes com base na determinação da sua capacidade de detectar falhas injectadas artificialmente no código já testado, representativas de falhas reais Injecção de falhas no código origina mutantes • Falhas são injectadas pela aplicação de operadores de mutação, representando erros típicos A cada mutante é aplicado o conjunto de testes originais • Se os testes falham -> o mutante diz-se neutralizado • Se os testes passam -> o mutante sobreviveu -> testes devem ser melhorados (ou mutante é equivalente ao código original -> análise manual!) Se os testes detectam as falhas artificiais podemos assumir que detectarão falhas reais Testes de mutação, João Pascoal Faria, 2007 ‹#› Exemplo de operadores de mutação [Bybro, 2003] Testes de mutação, João Pascoal Faria, 2007 ‹#› Jester The Junit test tester • Testes de Mutação em Java (com portings para Python e C#) Open source Número limitado de 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 &&” Pouco eficiente Jester it’s really a “jest” of mutation [Offutt, 2005] Mas permite ilustrar o conceito … Testes de mutação, João Pascoal Faria, 2007 ‹#› Experimentação com Jester Experimentado com o problema dos extensos Gerou 77 mutantes, dos quais 1 sobreviveu Análise posterior (ver a seguir) revelou 2 testes de má qualidade Testes de mutação, João Pascoal Faria, 2007 ‹#› Experimentação com Jester: Detalhes técnicos 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 Lançar Jester em consola: • java -classpath .:lib/jester.jar:lib/junit.jar:src/ jester.TestTester extensos.test.TestExtensos src/ > resultados.txt Analisar resultados Nota: 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) Testes de mutação, João Pascoal Faria, 2007 ‹#› Análise: Código sob teste original Testes de mutação, João Pascoal Faria, 2007 ‹#› Análise: Teste original Testes de mutação, João Pascoal Faria, 2007 ‹#› Análise: Mutante sobrevivente No testBelowMin, salta o if e dá ArrayOutOfBoundsException mais adiante (-1), em vez de IllegalArgumentException, conforme especificado. O método testBelowMin vai considerar que funcionou bem porque espera uma excepção qualquer, em vez de restringir a IllegalArgumentException! Testes de mutação, João Pascoal Faria, 2007 ‹#› Melhoria dos testes Se tivesse sido usado TDD, este problema não teria acontecido! Porquê? (Recordar: “Ver o teste a falhar”) Testes de mutação, João Pascoal Faria, 2007 ‹#› 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 cobertas 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 Testes de mutação, João Pascoal Faria, 2007 ‹#› Conclusões 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 Principais dificuldades: • Vasto número de mutantes possíveis: - Escolha criteriosa dos operadores de mutação • Elevado esforço na análise de mutantes sobreviventes e detecção de eventuais mutantes equivalentes • Poucas ferramentas Testes de mutação, João Pascoal Faria, 2007 ‹#› Exercício No projecto da conversão de números para extenso, experimentar injectar manualmente pequenas mutações no código sob teste e verificar se os mutante gerados são “mortos” pelos testes • No caso de não ter ficheiros próprios, usar “Extensos.java” e “TestExtensos.java” • Aplicar manualmente pelo menos 10 mutações (uma de cada vez), do tipo das realizadas pela ferramenta Jester (alteração de condições, troca de operadores, troca de constantes) O objectivo é encontrar algum mutante que não é morto pelos testes, e que não é equivalente ao código original, devendo-se depois melhorar o conjunto dos testes para matar também esse mutante. (Fora das aulas) Experimentar com Jester ou outra ferramenta Testes de mutação, João Pascoal Faria, 2007 ‹#› Referências e mais informação [Harold, 2005] Elliotte Rusty Harold, Test your tests with Jester: Test-suite flaws are no joke, 3 Março 2005, IBM developer works - Java technology , http://www-128.ibm.com/developerworks/library/j-jester/ [Jester, 2005] Ivan Moore, Jester - the JUnit test tester, 7 Novembro 2005, http://jester.sourceforge.net/ [Moore, 2002] Ivan Moore, Jester - a JUnit Test Tester, 25 Maio 2002, Agile Alliance, http://agilealliancebeta.org/show/881 [Offutt, 2005] Jeff Offutt, An analysis of Jester based on published papers, Abril 2005, http://ise.gmu.edu/~ofut/jester-anal.html [Himsworth, 2003] Phil Himsworth, Software mutation testing, 21 Janeiro 2003, http://everything2.com/index.pl?node id=1418661 [Bybro, 2003] Mattias Bybro, A Mutation Testing Tool for Java Programs, http://www.nada.kth.se/~karlm/a mutation testing tool for java.pdf Testes de mutação, João Pascoal Faria, 2007 ‹#›