Não teste fluxos!

Recebi esses dias um e-mail bastante interessante. A pergunta era: devo ou não devo testar o código abaixo?

A pergunta é bastante válida, afinal podemos pensar em dois caminhos diferentes para testar esse código:

  • Fazer um teste de integração, batendo no banco de dados de verdade. Assim, garantiríamos que o salva() realmente funciona.
  • Fazer um teste de unidade, mockar o DAO, e garantir que a regra de validação funciona, e que o salva() é invocado.

A minha abordagem seria: não teste!

Quando o código basicamente controla fluxo, eu evito testá-lo com testes de unidade. Simplesmente não faz sentido. Você vai ficar apanhando com mocks, e no fim, vai só garantir que os métodos são invocados na ordem certa.

Nesse código em particular, eu preferia mover a função valida() para uma classe separada, e testá-la isoladamente. O DAO também teria um teste para o salvar(). E o código acima, que apenas controla o fluxo não teria testes de unidade.

Mas como eu o testaria? Se for uma aplicação web, esse código provavelmente estaria em um controlador. Aí, eu prefiro testar via teste de sistema. Aliás, o argumento que dei aqui é o mesmo que dou para quando digo que também não testo controladores de maneira isolada.

7 thoughts on “Não teste fluxos!

  1. Renan Aragão

    Boa tarde Aniche,

    Testar um método que controla um fluxo não seria uma forma de garantir que o fluxo está sendo seguido?
    Por exemplo um Facade?

    Reply
    1. mauricioaniche Post author

      Oi Renan,

      Sim, você tem que testar isso. Mas eu prefiro fazer por meio de testes de sistema. Faz sentido?

      Reply
  2. Pedro

    Mauricio, boa tarde.

    O que você quis dizer com Testes de Sistema?

    “Aí, eu prefiro testar via teste de sistema.”

    Abraço

    Reply
  3. Clayton A. Alves

    Aniche, discordo.

    Pelo que entendi a função validarAluno irá lançar uma exceção no caso de um aluno não válido. Sendo assim, poderia ser criado um teste que verificasse se essa exceção é disparada ou não.

    Ou estou equivocado ?

    Reply
    1. mauricioaniche Post author

      Oi Clayton,

      Não sei se deixei claro no post, mas nesse caso, eu extrairia a regra de validação para uma classe separada, e faria todos os testes de unidade necessários. A classe principal teria agora apenas fluxo, e eu não a testaria com testes de unidade.

      Faz sentido?

      Reply
      1. Clayton A. Alves

        Acho que compreendi.

        Neste caso, o que está sendo realmente testado não é o método salvarAluno e sim o processo de validação.

        Sendo assim, faz todo o sentido que o objeto do teste seja a classe de validação.

        Reply

Leave a Reply

Your email address will not be published. Required fields are marked *