Quando devo testar o código da aplicação e quando isso é irrelevante?

Alta produtividade e rapidez nas entregas são características cada vez mais demandadas nos profissionais de TI. Seja pela experiência ou pelo conhecimento do sistema que estão desenvolvendo, vez ou outra já escutei de desenvolvedores que não precisavam testar seu código.  Certamente não fazemos juízo de valor, o melhor método é o que funciona melhor para você nesse momento, mas se concorda que gastar tempo de desenvolvimento com testes é desnecessário, reunimos nesse post alguns pontos que podem fazê-lo repensar sua posição. E se testar já está no seu sangue, como garantir uma alta testabilidade nos projetos e diminuir o retrabalho na equipe de desenvolvimento? Confira

O Cenário

No processo de criação de um software, seja ele web, mobile ou empresarial, várias etapas e requisitos técnicos devem ser cumpridos pelos desenvolvedores. Quem já lidou com comunicação em tempo real sabe que se os relógios não estão bem sincronizados, o usuário inevitavelmente terá de conviver com bugs ou mesmo crashes no seu programa. Quanto maior o skew entre as expectativas do cliente e o produto final, um grande projeto pode acabar se transformando em uma pilha de retrabalho e desperdício de recursos.

Métodos Agile contribuem para evitar que isso ocorra, alinhando o planejamento a intervalos menores de tempo. Ainda assim, é difícil manter a segurança e confiabilidade ao longo do desenvolvimento dessas etapas sem depender de testes: em equipes maiores, pequenas alterações podem ter efeito em cascata e travar o funcionamento de funções chave do programa.

É pensando em evitar esse tipo de situação que muitas companhias de desenvolvimento investem em testes de código. Em teoria, eles devem ser executados no final de cada etapa do projeto de criação de um novo programa, permitindo que engenheiros de software identifiquem falhas, vulnerabilidades, brechas de segurança e outros fatores que podem influenciar na qualidade do sistema que será executado pelo cliente.

O problema é que muitas vezes o dev se vê pressionado para entregar mais em menos tempo, e quando não há uma política restrita como TDD, acaba pulando essa etapa por confiar no que desenvolveu, alguns batem no peito e dizem que não precisam testar por que ‘sabem muito bem o que estão fazendo’. Aliado a isso, muitas universidades não oferecem capacitação ou treinamento em automação de testes e por isso certas ferramentas são encaradas como chatas ou burocráticas por muitos. O programador acaba criando um software com baixo grau de testabilidade, e com isso… é impossível medir o skew e saber se o sistema se distancia dos requisitos técnicos.

O que é um código testável?

Um código com testabilidade é aquele que pode ser avaliado facilmente por um profissional de TI. Ele é construído de tal forma que, caso alguma falha ocorra, será possível identificar rapidamente a sua origem. Não necessariamente a testabilidade está relacionada com a automação de testes, mas sim com a estrutura semântica adotada, que deve ser comum a toda equipe e de fácil visualização. Variáveis e funções devem ser claras, ordenadas e restritas ao cumprimento dos seus objetivos.

A criação de um produto com requisitos incompletos, desatualizados, incorretos, ambíguos, contraditórios ou que não correspondam à realidade do ambiente do uso pode diminuir a capacidade de analistas verificarem a qualidade do código. Como consequência, quando o bug se manifestar, os prejuízos causados ao usuário podem ser graves.

Em modelos de desenvolvimento como o Waterfall, há técnicas para testes mesmo antes do desenvolvimento, ainda na etapa de planejamento; E saber o que se deseja conseguir como resultado é imprescindível para a criação de um código testável.

O que faz um código testável ser tão importante?

A melhor forma de garantir que um programa funcione de acordo com o projetado é realizando testes constantes para verificar se o código cumpre às especificações técnicas. Por mais que se conheça as linguagens, o software e os dados, só é possível garantir que o que está escrito funciona através de testes, especialmente em sistemas integradores que utilizam diversas tecnologias (SQL + Rails + Angular, por exemplo). Esse processo pode ser feito por meio de rotinas automatizadas (como scripts e ferramentas próprias) ou manualmente, por meio de auditorias. O principal objetivo dessa prática é garantir que o produto final possua baixo índice de bugs, falhas de segurança e outras vulnerabilidades que possam comprometer a segurança e a experiência do usuário.

Um código testável permite que analistas responsáveis pela verificação do programa consigam identificar se a ferramenta consegue reproduzir todas as entradas e saída esperadas. Todos os comportamentos serão verificados normalmente, garantindo a eficiência do produto que será disponibilizado para o usuário.

Código testável também é importante pela gestão do conhecimento. Nem sempre será você a alterar uma parte específica de código, e se ninguém mais sabe como ela funciona, cria-se uma dependência desnecessária e prejudicial ao projeto como um todo. Pequenas alterações não previstas podem fazer o software se comportar de maneira inesperada, a formatação de um JSON por exemplo, ou mesmo o nome das variáveis. Testes Unitários e Testes de Integração regressivos garantem que esse tipo de problema seja detectado muito mais rapidamente, e também podem ser usados para medir alterações de performance em rotinas reformuladas.

Depois de cuidar do básico, é possível incluir os mais diferentes tipos de teste no sistema: Resource tests para minimizar o uso de recursos (memória, processamento, disco) especialmente em Elastic Clouds , Stress Tests para garantir o funcionamento com altos volumes de tráfego, Change Tests para verificar como o programa se comporta com alteração de IPs, por exemplo,  em relação a idiomas, fuso horário. Boas práticas incluem apresentar as soluções de módulos a colegas (Peer Review) para garantir o alinhamento entre a equipe e a compreensão da tecnologia empregada.

Algumas companhias incorporam os testes como dinâmica de trabalho, adotando modelos como o Test Driven Development (TDD). Nele, antes de programar funções ou módulos são codificados testes automatizados e as condições de aceite. Para finalizar uma entrega com sucesso, o código precisa atender a todas as expectativas.

Mantendo a alta testabilidade de seus projetos

Um software realmente testável deve ser capaz de ser submetido a várias verificações sem que isso implique na ocultação de falhas ou problemas de segurança. Para que isso seja possível, é preciso tomar tomadas em todas as etapas do processo.

Tenha a sua empresa profissionais dedicados a software testing ou não, o primeiro passo é de sua responsabilidade, no desenvolvimento. Todo o código deve ser comentado, simples e bem estruturado, permitindo que analistas consigam identificar se funções executam uma tarefa de acordo com os requisitos do projeto.

Já os profissionais responsáveis pelos testes devem ter pleno conhecimento dos requisitos. Isso é indispensável para garantir que eles consigam identificar corretamente quais são os cenários ao quais o software será submetido, assim como quais saídas devem ser exibidas de acordo com as entradas executadas.

Mesmo com documentaçõs mais enxutas propostas pelo SCRUM e outras metodologias, é necessário alinhar e manter atualizados os objetivos e casos de uso, além de diretrizes ou normas impostas que devem ser seguidas. Se há alterações no meio do caminho, elas também devem estar visíveis e explicitas ao programador, para evitar retrabalho, o que pode ser facilitado com o uso de ferramentas de gerenciamento.

Possuir um software testável é fundamental para o processo de desenvolvimento de sistemas. Isso envolve todos os profissionais, desde o projeto ao lançamento da nova plataforma.

Gerentes devem estar em comunicação constante com o cliente, para garantir o alinhamento de expectativas. Já os responsáveis pelos testes deverão ter pleno conhecimento de como o sistema devem ter amplo conhecimento dos requisitos de um programa. Por fim, os desenvolvedores são responsáveis por criar um código que seja de fácil compreensão e que não esconda os seus erros.

Pode até ser tentador não seguir todas essas recomendações em equipes pequenas ou em funcionalidades pequenas, mas uma hora ou outra, o barato sai caro e a falta de testes acaba ocasionando problemas graves ou limita o crescimento da companhia como um todo. Além disso, várias linguagens e frameworks já oferecem ferramentas prontas para automação de testes unitários, o que desbanca mais um dos argumentos dos programadores mais resistentes a mudanças.

No final, os ganhos de produtividade a longo prazo compensam um gasto de tempo um pouco maior agora, e não se engane, ainda que você seja ‘só um dev’, escrever um código limpo, eficiente e testável será cada vez mais exigido pelo mercado no futuro.  

E você, concorda com a necessidade de escrever um código testável? Como lidar com as pressões das deadlines e convencer gestores não-técnicos sobre a importância dos testes? Já trabalhou com TDD? Tem alguma dica de software ou ferramenta preferida, ou quer entender mais sobre alguma metodologia específica? Conta pra gente! Se gostou desse post, então não perca “O que você precisa saber sobre AGILE, SCRUM e KANBAN“.

Entre para a elite de desenvolvedores

Veja também

Comentários