Java: Testes de Mutação

Aumentando a confiança no código através de testes de mutação em Java 24 de janeiro de 2023

Testes de mutação em Java: uma técnica avançada para garantir a qualidade do código

Os testes de mutação são uma técnica de teste de software que consiste em modificar intencionalmente o código fonte de uma aplicação e, em seguida, executar testes automatizados para verificar se essas modificações foram detectadas e corrigidas corretamente. Eles são usados para aumentar a confiança no código e na cobertura dos testes, pois ajudam a garantir que as modificações intencionais no código sejam detectadas e corrigidas.

Existem várias ferramentas de teste de mutação disponíveis para Java, como o PIT, o Major, o Mutator e o Javalanche. Essas ferramentas funcionam de maneira semelhante, gerando automaticamente variantes do código fonte da aplicação e, em seguida, executando testes automatizados para detectar se essas variantes foram corrigidas corretamente.

Para usar uma dessas ferramentas, é necessário escrever testes automatizados para a aplicação e configurar a ferramenta de teste de mutação para usar esses testes. Em seguida, a ferramenta gera automaticamente variantes do código fonte e executa os testes automatizados para verificar se essas variantes foram corrigidas corretamente.

Um exemplo de um teste unitário que funciona, mas quebra no teste de mutação, pode ser o seguinte:

Calculator:

public class Calculator {
  public int add(int a, int b) {
    return a + b;
  }
}

CalculatorTest:

public class CalculatorTest {
  @Test
  public void testAdd() {
    Calculator calculator = new Calculator();
    int result = calculator.add(1, 2);
    assertEquals(3, result);
  }
}

Esse teste unitário testa o método add() da classe Calculator e verifica se ele retorna o resultado esperado quando é chamado com os valores 1 e 2. Ele passa com sucesso quando é executado normalmente. No entanto, se esse código for submetido a um teste de mutação, ele pode quebrar. Isso ocorre porque a ferramenta de teste de mutação pode modificar o código da seguinte maneira:

public class Calculator {
  public int add(int a, int b) {
    return a - b;
  }
}

Neste caso, a ferramenta de teste de mutação mudou a operação de soma para subtração. O teste unitário ainda passará, mas a função add não estará mais funcionando corretamente.

Para corrigir esse problema, podemos adicionar outros testes para garantir que a função add funciona corretamente independentemente da operação matemática utilizada.

public class CalculatorTest {
  @Test
  public void testAdd() {
    Calculator calculator = new Calculator();
    int result = calculator.add(1, 2);
    assertEquals(3, result);
  }
  @Test
  public void testAddNegative() {
    Calculator calculator = new Calculator();
    int result = calculator.add(-1, -2);
    assertEquals(-3, result);
  }
  @Test
  public void testAddZero() {
    Calculator calculator = new Calculator();
    int result = calculator.add(0, 0);
    assertEquals(0, result);
  }
}

Dessa forma, se a ferramenta de teste de mutação mudar a operação matemática para subtração, os testes ainda irão detectar a falha e assim garantir que a função add está funcionando corretamente.

Além disso, existem outras técnicas que podem ser usadas para melhorar a confiabilidade dos testes de mutação. O uso de testes de cobertura de código é uma delas, pois permite verificar se o código está sendo testado adequadamente e se há áreas que precisam ser melhoradas. Além disso, configurar regras de mutação específicas também é uma boa prática, pois permite que você se concentre em áreas específicas do código que podem ser mais propensas a erros. As ferramentas de teste de mutação geralmente oferecem suporte a essas técnicas, tornando-as fáceis de implementar e usar.

É importante lembrar que os testes de mutação não são uma solução mágica para garantir a qualidade do código e não devem ser usados como uma única forma de testar a aplicação. Eles devem ser usados em conjunto com outras técnicas de teste, como testes de unidade, testes de integração e testes de aceitação, para garantir que a aplicação esteja completamente testada e livre de erros.

Um grande abraço e até o próximo post!

Compartilhar: Twitter Facebook LinkedIn VK Reddit