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
‹#›
Download

O que são testes de mutação?