É bom evitar testar as classes base?

15

Eu tenho uma classe base com uma boa quantidade de "meta programação" para dar a flexibilidade / abstração necessária para ser bastante genérica.

Eu tenho muitas subclasses usando os métodos comuns na classe base e tenho testes de unidade orientados a comportamento que cobrem todos os casos em cada subclasse.

É possível pular o teste da classe base?

Nathan
fonte
1
Uma coisa que às vezes faço quando começo a me fazer essa pergunta é tentar quebrar o código. Jogue entrada inválida nele, especifique valores de configuração incorretos, etc.
Zymus 30/07/2015

Respostas:

31

Para verificar se você possui testes suficientes ou não, verifique a cobertura do código e a cobertura da ramificação induzida pelos testes (talvez usando uma ferramenta de cobertura, talvez manualmente revendo os caminhos do código ou usando um depurador).

Se você chegar à conclusão de que os testes para as subclasses oferecem uma cobertura alta o suficiente para o código das classes base, então adicionar testes adicionais obviamente não trará muitos benefícios. Por outro lado, se houver caminhos de código que você só pode testar adicionando testes específicos usando a classe base diretamente, você deve seguir esta rota.

Outro motivo possível para "testar sua classe base diretamente" é que você deseja testar uma função específica dessa classe "isoladamente". Às vezes, pode ser mais fácil projetar casos de teste diretamente para um método específico, em vez de apenas testar esse método indiretamente, chamando os métodos de suas subclasses que usam esse método.

Note que quando você tem uma classe base genérica para que o cenário de uso típico é para derivar uma subclasse, a sua classe base é provavelmente abstrato. Portanto, para testar essa classe, você precisa fazer uma derivação de qualquer maneira. Para essa situação, testar "a classe base diretamente" pode significar adicionar uma derivação especial apenas para fins de teste, é claro.

Doc Brown
fonte
Sim, concordo com testes de unidade diretos na classe base para os métodos definidos de forma mais tangível. O que eu não queria fazer era testar toda a metaprogramação, já que os testes de unidade nas subclasses testam implicitamente essas coisas.
29715 Nathan
4
Projetar uma classe que estende a classe base / abstrata que existe apenas no diretório de teste e serve apenas para expor / instanciar a classe base é uma abordagem perfeitamente legítima e razoável para obter a cobertura apropriada da classe base e garantir que os métodos subjacentes sejam funcionando corretamente isolando as classes mais complexas usadas.
@ MichaelT: sim. Minha resposta parece ter uma opinião diferente sobre isso?
Doc Brown
@DocBrown nem um pouco - você claramente articulou esse ponto. Eu estava apenas adicionando explicações adicionais que eu teria escrito em minha própria resposta (se você ainda não tivesse declarado isso). Eu não quero escrever uma resposta que teria começado "Eu concordo com tudo Doc disse, mas quero chamar especificamente para fora e escrever mais sobre ..."
2

O teste automatizado foi criado para o benefício dos programadores, não foram criados para atender aos testes.

Temos testes para nos tornar mais produtivos e reduzir o número de "problemas" que os clientes reclamam.

Portanto, considerando que você tem testes de unidade orientados ao comportamento, cobrindo todos os casos em cada subclasse, não há benefício para o cliente que também está testando a classe base diretamente. Isso pode ser confirmado alterando algum código na classe base e ver se um teste falha, por exemplo, separar uma linha de código ou adicionar um "não" a uma "se". (Apenas verificar se todas as linhas de código estão cobertas pelos testes não é bom o suficiente.)

Ficamos então perguntando se o teste o tornaria mais produtivo . Isso pode acontecer de algumas maneiras.

  • Deixando você pensar mais claramente sobre o código - conforme o código é escrito, é improvável neste caso.
  • Permitindo que você teste algum código da classe base isoladamente, faça uma depuração mais rápida, mais uma vez improvável no caso em que o código já está funcionando.
  • Permitindo alterar o código na classe base sem ter que entender os detalhes da lógica nas subclasses - talvez se você estiver refatorando o código ???

Portanto, como as subclasses estão funcionando, não vejo sentido em escrever testes diretos para a classe base. Não é o dia de hoje, que não haveria benefícios em escrever esses testes logo no início.

Ian
fonte