Encontrar testes de unidade inúteis com poço

Suponha que temos um código que gostaríamos de testar.
class C {
    int doSmth() {
        return 1;
    }
}
Agora assume que temos dois testes de unidade colocados numa única classe. O primeiro "testa tudo" enquanto o segundo "não faz nada":

@RunWith(JUnit4.class)
public final class CTest {

    @Test
    @SuppressWarnings("static-method")
    public void testDoSmth() {
        assertEquals(1, new C().doSmth());
    }

    @Test
    @SuppressWarnings("static-method")
    public void testDoSmth2() throws Exception {
        Thread.sleep(1000);
    }
}
Este é um exemplo IRL: vi dezenas de testes "corrigidos" substituindo o conteúdo do teste por algum código inútil. , como o contrato de código que está sendo testado muda ao longo do tempo.

a unidade PIT "entry" é uma classe que contém métodos de ensaio (não um método de ensaio individual)., então em o PIT de caso acima mostrará não só cobertura de linha de 100%, mas também cobertura de mutação de 100%.

Estou aliviado por saber que tenho 100% de cobertura de mutação., mas como é que identifico um teste inútil -- testDoSmth2() no caso acima (desde que a minha cobertura de mutação seja alta)?

Author: Bass, 2015-02-27

1 answers

[[1]} não há nada atualmente construído para pitest, mas os dados que você precisa para detectar inúteis (em termos de detecção de falhas) testes está lá.

O relatório XML produz o teste de occisão para cada mutação (frequentemente ao nível de um método de ensaio). Qualquer teste que não mate uma mutação pode ser removido sem afetar a Pontuação da mutação.

É claro que os testes que não matam uma mutação ainda podem ser valiosos por outras razões, por exemplo, descrever o que uma unidade faz.

O extremo caso mostrado no seu exemplo seria, no entanto, detectado de forma mais eficiente pela análise estática - o teste claramente não exerce qualquer código, então não pode possivelmente detectar falhas nele

 5
Author: henry, 2015-02-27 22:49:17