Acelerando a criação de testes de software com IA generativa

Por dti digital|
Atualizado: Jun 2024 |
Publicado: Jun 2024

Desenvolvimento de Software e criação de testes

Parte importante do ciclo de desenvolvimento de software, a criação de testes muitas vezes é vista como custo e acaba sendo despriorizada no fluxo de construção.  

Para quem trabalha ou tem alguma familiaridade com o processo de construção de sistemas/produtos digitais, é inegável a complexidade que envolve essa atividade. E as dificuldades não aparecem somente no momento de escrever o código em si. Elas estão presentes em vários momentos, pois são inerentes ao processo como um todo. Durante o ciclo de desenvolvimento de software, uma das etapas mais relevantes – e às vezes traumática – é a criação de testes. Mesmo com toda sua importância na garantia da qualidade do software desenvolvido, muitas vezes ela é ignorada ou até mesmo desconhecida por alguns profissionais. Mas por que será que isso acontece? 

Primeiro, vamos fazer algumas definições. Em resumo, teste de software nada mais é do que um processo para verificar se uma aplicação executa corretamente as ações a que ela se propõe. Para isso, o software é executado sob algumas condições específicas, e os resultados obtidos são comparados com os resultados esperados para aquelas condições. Simples, certo? Na teoria, sim. 

Apesar de existirem vários tipos, os testes de software podem ser agrupados de acordo com algumas categorias. As mais comuns são o nível de teste (referente a qual camada do software os testes serão executados) e a abordagem de teste (referente ao tipo do teste executado).  

OBS: Esse artigo faz parte de uma série de artigos sobre IA Generativa e produtos digitais, portanto não é nossa intenção entrar em detalhes técnicos sobre testes aqui. A ideia é somente dar um alinhamento para o leitor mais leigo no assunto. 

Por que realizar testes?

A criação e execução de testes de software são essenciais para um desenvolvimento correto e saudável de sistemas. Existem vários motivos do porquê realizar testes, mas como principais podemos destacar: 

  • Garantia de qualidade: o teste garante que o software esteja funcionando conforme o esperado e atenda aos requisitos especificados. Ele ajuda a identificar quaisquer defeitos ou discrepâncias entre os resultados reais e esperados;  
  • Segurança: os testes podem ajudar a descobrir vulnerabilidades e falhas de segurança nas aplicações. Esse ponto por si só já deveria ser a justificativa para termos bastante atenção com essa fase, visto que segurança é um valor inegociável;  
  • Custo-benefício: identificar e corrigir bugs durante a fase de testes é mais barato do que fazê-lo após a implantação do software; 
  • Confiabilidade: testes regulares aumentam a confiabilidade do software, garantindo que todos os recursos funcionem corretamente; 

 Entretanto, mesmo sendo evidente sua importância, não é raro que a etapa de desenvolvimento de testes seja deixada de lado durante a construção de um sistema. Entre os principais motivos para esse comportamento estão as pressões para cumprir prazos apertados de entregas – o que força o time a renunciar algumas etapas, geralmente a de testes – ou até mesmo um gap de conhecimento do próprio desenvolvedor. E todos nós sabemos que gerar testes assertivos e de qualidade demanda tempo e esforço. 

Quer ver mais conteúdos como esse?

Quanto tempo se gasta na criação de testes dentro do fluxo de desenvolvimento de software? 

O tempo gasto para o desenvolvimento dos testes de software pode variar bastante de um projeto para outro, haja vista a quantidade de fatores envolvidos nesse processo. Entretanto, é um senso comum que cerca de 20% a 50% do tempo total de construção do software pode ser gasto nessa etapa, variando um pouco de acordo tanto com o modelo de desenvolvimento escolhido (modelo ágil, modelo cascata etc.) quanto o método de elaboração de testes (TDD, profissional de QA dedicado, fase de testes pós desenvolvimento etc). Dado esse cenário, uma questão surge: existe alguma forma de acelerar a criação de testes de software sem abrir mão da qualidade deles? 

A resposta é sim, e um dos caminhos viáveis envolve a utilização de inteligência artificial.  

IA e os aceleradores LLM: benefícios para o desenvolvimento de software  

Deixando de lado a hype inerente ao contexto das LLMs e IAs generativas, é fato que algumas dessas ferramentas realmente conseguem auxiliar em etapas do processo de testagem de software. As principais razões para sua utilização incluem: 

  • Eficiência: a IA pode automatizar tarefas repetitivas na geração de cenários de testes, permitindo que os desenvolvedores se concentrem nos cenários mais complexos e com regras de negócio; 
  • Velocidade: a IA pode realizar testes muito mais rápido do que os humanos, reduzindo o tempo total dessa fase; 
  • Análise inteligente: a IA pode analisar grandes quantidades de dados de resultados de testes para fornecer insights e previsões sobre a qualidade do software; 
  • Cobertura: a IA pode ajudar a alcançar uma melhor cobertura de teste gerando automaticamente casos de teste com base no contexto disponibilizado; 
  • Análise preditiva: A IA pode usar algoritmos de aprendizado de máquina para prever onde os bugs provavelmente ocorrerão com base em dados históricos. 

 Para exemplificar os itens acima, vamos utilizar os testes que consideramos como os mais importantes aqui na dti: os testes de segurança. Muitos desses testes são bem difundidos (testes de penetração, pentests etc) e seguem padrões conhecidos no mercado, sendo o mais famoso o OWASP Top 10. Entretanto, muitas vezes as rotinas de verificação de segurança ocorrem somente ao final do fluxo de construção, próximo da data de lançamento do produto/funcionalidade. Além disso, costumam demandar profissionais com habilidades específicas para a correta criação de cenários de ataque e análise dos resultados obtidos. Ou seja, um cenário ideal para que essa etapa seja não realizada da forma correta. 

Como gerar testes com IA generativa?

Como exemplo de uso de ferramentas aceleradoras, nós podemos enviar para uma LLM o contexto de uma aplicação específica. Feito isso, podemos pedir para que ela gere códigos de testes para aquele sistema seguindo as diretrizes e parâmetros de segurança estabelecidos nas normas de mercado. Pronto, as IAs generativas conseguem realizar o trabalho solicitado. Com esse exemplo simples, é possível obter ganhos de escala e de velocidade. Pois, um profissional especializado pode gerar os cenários de teste de forma mais rápida e compartilhar os prompts com outros profissionais (que não sejam especialistas em segurança). Além disso, temos ganhos de eficiência, visto que esses testes podem ser executados durante todo o ciclo de desenvolvimento, identificando vulnerabilidades de forma antecipada quando comparado com o fluxo padrão. Por fim, essas análises geram um feedback mais rápido para o time, auxiliando assim sua própria evolução. 

A Inteligência Artificial (IA) também pode auxiliar no desenvolvimento de testes através da análise da base de código existente. Ela pode entender padrões de codificação e gerar testes de unidade de acordo com o contexto. Além disso, você pode usar as LLMs para identificar e eliminar testes redundantes ou desnecessários. E sugerir que tipo de testes são necessários com base nas alterações de código. 

 dti evolve e a criação de testes unitários

Outro exemplo é a utilização de ferramentas alimentadas por IA para auxiliar na geração de testes unitários. Aqui na dti nós desenvolvemos e estamos evoluindo o Test Master, uma ferramenta para criação de testes automatizados que utiliza IA generativa. Seu funcionamento segue a mesma linha dos casos já apresentados nesse artigo: ela coleta a parte do código do sistema que se deseja criar os testes e consulta uma LLM via API corporativa pedindo para gerar os testes unitários para o contexto apresentado. Por fim, o resultado dessa consulta é injetado diretamente no código fonte da aplicação, criando as classes de testes conforme requisitado. O funcionamento é igual para todos os contextos, porém alguns “ajustes finos” são feitos de acordo com cada cliente no qual utilizamos a ferramenta, visando melhorar ainda mais os resultados. 

Logicamente, as LLMs não conseguem gerar os casos de teste com 100% de precisão, sendo necessário que um desenvolvedor faça uma revisão dos resultados obtidos. Mesmo assim, o ganho de tempo é considerável, visto que a revisão dos testes é mais rápida do que a criação “do zero”. No geral, estamos tendo ganhos da ordem de 15% a 20% do tempo total da criação de testes. Pensando em cenários de sistemas legados com baixa cobertura de testes, essa ferramenta consegue ser ainda mais efetiva, aumentando consideravelmente a quantidade e qualidade dos testes desses sistemas com um baixo esforço. Inclusive, tivemos cenários nos quais apenas 1 desenvolvedor aumentou em 70% a cobertura de testes de um repositório em apenas 10 horas. 

Desvantagens na criação de testes por IA

Como podemos ver, a utilização de IA para criação de testes pode oferecer várias vantagens. Entretanto, precisamos levar em conta que não é uma bala de prata, e o uso desses auxiliares pode apresentar algumas desvantagens potenciais, tais como: 

  • Complexidade: a implementação de testes baseados em IA pode demandar uma boa compreensão dos princípios de IA e aprendizado de máquina, que podem ser complexos; 
  • Custo: embora a IA possa economizar tempo e recursos a longo prazo, a configuração inicial e o treinamento podem ser caros; 
  • Criatividade limitada: a IA é ótima para encontrar erros de rotina e criar casos de teste padrão, mas pode não ser tão eficaz em encontrar soluções únicas ou criativas para problemas complexos; 
  • Dependência de dados de qualidade: a eficácia da IA nos testes depende muito da qualidade dos dados em que é treinada e do prompt utilizado. Dados de baixa qualidade podem levar a testes ineficazes; 
  • Falsos positivos/negativos: há o risco de a IA classificar erroneamente os defeitos, levando a falsos positivos (identificando um não problema como um problema) ou falsos negativos (ignorando problemas reais); 
  • Falta de percepção humana: apesar de suas muitas vantagens, a IA ainda não tem a capacidade de replicar totalmente a intuição e o insight humanos. O que pode ser crucial em certos cenários de teste; 
  • Propriedade intelectual: caso não sejam observados alguns controles e termos de uso, pode ocorrer o vazamento de código fonte para fora da organização dependendo da ferramenta utilizada. 

Conclusão 

É fato que, para o cenário de desenvolvimento de software e de geração de testes em si, ainda estamos desbravando todo o potencial que essas ferramentas auxiliares baseadas em IA podem nos proporcionar. Mesmo assim, já conseguimos enxergar alguns potenciais ganhos com essas abordagens. Porém, lembre-se que, embora a inteligência artificial possa ajudar a automatizar o processo de escrita de testes, ela não elimina completamente a necessidade de humanos. As ferramentas de IA são boas para capturar erros rotineiros e gerar casos de teste simples. Mas lógicas complexas e testes de borda muitas vezes ainda exigem um toque humano. Dessa forma, a ideia é que essas ferramentas façam o trabalho repetitivo. Liberando tempo dos desenvolvedores e analistas de testes para focarem nos cenários mais críticos do desenvolvimento. 

Escrito por Magno Batista, gerente de engenharia e operações na dti digital 

Quer saber mais?

Desenvolvimento de Software

Confira outros artigos

Veja outros artigos de Desenvolvimento de Software