SlideShare uma empresa Scribd logo
1 de 18
Baixar para ler offline
Teste de mutação 
Luís Armando Bianchin 
Consultant Developer
Agenda 
● Problema 
● O que é teste de mutação? 
● Exemplos 
● Por que? 
● Ferramentas 
● Uso num projeto real
Problema 
● Os testes estão corretos? 
● Cobrem todos requisitos? 
● Qual a qualidade dos testes?
Problema 
● Cobertura de linhas apenas verifica execução de código 
● 100% de cobertura != boa suite de testes 
● Apenas testes "happy path" ou fáceis 
● Código apenas parcialmente testado
Os testes são 
capazes de detectar 
falhas?
Origem 
● Proposto na Academia ~ 1978 
● Yale University e Georgia Institute of technology 
● Hipótese do programador competente 
○ Programas quase perfeitos 
○ Falhas pequenas 
○ Pequenas alterações para correção
O que é teste de mutação? 
● Introduz falhas (mutações) na implementação 
○ Alterações semânticas 
● Roda os testes 
● Os testes realmente quebraram? 
● Mutações mortas ou vivas? 
● Os testes identificaram as falhas?
Exemplo 
Mutação de troca de && para || 
if (a && b) { 
c = 1; 
} else { 
c = 0; 
} 
if (a || b) { 
c = 1; 
} else { 
c = 0; 
}
Efeito colateral não testado 
@Test 
public void 
shouldFailWhenGivenFalse() { 
assertEquals("FAIL", foo(false)); 
} 
@Test 
public void 
shouldBeOkWhenGivenTrue() { 
assertEquals("OK", foo(true)); 
} 
public static String foo(boolean b) { 
if ( someThing(i) ) { 
doImportantBusinessLogic(); 
return "OK"; 
} 
return "FAIL"; 
} 
Não verifica se doImportantBusinessLogic foi chamado
Teste de limite incompleto 
@Test 
public void 
shouldReturnBarWhenGiven1() { 
assertEquals("bar", foo(1)); 
} 
@Test 
public void 
shouldReturnFooWhenGivenMinus1() { 
assertEquals("foo", foo(-1)); 
} 
public static String foo(int i) { 
if ( i >= 0 ) { 
return "foo"; 
} else { 
return "bar"; 
} 
} 
O comportamento quando i==0 não foi testado
Mockista Míope 
@Test 
public void 
shouldPerformActionGivenTrue() { 
foo(mockCollab, true); 
verify(mockCollab).doAction(); 
} 
@Test 
public void 
shouldNotPerformActionGivenFalse() { 
foo(mockCollab, false); 
verify(never(),mockCollab).doAction(); 
} 
public static String foo(Collaborator c, 
boolean b) { 
if ( b ) { 
return c.doAction(); 
} 
return "FOO"; 
} 
Retorno da função nunca foi testado
Operadores de mutação 
● Exclusão de declarações 
● Duplicação ou inserção de declarações 
● Negação de subexpressões booleanas 
● Substituições: 
○ Operadores aritiméticos (+, -, *, /) 
○ Relações booleanas (==, !=, <, <=, >, >=) 
○ Variáveis do mesmo escopo (tipos devem ser compatíveis) 
Escore de mutação = № de mutantes mortos / № total de 
mutantes
Por que? 
● Ajuda a criar suítes de teste efetivas 
● Propósito educacional 
● Mostra quanto pode-se confiar numa suite de teste 
○ Código legado 
● Ajuda na refatoração e na criação de testes de 
caracterização 
● Verificar se alguma implementação está bem testada
O que não resolve? 
● Caro para gerar e executar mutantes 
● Limitado aos operadores de mutação 
● Útil para teste unitários (doing things right) 
● Ainda devem existir testes funcionais (doing the right 
things)
Ferramentas 
● PIT for Java 
● Mutant for Ruby 
● PyMuTester for Python
PIT num projeto 
real
Fontes 
● http://pitest.org/ 
● http://solnic.eu/2013/01/23/mutation-testing-with-mutant. 
html 
● http://en.wikipedia.org/wiki/Mutation_testing 
● https://github.com/mbj/mutant 
● http://www.parasoft.com/products/article.jsp? 
articleId=291 
● http://www.techopedia.com/definition/20905/mutation-testing
Perguntas? 
Luís Armando Bianchin 
labianchin@thoughtworks.com

Mais conteúdo relacionado

Mais procurados

Aula 3 técnicas de teste de software1
Aula 3   técnicas de teste de software1Aula 3   técnicas de teste de software1
Aula 3 técnicas de teste de software1
Tiago Vizoto
 

Mais procurados (20)

Aula 3 técnicas de teste de software1
Aula 3   técnicas de teste de software1Aula 3   técnicas de teste de software1
Aula 3 técnicas de teste de software1
 
Todas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágilTodas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágil
 
Quality Built In @ Spotify
Quality Built In @ SpotifyQuality Built In @ Spotify
Quality Built In @ Spotify
 
Api testing
Api testingApi testing
Api testing
 
Latest Manual Testing Interview Questions and Answers 2015 - H2kinfosys
Latest Manual Testing Interview Questions and Answers 2015 - H2kinfosys Latest Manual Testing Interview Questions and Answers 2015 - H2kinfosys
Latest Manual Testing Interview Questions and Answers 2015 - H2kinfosys
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
Arquitetura básica de testes para seu projeto Java
Arquitetura básica de testes para seu projeto JavaArquitetura básica de testes para seu projeto Java
Arquitetura básica de testes para seu projeto Java
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
Introduction to TDD (Test Driven development) - Ahmed Shreef
Introduction to TDD (Test Driven development) - Ahmed ShreefIntroduction to TDD (Test Driven development) - Ahmed Shreef
Introduction to TDD (Test Driven development) - Ahmed Shreef
 
TDD - Agile
TDD - Agile TDD - Agile
TDD - Agile
 
Qualidade de Software
Qualidade de SoftwareQualidade de Software
Qualidade de Software
 
Test Driven Development (TDD) Preso 360|Flex 2010
Test Driven Development (TDD) Preso 360|Flex 2010Test Driven Development (TDD) Preso 360|Flex 2010
Test Driven Development (TDD) Preso 360|Flex 2010
 
Mutation testing
Mutation testingMutation testing
Mutation testing
 
API Testing: The heart of functional testing" with Bj Rollison
API Testing: The heart of functional testing" with Bj RollisonAPI Testing: The heart of functional testing" with Bj Rollison
API Testing: The heart of functional testing" with Bj Rollison
 
What is Regression Testing? | Edureka
What is Regression Testing? | EdurekaWhat is Regression Testing? | Edureka
What is Regression Testing? | Edureka
 
Criando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredCriando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssured
 
4 Major Advantages of API Testing
4 Major Advantages of API Testing4 Major Advantages of API Testing
4 Major Advantages of API Testing
 
Basic interview questions for manual testing
Basic interview questions for manual testingBasic interview questions for manual testing
Basic interview questions for manual testing
 
Arquitetura de Automação de Teste
Arquitetura de Automação de TesteArquitetura de Automação de Teste
Arquitetura de Automação de Teste
 
Black Box Test Design Techniques
Black Box Test Design TechniquesBlack Box Test Design Techniques
Black Box Test Design Techniques
 

Destaque

Destaque (12)

Transformação ágil ou transformação digital?
Transformação ágil ou transformação digital?Transformação ágil ou transformação digital?
Transformação ágil ou transformação digital?
 
Você precisa de um scrum master, um agile coach ou nenhum dos dois
Você precisa de um scrum master, um agile coach ou nenhum dos dois Você precisa de um scrum master, um agile coach ou nenhum dos dois
Você precisa de um scrum master, um agile coach ou nenhum dos dois
 
Intro a Testes Automatizados
Intro a Testes AutomatizadosIntro a Testes Automatizados
Intro a Testes Automatizados
 
ScrumMaster 3.0 - Apresentação no Agile Trends
ScrumMaster 3.0 - Apresentação no Agile TrendsScrumMaster 3.0 - Apresentação no Agile Trends
ScrumMaster 3.0 - Apresentação no Agile Trends
 
Agile portfolio management - Tools that help to reduce demand
Agile portfolio management - Tools that help to reduce demandAgile portfolio management - Tools that help to reduce demand
Agile portfolio management - Tools that help to reduce demand
 
Introdução a DevOps e Continuous delivery agileday
Introdução a DevOps e Continuous delivery   agiledayIntrodução a DevOps e Continuous delivery   agileday
Introdução a DevOps e Continuous delivery agileday
 
Testes automatizados - Agile Day
Testes automatizados -  Agile DayTestes automatizados -  Agile Day
Testes automatizados - Agile Day
 
Coding dojo
Coding dojoCoding dojo
Coding dojo
 
Ferramentas para auxiliar na gestão de portfolio e fazer a bola chegar redonda
Ferramentas para auxiliar na gestão de portfolio e fazer a bola chegar redondaFerramentas para auxiliar na gestão de portfolio e fazer a bola chegar redonda
Ferramentas para auxiliar na gestão de portfolio e fazer a bola chegar redonda
 
Desenvolvimento Ágil e a mudança de mindset envolvida
Desenvolvimento Ágil e a mudança de mindset envolvidaDesenvolvimento Ágil e a mudança de mindset envolvida
Desenvolvimento Ágil e a mudança de mindset envolvida
 
Ferramentas para auxiliar na gestão de portfolio e fazer a bola chegar redonda
Ferramentas para auxiliar na gestão de portfolio e fazer a bola chegar redondaFerramentas para auxiliar na gestão de portfolio e fazer a bola chegar redonda
Ferramentas para auxiliar na gestão de portfolio e fazer a bola chegar redonda
 
DevSecOps - Integrating Security in the Development Process (with memes) - Ma...
DevSecOps - Integrating Security in the Development Process (with memes) - Ma...DevSecOps - Integrating Security in the Development Process (with memes) - Ma...
DevSecOps - Integrating Security in the Development Process (with memes) - Ma...
 

Semelhante a Teste de Mutação (6)

Microcontroladores ARM Cortex M0+ Aplicação em robôs autoguiados - Resumo de ...
Microcontroladores ARM Cortex M0+ Aplicação em robôs autoguiados - Resumo de ...Microcontroladores ARM Cortex M0+ Aplicação em robôs autoguiados - Resumo de ...
Microcontroladores ARM Cortex M0+ Aplicação em robôs autoguiados - Resumo de ...
 
02 controle de fluxo
02   controle de fluxo02   controle de fluxo
02 controle de fluxo
 
Testing sucks
Testing sucksTesting sucks
Testing sucks
 
Como trabalhar com código legado
Como trabalhar com código legadoComo trabalhar com código legado
Como trabalhar com código legado
 
Polimorfismo
PolimorfismoPolimorfismo
Polimorfismo
 
Programação Orientada a Objetos - 001
Programação Orientada a Objetos - 001Programação Orientada a Objetos - 001
Programação Orientada a Objetos - 001
 

Último

Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
Natalia Granato
 

Último (6)

Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

Teste de Mutação

  • 1. Teste de mutação Luís Armando Bianchin Consultant Developer
  • 2. Agenda ● Problema ● O que é teste de mutação? ● Exemplos ● Por que? ● Ferramentas ● Uso num projeto real
  • 3. Problema ● Os testes estão corretos? ● Cobrem todos requisitos? ● Qual a qualidade dos testes?
  • 4. Problema ● Cobertura de linhas apenas verifica execução de código ● 100% de cobertura != boa suite de testes ● Apenas testes "happy path" ou fáceis ● Código apenas parcialmente testado
  • 5. Os testes são capazes de detectar falhas?
  • 6. Origem ● Proposto na Academia ~ 1978 ● Yale University e Georgia Institute of technology ● Hipótese do programador competente ○ Programas quase perfeitos ○ Falhas pequenas ○ Pequenas alterações para correção
  • 7. O que é teste de mutação? ● Introduz falhas (mutações) na implementação ○ Alterações semânticas ● Roda os testes ● Os testes realmente quebraram? ● Mutações mortas ou vivas? ● Os testes identificaram as falhas?
  • 8. Exemplo Mutação de troca de && para || if (a && b) { c = 1; } else { c = 0; } if (a || b) { c = 1; } else { c = 0; }
  • 9. Efeito colateral não testado @Test public void shouldFailWhenGivenFalse() { assertEquals("FAIL", foo(false)); } @Test public void shouldBeOkWhenGivenTrue() { assertEquals("OK", foo(true)); } public static String foo(boolean b) { if ( someThing(i) ) { doImportantBusinessLogic(); return "OK"; } return "FAIL"; } Não verifica se doImportantBusinessLogic foi chamado
  • 10. Teste de limite incompleto @Test public void shouldReturnBarWhenGiven1() { assertEquals("bar", foo(1)); } @Test public void shouldReturnFooWhenGivenMinus1() { assertEquals("foo", foo(-1)); } public static String foo(int i) { if ( i >= 0 ) { return "foo"; } else { return "bar"; } } O comportamento quando i==0 não foi testado
  • 11. Mockista Míope @Test public void shouldPerformActionGivenTrue() { foo(mockCollab, true); verify(mockCollab).doAction(); } @Test public void shouldNotPerformActionGivenFalse() { foo(mockCollab, false); verify(never(),mockCollab).doAction(); } public static String foo(Collaborator c, boolean b) { if ( b ) { return c.doAction(); } return "FOO"; } Retorno da função nunca foi testado
  • 12. Operadores de mutação ● Exclusão de declarações ● Duplicação ou inserção de declarações ● Negação de subexpressões booleanas ● Substituições: ○ Operadores aritiméticos (+, -, *, /) ○ Relações booleanas (==, !=, <, <=, >, >=) ○ Variáveis do mesmo escopo (tipos devem ser compatíveis) Escore de mutação = № de mutantes mortos / № total de mutantes
  • 13. Por que? ● Ajuda a criar suítes de teste efetivas ● Propósito educacional ● Mostra quanto pode-se confiar numa suite de teste ○ Código legado ● Ajuda na refatoração e na criação de testes de caracterização ● Verificar se alguma implementação está bem testada
  • 14. O que não resolve? ● Caro para gerar e executar mutantes ● Limitado aos operadores de mutação ● Útil para teste unitários (doing things right) ● Ainda devem existir testes funcionais (doing the right things)
  • 15. Ferramentas ● PIT for Java ● Mutant for Ruby ● PyMuTester for Python
  • 17. Fontes ● http://pitest.org/ ● http://solnic.eu/2013/01/23/mutation-testing-with-mutant. html ● http://en.wikipedia.org/wiki/Mutation_testing ● https://github.com/mbj/mutant ● http://www.parasoft.com/products/article.jsp? articleId=291 ● http://www.techopedia.com/definition/20905/mutation-testing
  • 18. Perguntas? Luís Armando Bianchin labianchin@thoughtworks.com