Eu preciso de 100% de cobertura de testes?

Mito: não ter 100% de cobertura é a mesma coisa que nada!

Muitas pessoas discutem a necessidade de ter 100% de cobertura em um código. Mas não vejo problemas em códigos que não tenham 100% de cobertura de testes de unidade.

Acredito que isso deve ser uma meta da equipe, buscar sempre a maior cobertura possível; mas essa é uma meta que você provavelmente não vai alcançar; alguns trechos de código simplesmente não valem a pena serem testados de maneira isolada!

Explico: Veja essa classe do Restfulie.NET, por exemplo, chamada AspNetMvcUrlGenerator: ela serve para gerar URLs para Actions em Controllers, utilizando as rotas pré-definidas. Repare que ela faz uso intenso das APIs do Asp.Net MVC, utilizando inclusive alguns métodos estáticos (que sabemos que é difícil de testar) como no HttpContext.

public class AspNetMvcUrlGenerator : IUrlGenerator
    {
        public string For(string controller, string action, IDictionary values)
        {
            var httpContextWrapper = new HttpContextWrapper(HttpContext.Current);
            var urlHelper = new UrlHelper(new RequestContext(httpContextWrapper, 
              RouteTable.Routes.GetRouteData(httpContextWrapper)));

            return FullApplicationPath(httpContextWrapper.Request) + 
              urlHelper.Action(action, controller, new RouteValueDictionary(values));
        }

        private string FullApplicationPath(HttpRequestBase request)
        {
            var url = request.Url.AbsoluteUri.Replace(request.Url.AbsolutePath, 
               string.Empty) + request.ApplicationPath;
            return url.EndsWith("/") ? url.Substring(0, url.Length - 1) : url;
        }
    }

Eu até poderia ter feito alguma mágica e escrito um teste de unidade para esse código. Mas para quê? Apenas para aumentar o número? Não faz sentido! Esse trecho de código precisa de um teste de integração, e não de um teste de unidade!

Um outro exemplo é o teste de propriedades (Properties do C#). Preciso realmente deles? A própria linguagem implementou isso pra mim. O mesmo acontece no caso dos getters/setters do Java, onde o programador geralmente usa o Eclipse para gerá-los.

Você precisa cobrir seu código de testes, mas você pode usar testes de diferentes níveis para isso (testes de unidade, de integração, de sistema, etc)! Escrever testes de unidade inúteis, apenas para chegar nos 100% de cobertura, é desperdício.

5 thoughts on “Eu preciso de 100% de cobertura de testes?

  1. Pingback: Tweets that mention Mauricio Aniche » Eu preciso de 100% de cobertura de testes? -- Topsy.com

  2. Alberto Souza

    Concordo :). Acho que todo teste feito deve agregar valor, se testar o setter ou coisa parecida agregar valor, tiver alguma lógica ou algo parecido, talvez valha a pena, caso contrário deixa para lá. Alguma pessoa, em algum lugar falou: o ótimo é inimigo do bom. Quase tudo em excesso estraga :).

    Reply
  3. mauricioaniche Post author

    Oi Thiago,

    Não vejo tanta regra de negócio ali. Acho que o contrato da classe é bem simples; ela deve retornar a URL para um determinado controlador e ação. Repare que a implementação é basicamente uma sequência de invocações da API do Asp.Net Mvc.

    E sim, ela é testada. Mas não por um teste de unidade. Se eu escrevesse um teste de unidade para ela, passando mocks pra ela, qual seria meu feedback? Que eu chamei as funções na ordem certa? É muito pouco para um teste muito chato de escrever. Prefiro testar isso direto na integração.

    Faz sentido?

    Além disso, não entendi sua relação entre o teste e o Broken Window Theory. Poderia explicar?

    Reply
  4. Rafael Ponte

    Mauricio,

    Antes de mais nada eu concordo com seu post, ter menos de 100% não é crime nenhum.

    O que tenho percebido em equipes sem experiência com testes automatizados é que a falta de qualquer tipo de meta/métrica não ajuda de uma forma geral, principalmente no inicio do projeto. Explico, um programador precisa saber o que testar e até onde testar, utilizando uma meta/métrica de 100% de cobertura já o ajuda a saber até onde ir e se o teste que ele escreveu está cobrindo boa parte do seu código da aplicação.

    Depois desse tempo de “maturação” a equipe passa a deixar um pouco de lado as métricas e seguir o “feeling” do que é realmente importante testar, como testar (unidade ou integração, por exemplo) e até onde testar. Ou seja, a métrica de 100% de cobertura passa a ficar em segundo plano, pois o programador já adquiriu maturidade suficiente para escrever melhores testes (tanto em qualidade quanto em cobertura).

    Enfim, excelente post, acho que este é um papo bacana que seria melhor acompanhado de uma boa cerveja. No QCONSP2011 nós conversaremos mais!

    Acredito que você já tenha visto esse vídeo do Uncle Bob, mas segue o link: http://cleancoder.posterous.com/100-test-coverage

    Um abraço.

    Reply

Leave a Reply

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