Classes de utilitário de teste de unidade


10

Todos nós temos algumas classes de utilitários, que contêm apenas métodos estáticos, para uso em diferentes fontes. Agora, pode haver duas abordagens que podem ser adotadas para testar esse trecho de código.

Abordagem 1:

Faça testes de unidade separados para classes de utilidade. Onde quer que estejam sendo chamados, zombe de sua interação usando alguma estrutura de teste que tem provisões para ela, como o PowerMock. Isso basicamente trata a classe de utilitário como um componente separado do sistema, que precisa ser testado e mantido individualmente.

Abordagem 2:

Não escreva testes de unidade para classes de utilidade. No entanto, os testes que são escritos para as outras classes principais que interagem com essa classe de utilitário permitem que essa interação ocorra, o que garantirá intrinsecamente que o código escrito nessa classe de utilitário seja testado adequadamente para diferentes casos de uso. Se algo quebrar, os testes para outros componentes devem ser capazes de capturá-lo.

Compartilhe seus pensamentos sobre qual abordagem é preferível ou se há alguma outra maneira pela qual as pessoas fazem isso.


1
Relacionado: Serviços estáticos e testabilidade : “Se uma função é pura, você pode testá-la diretamente apenas uma vez e usá-la em outro código, sabendo que funcionará. Isso geralmente se aplica apenas a métodos utilitários pequenos ou quando você está fazendo uma programação funcional estrita. Se o serviço fornecido por esse método estático for mais complexo, o uso de técnicas de injeção de dependência se tornará desejável. ” De qualquer forma, testes diretos de métodos estáticos públicos fazem sentido.
amon

Respostas:


7

Eu acho que há um grande mal-entendido sobre classes de 'utilidade' por aí. Só porque você torna uma classe 'estática', ela não a torna uma classe utilitária. Se sua classe de utilidade estática tiver dependências (que podem se manifestar em outras classes de 'utilidade' estáticas), ela introduzirá efeitos colaterais ou seu comportamento não poderá ser completamente controlado por suas entradas, não é uma classe de utilidade.

As verdadeiras classes de utilidade não precisam ser ridicularizadas porque sua saída é sempre determinística, dependendo de suas entradas.

O teste de unidade consiste em instanciar uma pequena parte do seu aplicativo (uma unidade) isoladamente, para que você possa (potencialmente) testar todos os caminhos de código nessa unidade. Mocking dependências atinge esse isolamento. Se uma classe de utilitário interrompe o isolamento, novamente não é uma classe de utilitário porque uma classe de utilitário deve ser isolada por definição.

Portanto, em um aplicativo nunca se deve querer ou ter que zombar de classes de utilidade. As classes que você sente que precisam ser ridicularizadas precisam ser transformadas em classes instantâneas de primeira classe e precisam ser passadas para a unidade como uma dependência (consulte Injeção de Dependências ). Essas dependências podem ser facilmente zombadas para que a unidade possa ser testada isoladamente.


19

Na minha opinião, é ridículo zombar de uma dependência de um método de utilidade estática para coisas como a divisão de cadeias.

Sim, se o método do separador estiver errado, poderá causar falhas espúrias nos testes de métodos que não tratam da divisão de cadeias. Mas esse não é o objetivo de uma suíte de testes. O conjunto de testes deve ter sucesso 100%, ponto final. Caso contrário, conserte o que está quebrado e repita até que ele tenha sucesso a 100%. Se a classe String Utility é quebrado, ele deve imediatamente causar uma falha em um teste que é sobre a funcionalidade string. Você corrige essa funcionalidade e todas as falhas desaparecem, para que você nunca precise examinar os casos de teste com falhas espúrias.

Em outras palavras, SIM, escreva testes para métodos utilitários. NÃO, não tente separá-los de outros testes. Simplesmente assuma que funções triviais de utilidade funcionam corretamente, conforme verificado por seus próprios testes. Fazer mais alguma coisa é mais esforço, sem nenhum ganho.


Só para ter certeza, você está preferindo a abordagem 2 ao invés de 1, certo?
Ahmad Fadli

1
@AhmadFadli Não, ele está dizendo que a abordagem 3 é a melhor: escreva testes para funções utilitárias e não zombe deles em outros testes.
FINDarkside

@AhmadFadli, "Em outras palavras, SIM, escreva testes para métodos utilitários. NÃO, não tente dissociá-los de outros testes", isso significa a opção segundo 2, eu acho. Ou seja, escrever um teste que utiliza métodos de classe de serviço público, mas não escreve testes insolação específico para um método Utility
Farid
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.