Como testar software usando IA
Xavier Alves
Engenheiro de software backend e DevOps, com foco em Java, Python, Kotlin, Golang e LLMs.
Fazendo a ponte entre o último artigo escrito e este, iremos abordar o tema de testes. O artigo anterior cobre alguma informação base relacionada quer com a linguagem Go quer com questões de ambiente de desenvolvimento. Caso sinta que existe algo que não pareça fazer sentido, o artigo anterior pode ajudar.
O que vamos abordar?
Vamos abordar o caso do desenvolvimento de testes usando Inteligência Artificial(IA).
Entre uma série de desafios que nos vão surgir, é efetivamente o de podermos codificar e garantir que tudo o que tenhamos já feito não é afetado por novo código que criámos.
A título de exemplo usando o nosso último artigo, deixarmos de ter o nosso “Hello, World!” a funcionar…
Embora a revolução da IA nos leve a um ponto em que talvez alguma geração de código seja 100% gerida por AI, hoje em dia ainda não estamos exatamente nessa fase(ainda!). Portanto é fácil cairmos na tentação de nas nossas atividades de codificação queiramos cada vez mais introduzir código gerado por IA. No entanto dado que temos menos controlo daquilo que efetivamente está a ser gerado, leva-nos a uma situação em que temos cada vez menos percepção do que exatamente o código faz, por conseguinte temos a dificuldade de entender todas as repercussões da execução do mesmo e assim abrimos a porta a mais “bugs” e complexidade que poderia ser evitada. Concluindo, perdemos na qualidade com a agravante de podermos chegar a um ponto em que a conclusão seja recomeçar do 0!
E portanto… O que vamos exatamente fazer?
Para solucionar este problema vamos usar a IA para nos auxiliar no processo de criação de testes que irão ser executados de forma a garantirmos que estamos a “caminhar” na direção correta.
Vamos introduzir o tópico de testes unitários… Começando pelo início, o que são testes unitários?
Um teste unitário é responsável por verificar que determinada instrução ou conjunto de instruções têm o resultado esperado. O resultado esperado é aquele que definimos, seja num contexto profissional um resultado esperado por um cliente, seja retirado de uma especificação, ou simplesmente de uma ideia que temos e que queremos concretizar de determinada forma.
Por exemplo: “Se estivermos a implementar o código responsável por efetuar somas, se fizermos uma soma com 1 + 1 esperamos como resultado 2”.
Vamos começar mesmo por aí… Como é que um teste, tal como descrito acima se parece?

Vamos implementar como sugerido… De notar que embora tenha partido da base do último artigo, mudei a pasta onde continha o programa.


Ao seguir o passo que foi mencionado pelo ChatGPT iremos obter um erro ao executar os testes. Este erro está relacionado com ainda não termos um módulo criado. Se quisermos saber mais sobre o que é um módulo podemos tomar por base o já aprendido e tentar usar o ChatGPT para nos ajudar, de qualquer das formas no meu caso com o simples comando “go mod init primeiroprograma” criei um módulo que posteriormente nos permitiu executar o “go test”.
Uma nota que gostaria de realçar é que não segui a 100% as instruções que partilhei acima, isto deve-se ao facto de não ter sido específico o suficiente na minha “prompt”. O código de teste foi criado junto do código da função soma. Como boa prática, devemos separar ambos, daí ter criado dois ficheiros. Um exercício interessante que pode também ser feito com o ChatGPT é perguntar por boas práticas de desenvolvimento ou até estratégias para organizar os nossos ficheiros de código(sempre com o cuidado de entender se realmente é benéfico e faz sentido no caso que estivermos a ver).
Outra dica que pode ser útil é pedir referências de onde podemos encontrar certa informação, assim conseguimos fazer mais investigação se assim acharmos.
Ao executar o comando “go test” obtemos o seguinte resultado:

Embora seja um caso bastante simples, provavelmente conseguimos identificar aqui alguns problemas, nomeadamente se tivermos 2 testes, de que forma se distingue que testes passou com sucesso ou não?
Para isso basta acrescentarmos “-v” ao comando “go test”:

Embora de forma muito básica, vimos um exemplo de como criar testes unitários, estes vão ajudar-nos a continuar a desenvolver o código permitindo que assim que alterarmos algum comportamento sejamos “avisados” dessa situação, por base de testes que irão falhar. Com esta abordagem ganhamos confiança para continuar a desenvolver outras funcionalidades.
Quais as vantagens de um código com testes unitários?
- Confiança na implementação de novas funcionalidades.
- Confiança na alteração de pequenas áreas de código que são comuns a vários casos de uso(se estes tiverem uma boa cobertura de testes).
Estes testes gerados são bons/perfeitos?
Não serão certamente perfeitos neste momento, e claramente que é preciso sempre criar know-how para conseguir exercitar o código da melhor forma, ou seja, criar os casos de teste que irão garantir a robustez destas pequenas funções que por sua vez conjugadas entre elas criam programas que conseguirão resolver os diferentes “use-cases” de diferentes setores.
Outra perspectiva que devemos ter pelo menos em consideração é em código que não têm testes, ao usarmos a IA para nos ajudar a criar testes unitários, antes ainda de implementar novo código ajuda a verificar que não estamos a alterar funcionalidades sem nos apercebermos.
Outras estratégias
- Cobertura de testes em código antigo antes de uma migração.
- Definir testes primeiro e pedir para gerar o código necessário para que estes passem com sucesso.
Só existem estes tipos de teste?
Não, um software geralmente têm diferentes tipos de teste, aqui podemos encontrar termos como, testes unitários, de integração, de performance, de segurança, “end-to-end” entre outros tipos não mencionados. A sua distinção pode ser relacionada com requisitos funcionais(“1+1 = 2”) ou não funcionais/de qualidade(“é suposto operações de soma com números inferiores a 100 sejam processadas em menos de 1s em 99% dos casos”).
Conclusão
Neste pequeno artigo apresentamos um novo tópico na temática de desenvolvimento de software com IA. Quer estejamos a começar a desenvolver software, quer já tenhamos alguma experiência é interessante ver como estas ferramentas nos podem ajudar no dia a dia a sermos mais produtivos(quando aplicável).
Apesar de toda a boa inovação e disrupção que os novos avanços apresentam(quase todos os dias existe algo novo!), mais que acompanhar as notícias das mudanças é conseguir efetivamente consolidar e de forma progressiva integrar no nosso dia a dia.
Existem outras ferramentas que nos permitem integrar a IA mais “perto” do ambiente de desenvolvimento(plugins/extensões), bem como ferramentas que que nos criam uma abstração ao modelo que estamos a utilizar de forma a conseguirmos utilizar para cada caso o mais apropriado. Estes e outros tópicos poderão criar o mote para mais uma destas publicações!
À medida que fomos introduzindo mais conceitos caso algo não esteja claro, recomendamos a consulta dos restantes artigos!