Este repositório demonstra como realizar testes de mutação utilizando a biblioteca Infection, com o propósito de identificar brechas em testes automatizados e melhorá-los.
Teste de mutação consiste em realizar pequenas alterações no código fonte, a fim de verificar se os testes criados para aquela funcionalidade continuam passando, caracterizando um falso positivo.
- Infection:
composer require --dev infection/infection
- PHPUnit:
composer require --dev phpunit/phpunit
Dado uma função que realiza uma simples operação de soma:
function somar(int $a, int $b): int {
return $a + $b;
}
Dado a criação do teste:
class MathTest extends \PHPUnit\Framework\TestCase
{
public function testSum()
{
// When
$value = somar(1,0);
// Then
$this->assertEquals(1, $value);
}
}
Temos a falsa impressão de que o teste criado é suficiente, porém existe um problema, se algum desenvolvedor
alterar o comportamento da função somar
mudando o operador +
por -
, o teste continuaria funcionando,
porém essa alteração criaria bugs na aplicação.
Para identificar essas brechas em testes automatizados, é utilizado testes de mutação, que faria esse trabalho de mudar partes do código (apenas em memória) e aplicar os testes do PHPUnit, a fim de encontrar esses casos de falso positivo e gerar um relatório deles, facilitando a correção.
Testes comuns com PHPUnit: composer test
Testes de mutação: composer test-mutant
Após rodar os teste mutantes, será apresentado no console a porcentagem de mutantes encontrados,
e um log mais detalhado estará disponível em tests/infection-result.log
.
É importante ressaltar que testes de mutação são pesados, pois é aplicado os testes a cada modificação, então devem ser aplicados em momentos propícios.