Implementação didática do pipeline MuTAP (Mutation Test case generation using Augmented Prompt), proposto no artigo "Effective Test Generation Using Pre-trained Large Language Models and Mutation Testing" (arXiv:2308.16557) (Dakhel et al., 2023).
Demonstrar como Large Language Models (LLMs) podem gerar testes unitários automatizados e como o Teste de Mutação pode ser usado como mecanismo de feedback para melhorar iterativamente a eficácia desses testes na detecção de bugs.
O projeto implementa o pipeline completo do MuTAP, incluindo todas as etapas do artigo original:
- Geração inicial — LLM gera um teste inicial para a PUT (zero-shot ou few-shot)
- Correção sintática — Teste é executado; se falhar, LLM corrige erros de sintaxe
- Correção semântica — Cada
asserté executado individualmente contra a PUT; valores esperados errados são corrigidos automaticamente computando o valor real - Mutação — MutPy cria mutantes (versões com bugs sintéticos) da função
- Mutation Score — Testes são executados contra os mutantes → MS inicial
- Prompt aumentado — Mutantes sobreviventes viram contexto para o LLM gerar novos testes direcionados
- Loop — Repete até MS = 100% ou limite de iterações
| Camada | Tecnologia | Função |
|---|---|---|
| LLM | Gemini API | Geração de testes via API Google (gratuito, gemini-2.5-flash) |
| Mutação | MutPy | Gera mutantes (bugs sintéticos) do código testado |
| Testes | Pytest | Executa os testes unitários gerados |
| Linguagem | Python 3.11.0 | — |
| Flag | Descrição | Padrão |
|---|---|---|
put |
Caminho do arquivo PUT (obrigatório) | — |
--shot |
Tipo de prompt: zero ou few |
zero |
--max-iterations |
Máximo de iterações de aumento de prompt | 3 |
- Artigo original: Effective Test Generation Using Pre-trained Large Language Models and Mutation Testing (arXiv:2308.16557)
- Repositório oficial do MuTAP: github.com/ExpertiseModel/MuTAP
- MutPy (ferramenta de mutação): github.com/boxed/mutpy, página do PYPI
- Gemini API: ai.google.dev
mutap-demo/
├── README.md # Este arquivo
├── pyproject.toml # Dependências (gerenciado pelo uv)
├── .env # Configurações (API key, etc.)
├── .env.example # Modelo do .env
├── .gitignore
├── assets/ # Imagens para documentação
│ ├── diagrama-mutap.png
│ └── mutation.png
├── put_examples/ # Funções para testar (PUTs)
│ ├── calculator.py # add(), divide(), is_even()
│ ├── gradebook.py # calculate_grade_statistics()
│ └── string_utils.py # reverse(), is_palindrome()
└── src/ # Código fonte do pipeline
├── mutap_pipeline.py # Orquestrador principal
├── llm_option.py # Interface LLM (Gemini)
├── prompts.py # Templates de prompt (zero-shot, few-shot, aumentado)
├── mutation.py # MutPy runner + parsing de saída + geração de arquivos mutantes
├── sintatic_correction.py # Correção sintática de testes
├── semantic_correction.py # Correção semântica de asserções
└── utils.py # Utilitários (path do MutPy, extract_code)
# Python 3.11
python --version #ou python3 --version
# Instalar uv (gerenciador de pacotes)
pip install uv
# Instalar dependências (modo nativo)
uv syncOpção A — Gemini (recomendado):
- Acesse aistudio.google.com/apikey
- Crie uma API key gratuita
- Salve no arquivo
.env:
GEMINI_API_KEY=sua_chave_aqui
# Pipeline completo (zero shot por padrão)
uv run src/mutap_pipeline.py put_examples/calculator.py
# Few-shot em vez de zero-shot
uv run src/mutap_pipeline.py put_examples/calculator.py --shot few
O pipeline executa as seguintes etapas na ordem:
- Carrega a função alvo (PUT)
- LLM gera teste inicial (zero-shot ou few-shot)
- Correção sintática: valida e corrige o teste gerado para que ele seja executável com pytest
- Correção semântica: asserções com valores esperados errados são corrigidas automaticamente
- MutPy gera mutantes e calcula Mutation Score inicial
- Para cada mutante sobrevivente → prompt aumentado → LLM gera novo teste direcionado
- Exibe teste final e MS
Foram executados sobre os exemplos definidos na pasta /put_examples e o detalhamento do output gerado pode ser visto na branch experiments-v2 desse mesmo repositório. É possível ver uma tabela com resumo dos resultados nessa apresentação: https://canva.link/zfh75gak725tab0 (além de mais conteúdo didático).

