Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Aula 7: Laboratório de Teste Baseado em Busca (SBST)

Seção 1: Abertura e Engajamento

1.1. Problema Motivador

Na aula anterior, discutimos a teoria por trás do Teste Baseado em Busca (SBST) e o desafio de testar funções complexas. Vimos como a cobertura de código, especialmente a de ramos, pode servir como uma excelente função de fitness para guiar um algoritmo de otimização. Agora, é hora de transformar essa teoria em um sistema funcional.

Vamos construir um “caçador de bugs” automatizado. Nosso objetivo é pegar uma função Python com múltiplos caminhos lógicos e, em vez de escrever testes manualmente, fazer com que um algoritmo genético descubra por si só os dados de entrada exatos necessários para exercitar cada if e else do código. Ao final, teremos um conjunto de testes gerado por IA que nos dará alta confiança sobre o comportamento da nossa função.

1.2. Objetivos deste Laboratório

Ao final deste workshop prático, você será capaz de:

Seção 2: Fundamentos Teóricos (Versão Expressa)

Vamos recapitular rapidamente os três pilares do SBST que implementaremos hoje:

  1. Representação:

    • O que é? Um caso de teste para a nossa função-alvo.

    • Implementação: Um indivíduo do DEAP será uma lista contendo os argumentos da função. Por exemplo, para def func(x: int, y: str), o indivíduo será [10, "teste"].

  2. Função de Fitness:

    • O que é? Uma medida da qualidade de um caso de teste. Nosso objetivo é maximizar a cobertura de ramos.

    • Implementação: A fitness de um indivíduo será o número de ramos únicos que ele consegue executar na função-alvo. Um indivíduo que executa um ramo que nenhum outro na população atual executou é altamente valioso.

  3. Busca:

    • O que é? O motor que evolui a população de casos de teste.

    • Implementação: Usaremos um algoritmo genético padrão do DEAP (eaSimple), com operadores de crossover e mutação que combinam e modificam os dados de entrada para criar novos casos de teste.

O grande desafio técnico é: como saber quais ramos foram executados? Faremos isso através da instrumentação de código, um processo onde injetamos “sondas” no código-fonte para nos reportar seu comportamento durante a execução.

Seção 3: Laboratório Prático Guiado (Google Colab)

3.1. Roteiro do Notebook: workshop.ipynb

Neste laboratório, vamos construir passo a passo um gerador de testes para uma função chamada classificador_triangulo_complexo. Esta função contém vários caminhos lógicos, incluindo casos de borda e condições específicas que são difíceis de encontrar com testes aleatórios. Nosso AG terá a tarefa de descobrir os trios de valores (a, b, c) que cobrem todos esses caminhos.

3.2. Estrutura do Laboratório

O notebook está dividido em quatro partes principais:

Seção 4: Análise e Discussão dos Resultados

4.1. Interpretando os Resultados

O resultado final do nosso notebook será um conjunto de casos de teste e um gráfico de convergência.

4.2. O “Porquê” das Decisões

Seção 5: Síntese e Próximos Passos

5.1. Resumo do Laboratório

5.2. Preparação para o Próximo Bloco

Até agora, aplicamos SBST para garantir que o código se comporte como esperado. Mas e se o próprio código estiver mal estruturado? Na próxima aula, Aula 8: Refatoração Baseada em Busca, vamos mudar nosso foco da verificação para a melhoria. Usaremos SBST não para encontrar bugs, mas para combater a dívida técnica, otimizando a estrutura do código para torná-lo mais manutenível, coeso e menos acoplado. As habilidades de formulação de problemas que você praticou hoje serão diretamente aplicáveis.