Testes de Aprendizagem

Testes de AprendizagemImplementar 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.
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 regularmente. 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. 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 envolvendo outras operações do componente. Através dos 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!


Compartilhe!
Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Pin on PinterestEmail this to someone

2 comentários

  1. Olá!

    Gostei muito do artigo. Você por acaso conhece algum artigo científico ou alguma outra referência sobre o assunto de teste de aprendizagem?

    Eu queria tentar aplicar aqui no meu time de desenvolvimento, e gostaria de ler mais sobre o assunto e saber como realizar esses testes.

    1. Olá, Lennon, tudo certo?
      Eu tomei conhecimento dos Testes de Aprendizagem através do livro “Clean Code: A Handbook for Agile Software Craftsmanship”, porém, o autor escreveu apenas meia página sobre o assunto. Talvez você poderá encontrar mais alguns materiais pesquisando pelo termo em inglês: Learning Tests.
      No blog do Elemar Júnior há também uma pequena publicação sobre os Testes de Aprendizagem:

      http://elemarjr.net/2012/04/07/diminuindo-o-impacto-da-adoo-de-pacotes-de-terceiros-usando-learning-tests/

      Vale lembrar que os Testes de Aprendizagem andam de mãos dadas com o prática do TDD (Test-Driven Development). Cultive a ideia de programar com TDD na sua equipe para que os Testes de Aprendizagem se tornem mais coerentes!

      Abraço!

Deixe uma resposta

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

Preencha o campo abaixo * Time limit is exhausted. Please reload CAPTCHA.