15
1 Testes de mutação, João Pascoal Faria, 2007 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)

1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria [email protected]@fe.up.pt

Embed Size (px)

Citation preview

Page 1: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

1Testes de mutação, João Pascoal Faria, 2007

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)

Page 2: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

2Testes 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

Page 3: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

3Testes 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

Page 4: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

4Testes de mutação, João Pascoal Faria, 2007

Exemplo de operadores de mutação

[Bybro, 2003]

Page 5: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

5Testes 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 …

Page 6: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

6Testes 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

Page 7: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

7Testes 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)

Page 8: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

8Testes de mutação, João Pascoal Faria, 2007

Análise: Código sob teste original

Page 9: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

9Testes de mutação, João Pascoal Faria, 2007

Análise: Teste original

Page 10: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

10Testes 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!

Page 11: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

11Testes 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”)

Page 12: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

12Testes 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

Page 13: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

13Testes 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

Page 14: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

14Testes 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

Page 15: 1 Testes de mutação, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria jpf@fe.up.ptjpf@fe.up.pt

15Testes 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