Quem testa os testes? Ou melhor, como saber se os testes automatizados estão suficientemente confiáveis? Os testes de mutantes são uma forma curiosa e cada vez mais viável de se fazer isso.
Os testes de mutante são feitos para avaliarem a qualidade da bateria de casos de testes automatizados. A ideia principal é modificar, ou melhor, mutar uma pequena parte de código a ser testado e verificar se o teste automatizado irá detectar esta mutação. Caso não detecte, isso demonstrará que o teste automatizado não acompanha a complexidade do código e está com uma cobertura ruim, podendo deixar outros aspectos sem teste.
Quando os testes detectam e rejeitam a mutação isso é chamado de “matar” um mutante, quando não o fazem, o mutante continua “vivo”. Teoricamente, quando temos casos de testes perfeitos nenhum mutante sobreviveria.
Quanto mais mutações uma suíte de testes “mata”, maiores são as chances de que o código produzido tenha sido bem escrito e totalmente coberto por testes sólidos.
Os testes de mutante nasceram nos anos 70, mas apenas conseguiram espaço recentemente, graças ao avanço da complexidade computacional. Porém, na época, criar cenários com todos os mutantes possíveis era muitíssimo demorado, por isso era inviável esta abordagem na prática. Hoje, com os avanços computacionais, a prática está deixando o mundo acadêmico e ganhando espaço no mercado.
As ferramentas de testes de mutantes mais conhecidas são Jumble, Jester, Major, muJava e PIT, sendo esta última a mais desenvolvida. A principal função destas ferramentas é a introdução de operadores de mutação, que são as mutações aplicadas no código, os 7 operadores padrão são:
- Conditionals Boundary Mutator
- Increments Mutator
- Invert Negatives Mutator
- Math Mutator
- Negate Conditionals Mutator
- Return Values Mutator
- Void Method Calls Mutator
Os resultados dos testes de mutantes podem revelar falhas na cobertura do teste. Entretanto, a de se levar em consideração que uma cobertura completa não é garantia de um teste com alta qualidade. O teste mesmo “matando” todas as mutações ainda pode ainda ter falhas no seu código, deixando a desejar na averiguação de pontos chaves.
Os testes de mutantes são uma solução antiga que voltaram a ganhar força recentemente. Com o avanço cada vez mais significativo na capacidade de processamento, ainda existe mais espaço para crescimento e inovação. Vale a pena ficar atento.