Testes Unitários: Vale a pena Investir?

Salve pessoal!!!

Há algum tempo eu tenho trabalhado com Testes Unitários e então resolvi criar uma série de artigos para compartilhar conhecimentos sobre os mesmos. Para começar nossa série, dedico este artigo para apresentar o conceito de Teste unitário, indicar seus benefícios, riscos quando não são adotados e meu ponto de vista sobre a viabilidade em investir nele. Sem mais delongas… vamos para o que interessa!

Introdução: Afinal, o que é um teste unitário?

 

O Teste Unitário ou Teste de Unidade é uma modalidade de testes que se concentra na verificação do menor elemento estável de um software. O teste de uma unidade lógica é realizado com dados suficientes para testar o fluxo lógico do software em questão visando a redução de defeitos e aumentar significamente a qualidade do produto final.

Como um Teste Unitário funciona?

A implementação dos testes acontece de maneira isolada. Tipicamente é feito por desenvolvedores (embora analistas de testes possam implementá-lo também) as unidades (métodos ou mesmo classes)  são codificadas para testar diversos comportamentos como: Validação/invalidação de dados, o fluxo lógico ou mesmo regras de negócio.

As principais tecnologias do mercado como Java, PHP, .NET, Ruby entre outras oferecem uma boa variedade de ferramentas ou frameworks para facilitar e otimizar o processo de codificação dos testes. Como exemplo podemos citar o JUnit, TesteNG para Java, PHPUnit e SimpleTest para PHP ou o Entity Framework para .NET.

Mesmo sendo implementadas isoladamente, as unidades de teste podem ser executadas em uma sequência lógica para testar determinada funcionalidade ou conjunto de funcionalidades que atendam a uma regra de negócio específica da aplicação. Esta organização é definida executada em um teste mais abrangente conhecido como Teste de Integração.

Que vantagens os Testes Unitários podem proporcionar ao projeto?

Implementar Testes Unitários pode proporcionar diversos benefícios no desenvolvimento e sucesso do projeto. Entre estas vantagens podemos destacar:

Teste reduz defeitos

Os Testes Unitários são codificados e executados durante a fase de desenvolvimento. Assim a percepção de defeitos se torna mais evidente e as chances dos defeitos avançarem para as etapas seguintes do ciclo de vida do Software torna-se mais difícil.

Teste reduz custos

Reafirmando o item anterior, o tempo utilizado para corrigir de defeitos é convertido em tempo produtivo. Além da redução do tempo para desenvolver o projeteto os custos para o desenvolvimento do mesmo são reduzidos significativamente o que consequentemente é convertido em lucro.

 Teste reduz o medo de mudar

Mudanças no sistema (principalmente alterações com complexidade de grau médio ou alta) provocam medo nos desenvolvedores pois as mesmas podem criar defeitos complexos em funcionalidades já existentes.  Com a implementação de testes unitários e a realização de testes combinados a outros testes unitários (Teste de integração) os possíveis defeitos podem ser previnidos e evitados o que consequentemente trás mais confiança a equipe em relação a mudanças no escopo do projeto.

 Teste torna o desenvolvimento mais rápido

Estudos comprovam que implementar testes unitários em um projeto torna o desenvolvimento do projeto mais rápido. Segundo Giovanni Bassi (consultor da empresa Lambda 3), a produtividade ao longo do tempo em um projeto desenvolvido sem testes tem uma leve redução de produtividade nas primeiras fases do projeto (entre a especificação e o início do desenvolvimento). Durante o desenvolvimento ou mesmo nas fases de testes (onde normalmente os defeitos são identificados) a produtividade pode ser reduzida de modo exponencial até atingir uma constante de baixa produtividade ao fim do processo de desenvolvimento.

 O gráfico abaixo elaborado por Giovani Bassi faz um comparativo de produtividade de um projeto desenvolvido sem testes e outro sem testes:

Gráfico: Produtividade ao longo do Projeto

Testes são “documentação executável”

Principalmente quando desenvolvidos em fábrica de Software, os Testes Unitários podem ser definidos a partir de documentações como caso de uso ou mesmo cenários de casos de teste. Quando o teste é bem elaborado, a partir dele o desenvolvedor consegue entender como determinada funcionalidade (unidade) é definida e qual o comportamento esperado.

Testes libertam

Quando defeitos são identificados através dos testes, o trabalho de correção torna-se bem mais simples e efetivo. Isto “liberta” a equipe de cansativos re-trabalhos que desgastam os ânimos da equipe além de reduzir considerávelmente a produtividade.

 Testes esclarecem

Adotando testes unitários a identificação de defeitos é muito mais rápido. Até mesmo a identificação de defeitos mais “crônicos”  como queda de performance, sobrecarga de tráfego entre outros são identificados ou previnidos mais facilmente.

 Testar é divertido

Todo bom desenvolvedor se preocupa com a qualidade de seu código. Através dos testes é possível avaliar se o sistema está se comportando como o esperado, se o que foi feito está adequado ou se ainda pode ser melhorado o que acaba tornando o desenvolvimento mais divertido e satisfatório.

Que problemas e riscos podem acontecer quanto não adotamos políticas de teste?

Apesar dos benefícios e vantagens proporcionados pelos Testes Unitários, muitos desenvolvedores ainda criam resistência em adotá-los pois a grande maioria ainda acredita e adota a cultura de que os testes devem ser realizados após o desenvolvimento do projeto. Os problemas e riscos que esta cultura proporciona é apontado como um dos principais motivos do fracasso de um projeto. Dentre os problemas e riscos podemos destacar:

Defeitos custam caro

Defeitos encontrados durante o desenvolvimento de um software pode ter um custo elevado. Conforme o estudo proposto por Meyers (Regra 10 de Meyers) indica que o custo da correção de um defeito tende a ser cada vez maior quanto mais tarde ele for descoberto. Isso acontece em virtude da complexidade, tamanho e tempo em que a equipe envolvida no projeto deverá consumir para realizar a correção.

Os gráficos abaixo apontam uma estimativa de custo relativo para corrigir defeitos em aplicações segundo a Regra 10 de Meyers:

Gráfico: Custo relativo para corrigir defeitos em aplicações

Gráfico: Regra 10 de Mayers

 

Defeitos causam conflito interpessoal

Outro fator que pode comprometer o desenvolvimento projeto é o humano porque um risco em não adotar a política de testes unitários, a possibilidade de encontrar defeitos no sistema é maior e consequentemente a carga de re-trabalho também tornando-se um ciclo vicioso. Assim, as motivações e espectativas e tranquilidade das pessoas envolvidas no projeto são convertidas em stress, desânimo, desconfiança e o relacionamento interpessoal entre os membros da equipe entram em conflito ocasionando o comprometimento do projeto.

 Falta de tempo

Muitos desenvolvedores afirmam que não desenvolvem testes unitários em função de falta de tempo pois o projeto é grande, o prazo para desenvolvê-lo é curto, a equipe é pequena entre outros fatores e que codificar testes demoraria muito mais. De fato o desenvolvimento dos primeiros testes pode ser um pouco mais demorado porém com o tempo, a aquisição de prática, experiência e maturidade a falta de tempo deixa de ser um impedimento.

 Código Legado torna o teste impossível

O reaproveitamento de código em projetos de TI é muito comum. Todo desenvolvedor (ou pelo menos a maioria) já passou pela seguinte situação: A empresa inicia um novo projeto, com prazos muito apertados e poucas pessoas para executá-lo. Ao iniciar a fase de desenvolvimento códigos implementados em projetos anterioes (códigos legados) são implementados no novo projeto.

A princípio, este conceito é interessante, porém o que aconteceria se o código fosse muito antigo, mal escrito ou mal elaborado, ou simplesmente “gambiarras” que compõe uma “cocha de retalhos”? Dificultaria (ou mesmo tornaria impossível) a implementação de testes unitários, pois em códigos legados não é possível refatorar um código ou mesmo otimizá-lo.

 Se compilar funciona

Em fábricas de software, onde normalmente existe papéis bem definidos como analistas, desenvolvedores ou testers alguns adotam a política de “cada macaco no seu galho”. Embora esta situação seja muito rara, existe desenvolvedores que implementam um código compilam e simplesmente repassam o papel dos testes para os analistas de testes sem se preocupar ao menos em realizar testes básicos. Com esse comportamento o processo entra em um ciclo vicioso e o desgaste das pessoas envolvidas aumenta.

Legal! Teste Unitário é importante! Mas… o Mercado pensa assim?

Com certeza, Teste Unitário são importantes para o mercado e estão cada vez mais presentes nas empresas de TI. Estudos realizados por instituições e empresas do setor de tecnologia da informação aponta os seguintes indicadores presentes no cotidiano de uma equipe que está desenvolvendo um software:

  • Desenvolvedores gastam 50% do seu tempo encontrando e corrigindo erros (Internacional Data Corporation);
  • 80% do desenvolvimento são destinados a identificação de erros (NIST, National Institute of Standars and Technology)
  • 1 erro é gerado a cada 10 linhas de código escritas (Microsoft)
  • Em média 12 horas são gastas para corrigir cada erro em um código (Microsoft)
  • A cada 1000 linhas de código são encontrados entre 20 e 30 bugs (defeitos) (Sustainable Computer Consortium)
  • Inspeção de software reduz entre 60% e 90% dos defeitos de software e 25% dos custos de desenvolvimento (Michael Fragan Associates)
  • 50% dos erros encontrados depois da solução final ter sido entregue têm origem na fase de Requisitos (Chaos Report).

Além dos benefícios já citados novos mercados estão se abrindo novos mercados na área de TI. Algumas empresas como Optimize, Sofist, iTeste entre outras são especialistas consultoria de Qualidade de Software que prestam serviços para outras empresas ou instituições. Esse mercado está cada vez mais crescente.

Estou decidido! Quero implementar Testes Unitários nos projetos da minha empresa!

Meus parabéns! Esse é primeiro passo para tornar sua empresa mais competitiva, desenvolver produtos com qualidade e eficiência além de solidificar sua equipe.

A implementação dos primeiros testes unitários podem ser um pouco penosas e consumir um bom tempo e dedicação da equipe para realizá-los, algo comum quando uma nova tecnologia está é aprendida, sendo este o motivo de resistência para alguns desenvolvedores. Investir e incentivar a equipe a estudar a implementação de testes, conhecer as ferramentas é um bom caminho para encorajar os desenvolvedores a adotar testes unitários.

Com o tempo a prática se solidifica, a equipe adquire experiências e amadurecimento, consequentemente, considerando todos os benefícios citados durante o texto, os projetos terão chances maiores de serem bem sucedidos.

Concluindo

A maior dificuldade para adotar testes unitários é mais cultural, com o tempo as resistências e receios para investir em testes é cada vez menor porque o mercado está se transformando. O cliente está cada vez mais exigente e os projetos estão (e devem) ser desenvolvidos em tempo cada vez menor.

 Assim, implementar Testes Unitários em um projeto de software é muito interessante fundamental e deve ser adotado para a conquista do sucesso do projeto. Os benefícios porporcionados pela adoção de teste como redução de custos e tempo de desenvolvimento (ou manutenção), satisfação da equipe envolvida e, principalmente, satisfação do cliente, entre outras refletem diretamente na qualidade do produto final, sendo esta uma das principais exigências do cliente e garantia de sobrevivencia em um mercado cada vez mais competitivo.

Referencias

http://www.wthreex.com/rup/process/modguide/md_untst.htm
http://pt.wikipedia.org/wiki/Teste_de_unidade
http://javafree.uol.com.br/wiki/Testes%20Unit%C3%A1rios
http://www.testexpert.com.br/?q=node/950
http://www.urubatan.com.br/testes_unitarios_integracao_spring_tdd/
http://en.wikipedia.org/wiki/Code_coverage
http://www.slideshare.net/giovanni.bassi/testes-unitriosintegrados
http://www.lambda3.com.br/
http://engenhariadesoftware.blogspot.com/2007/02/ciclo-de-vida-do-software-parte-1.html
http://www.linhadecodigo.com.br/Artigo.aspx?id=576
http://www.slideshare.net/elias.nogueira/fabrica-de-teste-tdc-2011
http://sembugs.blogspot.com/2011/12/podcast-mesa-redonda-trilha-de-teste.html
http://luizcorrea.blogspot.com/2009/10/voce-testa-o-seu-software-como.html
http://metronus.com/blog/2011/02/11/codigo-legado/
http://www.idcbrasil.com.br/default2.asp?ctr=bra
http://www.optimize.com.br/
http://www.sofist.com.br/solucoes/testes-de-software
http://www.iteste.com.br/

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>