segunda-feira, outubro 26, 2009

Benefícios econômicos da automação de testes unitários - Sua suite de testes é tão valiosa quanto seu código!

Hoje é consenso na engenharia de software e na comunidade ágil que realizar testes unitários automatizados é uma prática técnica fundamental para melhorar a qualidade do produto de software. Além disso, Michael Feathers em seu excelente livro "Working Effectively with Legacy Code" estudou e chegou a uma conclusão muito interessante e fundamental: O que é um sistema legado? É aquele em que o código não possui um conjunto abrangente de testes unitários automatizados.

Apesar das evidências, a maioria dos projetos de software e sistemas no mercado brasileiro e mundial não possuem suites de testes unitários automatizados. Portanto, a maioria dos sistemas já vira legado a partir do momento que entra em produção! As principais justificativas (e veremos que são desculpas, pois não se justificam) ditas por pessoas para não realizar testes unitários automatizados são as seguintes:
- O custo de colocar atividades de testes unitários automatizados encarecerá o projeto
- O cronograma ficará mais longo e, portanto, demorarei mais para entregar.
- Minha equipe não sabe ou não está treinada para realizar testes unitários automatizados

O objetivo deste artigo é justamente desmontar essas desculpas e mostrar os benefícios econômicos de realizar testes unitários automatizados. Os benefícios econômicos do uso de testes unitários evidenciarão que não realizá-los é uma atitude irracional do ponto de vista econômico.

Vamos então primeiro verificar quais são os benefícios de uma suite de testes unitários automatizados:
- Detecção imediata de defeitos em métodos. Estes defeitos costumam ser identificados rapidamente em testes unitários, mas possuem custo maior de análise e correção quando identificados apenas em um teste funcional de sistema.
- Melhor design detalhado e arquitetura, pois os testes unitários forçam os desenvolvedores a melhorar seu design para que ele se torne mais testável (é o famoso design for testability)
- Código mais estruturado e menos complexo.
- Melhor documentação do código. Cada teste unitário conta a estória e os objetivos de um método.
- Maior facilidade para refatorar código, o que diminui o tempo gasto na realização de manutenções evolutivas
- Diminuição do tempo de detecção e correção de manutenções corretivas, pois a suite de testes unitários automatizados garante que uma mudança em um ou mais trechos de código não impacte outras funcionalidades.

Agora vamos analisar os custos. Uma das justificativas para não se usar testes unitários automatizados é o custo de colocar atividades para realizá-los. Vamos então detonar mais uma vez esse mito e falácia. Muitos gerentes de projeto que não conhecem profundamente engenharia de software cometem esse erro de acreditar que o custo aumentará muito. O problema é que eles acreditam que o desenvolvedor apenas codifica, não testa. Essa é um grande erro. Todo desenvolvedor que seja minimamente profissional irá investir tempo testando seu código. Porém,muitos ainda fazem esses "testes" de forma totalmente manual e usando uma ferramenta que deveria ser pouco usada (apenas em casos extremos): o debug de código. Os gerentes acham que os desenvolvedores não testam, porém eles realizam "testes" sim: de forma manual e debugando código. Portanto, os desenvolvedores realizam uma atividade que não possui como saída um artefato evidente. Essa atividade "invisível" no cronograma dos gerentes será em sua maioria substituída por uma atividade com artefatos úteis e evidentes: testes unitários automatizados. Isso detona os dois primeiros mitos que levam as equipes a não fazer testes unitários automatizados: maior custo e maior tempo de cronograma.

Mas vamos considerar que a equipe é inexperiente em relação a automação de testes unitários. Vamos considerar então que o custo do projeto aumente em 10% (esse é um número bem elevado, o que não ocorrerá. Na prática a equipe se tornará mais produtiva realizando a automação). Num projeto de R$ 1.000.000,00 haveria então um gasto adicional de R$ 100.000,00 em treinamentos para a equipe e tempo extra para eles se acostumarem a realizar a automação.

Vamos agora dar números econômicos aos benefícios da automação de testes unitários:

- O melhor design, código estruturado, documentação e detecção imediata de defeitos podem reduzir de 10% a 50% os testes funcionais e especialmente os de aceitação e homologação (reduz a necessidade de dois ou mais ciclos/baterias de testes e diminui o número de defeitos detectados e a corrigir no momento de homologação). Além disso, melhora a percepção e a imagem de qualidade da equipe. Vide Boehm para essa conclusão.
- Durante o período de manutenção evolutiva e corretiva (o período em que o sistema entra em produção e que corresponde em média a 80% do ciclo de vida dessa aplicação) o tempo e custo de desenvolvedores investido para evoluções e correções é diminuído em torno de 10% a 30%. Isso ocorre devido à existência da suite de testes unitários automatizados que serve como documentação, facilita a detecção de defeitos recorrentes e potencializa a refatoração de código para permitir a inclusão de novas funcionalidades sem aumentar a entropia do sistema.

Portanto, vamos considerar que no nosso sistema exemplo de 1.000.000 de reais em torno de 30% do orçamento será para testes funcionais e de sistema (sem uso de automação de testes unitários). Portanto, podemos diminuir até 150.000 reais (no caso pessimista a redução seria de 30.000 reais) dos testes funcionais e gastamos 100.000 reais para realizar testes unitários automatizados (fora a redução dos testes "manuais" e debugs dos desenvolvedores).

Vamos considerar, como um exemplo, que durante a vida desse projeto gastaríamos mais 10.000.000 de reais em manutenções evolutivas e corretivas. Com a suite automatizada de testes unitários esse custo diminuiria entre 1.000.000 a 3.000.000 de reais!

Custo do projeto com automação de testes unitários automatizados: O mesmo, pois você apenas transfere atividades "invisíveis" (como debug e "testes" manuais dos desenvolvedores) e ainda reduz o número de ciclos de testes de sistema e homologação (portanto transfere custos de testes de sistema para testes unitários automatizados).

Benefício durante a manutenção do sistema em produção: Redução de pelo menos um milhão de reais (redução pessimista) em um investimento de 10 milhões durante a vida útil do software.

Resumindo, seu custo durante o projeto praticamente empata se você realizar testes unitários automatizados ou pode até ser menor. Além disso, você ganhará como benefício intangível uma melhor percepção de qualidade, pois os analistas de testes e os clientes encontrarão menos defeitos nos testes de sistemas e na homologação. E seu custo após a implantação em produção será muito menor, o que lhe trará um retorno sobre o investimento excelente sobre os testes unitários automatizados feitos.

A automação de testes unitários é economicamente relevante para o fornecedor (pois tem melhoria de qualidade e imagem), mas ainda mais relevante para o comprador (pois há benefício econômico real). Vai aí a dica para o fornecedor: realize os testes unitários automatizados e entregue como algo de valor agregado no seu serviço. Para o cliente: exija sempre uma suite de testes unitários automatizados junto com o produto de software.

Reforçando: É uma atitude irracional do ponto de vista econômico não criar uma suite abrangente de testes unitários automatizados.

quinta-feira, outubro 15, 2009

Computação Verde no Google - Blog Action Day 2009: Climate Change

Para manter a tradição, esse é o terceiro ano consecutivo em que participo do Blog Action Day. O Blog Action Day 2009 tem como tema deste ano o problema da mudança climática. E como é bom mesclar o assunto com o tema deste blog nada mais fácil que eu comentar como o Google realiza sua estratégia de Green Computing.

As iniciativas verdes do Google são extensas e estão disponíveis em um site próprio. Isso pode fornecer idéias a empresas de TI e data centers brasileiros.

Alguns exemplos do Blog do Google:

- Vans para levar os empregados do Google até a empresa. E todos que caminham ou vêm de bicicleta ou transporte público ganham pontos que podem ser convertidos em dinheiro para caridade.

- O Google instalou cerca de 9.000 painéis solares para ajudar na geração de energia limpa para seus escritórios.

-Já possui uma pequena frota de veículos elétricos disponíveis para os empregados.

- Toda a coleta de lixo é feita de maneira seletiva.

- Os prédios foram idealizados para que a luz do Sol entre com mais facilidade e minimize o uso de lampadas acesas no período diurno.


Em suma, nada como fazer nossa parte para reduzir emissões de poluentes e diminuir os impactos das mudanças climáticas em nosso planeta e em nossas vidas. Parabéns ao Google pelas suas iniciativas contínuas nessa área!


Veja as Estatísticas