A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

(baseado em slides de ex-alunos)

Apresentações semelhantes


Apresentação em tema: "(baseado em slides de ex-alunos)"— Transcrição da apresentação:

1 (baseado em slides de ex-alunos)
TQS - Teste e Qualidade de Software (Software Testing and Quality) Testes de Mutação João Pascoal Faria (baseado em slides de ex-alunos)

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

3 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

4 Exemplo de operadores de mutação
[Bybro, 2003]

5 Jester The Junit test tester Open source
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 …

6 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

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

8 Análise: Código sob teste original

9 Análise: Teste original

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

11 Melhoria dos testes Se tivesse sido usado TDD, este problema não teria acontecido! Porquê? (Recordar: “Ver o teste a falhar”)

12 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

13 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

14 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

15 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 , [Jester, 2005] Ivan Moore, Jester - the JUnit test tester, 7 Novembro 2005, [Moore, 2002] Ivan Moore, Jester - a JUnit Test Tester, 25 Maio 2002, Agile Alliance, [Offutt, 2005] Jeff Offutt, An analysis of Jester based on published papers, Abril 2005, [Himsworth, 2003] Phil Himsworth, Software mutation testing, 21 Janeiro 2003, id= [Bybro, 2003] Mattias Bybro, A Mutation Testing Tool for Java Programs, mutation testing tool for java.pdf


Carregar ppt "(baseado em slides de ex-alunos)"

Apresentações semelhantes


Anúncios Google