Desenvolvimento de Sistemas: Testes de Aprendizagem (Learning Tests)

Implementar testes unitários para garantir a consistência da aplicação é importante, certo? Claro! Além deles, existe também uma família de testes que pode nos proporcionar uma segurança maior nos componentes que utilizamos no software, principalmente se estes forem componentes de terceiros. Estamos falando dos Testes de Aprendizagem!

Qualquer desenvolvedor já teve a necessidade de instalar componentes ou bibliotecas de terceiros, talvez para tratar regras de negócio específicas ou simplesmente para aprimorar o visual da aplicação. É comum, por exemplo, encontrar desenvolvedores Delphi que instalam suítes de componentes especiais, como o JVCL, TMS, FireDAC, Gnostice ou componentes de relatórios.

Imagem via Shutterstock

Imagem via Shutterstock

O que nos passa despercebido, algumas vezes, é o fato de que esses componentes também apresentam bugs e estão sujeitos a atualizações. É por isso que novas versões destes componentes são disponibilizadas periodicamente. Logo, isso nos reflete a uma questão: quando instalamos ou atualizamos estes componentes, como é possível verificar se eles estão estáveis ou que continuam compatíveis com o nosso software?

Uma opção viável é criar Learning Tests, ou Testes de Aprendizagem! Estes testes consistem em averiguar se o comportamento dos componentes está correto, da mesma forma que validamos as regras de negócio com testes unitários. Porém, diferente destes, os Testes de Aprendizagem são executados apenas quando há uma nova versão do componente em questão.

Como funcionam esses testes?

Para facilitar a compreensão, vou citar um caso real. Há alguns anos, tive de desenvolver um módulo de comunicação com um WebService referente à NFS-e (Nota Fiscal de Serviços Eletrônica). Para isso, instalei um componente de terceiro que facilitaria este trabalho. Antes de iniciar o desenvolvimento do módulo, decidi implementar alguns testes para aprender como o componente funcionava e me certificar de que ele cumpriria o que era esperado.

Opa, eu disse “aprender”? Claro, então é por isso que o nome destes testes traz a palavra “aprendizagem”! Ao implementar testes no componente, estamos automaticamente adquirindo conhecimento do seu comportamento e requisitos. Dessa forma, teremos mais facilidades em utilizá-lo e evitaremos possíveis impedimentos, afinal, é muito mais fácil utilizar algo que já conhecemos.

Os testes que implementei eram simples, simulando um ambiente de utilização do componente para avaliar o resultado dos métodos que ele disponibilizava. É importante realçar que, até então, esses testes não têm nenhuma relação com a regra de negócio. Pode-se inclusive dizer que os Testes de Aprendizagem são de baixo nível, já que testam uma ferramenta ou recurso que ainda será utilizada no projeto.

Pois bem, tomei conhecimento do componente e comecei a utilizá-lo. Porém, no mês seguinte, a Microsoft liberou uma atualização de segurança no Windows que inviabilizou os métodos de conexão do componente. Ao rodar os Testes de Aprendizagem, eles falhavam. Isso me dava a certeza de que o problema estava no componente, e não na minha codificação.

Após alguns dias, devido à essa atualização do Windows, uma nova versão do componente foi disponibilizada pelos desenvolvedores. Para que o meu módulo de NFS-e voltasse a funcionar, imediatamente baixei a nova versão. Antes de testar diretamente a aplicação, decidi rodar novamente os Testes de Aprendizagem e, para a minha surpresa, eles ainda estavam falhando! Após analisá-los, encontrei o motivo: além de terem ajustado o componente para se adequar à atualização do Windows, os desenvolvedores também reformularam alguns métodos do componente envolvendo outras operações. Devido aos Testes de Aprendizagem, fui capaz de detectar e corrigir essa incompatibilidade rapidamente.

Mas de qualquer forma você descobriria esse problema!

Sim, mas não com a mesma prontidão proporcionada pelos Testes de Aprendizagem. Se não fosse por eles, em poucos dias eu receberia uma nova notificação de erro do usuário. Os Testes de Aprendizagem me adiantaram em corrigir, ou melhor, ajustar o meu código que utilizava estes métodos que foram alterados. Afinal, não se brinca com erros em ambiente de produção, não é? :)

Em suma, podemos apontar duas grandes vantagens ao implementar Testes de Aprendizagem: a possibilidade de aprender o funcionamento do componente e a prevenção de problemas causados por atualizações, como o exemplo citado neste artigo. Além disso, facilita a integração do componente dentro da aplicação e pode ser utilizado como base de conhecimento para novos desenvolvedores!

Dependendo da complexidade do componente, os Testes de Aprendizagem podem exigir horas de implementação. A recomendação é implementá-los somente se não houver prioridades de negócio pendentes ou, opcionalmente, essa atividade também pode ser alocada dentro de uma Sprint.

Abraço e até a próxima!

Publicado Originalmente em Subrotina

André Celestino

Mais artigos deste autor »

Desenvolvedor de software há 7 anos e autor do blog AndreCelestino.com. Graduado em Sistemas de Informação e pós-graduado em Engenharia e Arquitetura de Software com ênfase em Desenvolvimento Ágil. Atualmente trabalha como Engenheiro de Software.


1 Comentários

Deixe seu comentário

Seu endereço de e-mail não será publicado. Campos com * são obrigatórios!