Testes de Mutação - Testes para Testar seus Testes

Testes de Mutação - Testes para Testar seus Testes

Como podemos garantir que nossos testes realmente estão pegando possíveis falhas em nosso código?
100% de cobertura é suficiente?
Nesta palestra apresento o conceito de Testes de Mutação (tradução livre do termo Mutation Tests), que é uma técnica que permite detectar possíveis falhas em nosso código que não seriam cobertas por nossos testes.

63579c5a873f3ab6abff10803e9a252f?s=128

Vinicius Dias

August 24, 2019
Tweet

Transcript

  1. Testes de Mutação Testes para Testar seus Testes

  2. Quem é Vinicius Dias? • Zend Certified (PHP) Engineer; •

    iMasters Certified PHP Professional; • Um dos administradores do PHP Rio; • Desenvolvedor Full Stack na TemboSocial; • Instrutor na Alura Cursos Online; • LinkedIn: https://linkedin.com/in/vinícius-dias/ • GitHub: https://github.com/CViniciusSDias • Twitter: @cviniciussdias • Dev.to: https://dev.to/cviniciussdias/ • YouTube: Programando com Vinicius Dias
  3. Programando com Vinicius Dias https://www.youtube.com/ProgramandoComViniciusDias

  4. Dê feedback Os palestrantes gostam de saber como melhorar suas

    apresentações Nenhuma apresentação é perfeita e nós que criamos conteúdo sabemos disso. Nossa intenção é passar conteúdo da melhor forma possível e sua opinião é muito importante para isso.
  5. Quis custodiet ipsos custodes? Quem irá vigiar os próprios vigilantes?

  6. Como garantir que seus testes realmente detectam falhas no código?

  7. None
  8. None
  9. Testes passando são o suficiente?

  10. None
  11. Como garantir que há teste para todo meu código?

  12. Cobertura de Código

  13. None
  14. Estes testes realmente detectam possíveis falhas?

  15. Mudando de > para >=

  16. None
  17. Calculando imposto errado? Problemas com clientes?

  18. Criar teste que cubra a possível falha

  19. Testando mutações

  20. None
  21. Mutações comuns • Mudar limite de condicional (< para <=

    ou > para >=); • Inverter condicional (< para > ou > para <); • Negar condicional (== para !=); • Remover condicional (mudar para if (true)); • Retirar chamada a algum método; • Mutação no retorno (trocar retorno por null); • Inteiros 0-1 1-0 (mudar 0 para 1 e 1 para 0); • Etc.
  22. Possíveis resultados 1. Se um código mutado (ou o mutante)

    passou em todos os testes; 2. Se um mutante fez algum teste quebrar; 3. Se a mutação deste mutante não foi executada por nenhum teste; 1. Significa que este código mutado (ou o mutante) escapou; 2. Significa que o mutante foi morto; 3. Significa que este mutante não está coberto por nenhum teste;
  23. Adicionar várias mutações manualmente?

  24. None
  25. Infection PHP

  26. None
  27. Primeira execução da ferramenta

  28. Saída do comando

  29. Métricas

  30. Mutation Score Indicator (MSI)

  31. Fórmula de cálculo do MSI

  32. Mutation Code Coverage

  33. Fórmula de cálculo do MCC

  34. Covered Code MSI

  35. Fórmula de cálculo

  36. Analisando os mutantes

  37. Arquivo gerado pelo Infection PHP

  38. Personalizando a execução

  39. infection.dist.json

  40. Arquivos gerados pelo Infection PHP • Text log: Informações detalhadas

    sobre os mutantes e seus resultados • Summary: Breve resumo do resultado da execução • Per mutator: Resumo do resultado da execução separado por cada Mutator
  41. Desvantagens

  42. Falsos positivos

  43. Mutantes equivalentes

  44. Cada mutante faz rodar toda a suíte de testes completa

  45. Suíte grande: Bota pra rodar e vai tomar um café,

    ou deixa pro servidor de CI. ;-)
  46. Referências • https://blog.caelum.com.br/testes-de-mutantes/ • https://infection.github.io/ • https://infection.github.io/guide/mutators.html • https://www.guru99.com/mutation-testing.html •

    https://twitter.com/infection_php • https://github.com/infection/infection/ • https://medium.com/@maks_rafalko/infection-mutation-testing-framework- c9ccf02eefd1
  47. Avalie e dê feedbacks sinceros https://bit.ly/testes-mutacao

  48. Valeu!