TL;DR;
Construí o Testronaut, um agente autônomo de testes com IA, em apenas algumas semanas.
Ele transforma descrições em linguagem natural como "Faça login no app e verifique a página inicial" em testes web estruturados e automatizados usando o Playwright MCP.
Neste artigo, vou falar um pouco sobre:
- Por que modelos locais (como Llama3.2 e Qwen2.5) me decepcionaram
- Como dominar os fundamentos foi melhor que usar frameworks da moda
- Como o Google ADK me ajudou a criar um sistema de colaboração entre agentes
- Como o Testronaut planeja, executa e documenta tudo automaticamente
E o mais importante:
O trabalho apenas começou — estou construindo a base para o que pode se tornar a uma plataforma open-source de testes com IA.
🔗 Veja o repositório completo do Testronaut aqui!
Introdução
Nas últimas semanas, a Microsoft lançou o Playwright MCP, uma extensão inovadora do ecossistema Playwright que abriu várias possibilidades para automação.
Ao contrário das ferramentas tradicionais de automação de browser que exigem scripts manuais, o Playwright MCP introduziu o Model Context Protocol — uma forma de agentes de IA e sistemas externos interagirem com o navegador via comandos estruturados, permitindo um novo nível de abstração e controle.
Assim que li sobre isso, uma ideia me veio imediatamente:
"E se eu finalmente pudesse criar um agente que testasse minhas aplicações por mim, sem precisar escrever uma linha de código Selenium ou Playwright?"
Essa ideia marcou o início do Testronaut — um agente de IA autônomo projetado para transformar intenções em linguagem natural em testes web reais e documentados.
Neste artigo, quero compartilhar como construí isso em poucas semanas, as lições aprendidas ao longo do caminho, e por que acredito que estamos entrando em uma nova era para testes de software.
Definindo os Requisitos
Uma das premissas principais do Testronaut era clara desde o início:
Usar ferramentas open-source, manter gratuito e rodar localmente.
Inicialmente, imaginei que poderia lidar com todo o fluxo de automação usando o Ollama e modelos locais na minha máquina.
Parecia perfeito — baixo custo, controle total e nenhuma dependência de APIs na nuvem.
Porém, após vários dias apanhando com modelos como llama3.2:3b
, llama3.1
e qwen2.5:14b
, a realidade veio à tona:
A maioria dos desafios não era por causa da lógica do agente — mas sim pelas limitações de desempenho dos modelos locais.
Eles simplesmente não conseguiam raciocinar rápido o suficiente, falhavam em seguir planos com vários passos ou consumiam muitos recursos sob carga real.
Explorei alguns frameworks populares:
Cada um oferecia ideias e ferramentas interessantes, mas logo percebi algo essencial:
O maior desafio não é escolher o framework certo. É dominar os fundamentos — entender como agentes pensam, raciocinam e interagem.
(Óbvio? Talvez. Doloroso de aprender na prática? Com certeza.)
Aprendendo da Maneira Difícil (Sem Atalhos)
Assim como fazíamos antes da era do ChatGPT, voltei aos fundamentos:
Abri a documentação do Google ADK — minha escolha final de framework — e decidi realmente entender:
- Como agentes autônomos funcionam
- Como o Google ADK pode estruturar uma solução real
- Como integrar corretamente as ferramentas (ao invés de apenas plugar um modelo e torcer por magia)
Parecia artesanato ancestral — como os astecas construindo algo sólido, pedra por pedra, sem atalhos.
Ler, experimentar e falhar (muito) virou minha rotina.
E aos poucos, a imagem ficou clara:
Construir um agente confiável não era sobre prompts mirabolantes ou modelos gigantes — era sobre desenhar um cérebro que pudesse:
- Interpretar intenções com clareza
- Planejar ações com lógica
- Executar os passos com cuidado
- Documentar cada movimento com precisão
Em outras palavras, não era "criar um chatbot inteligente", mas sim "construir um agente autônomo sério e disciplinado."
Definindo a Solução
Depois que entendi como construir agentes autônomos, o próximo passo era decidir o que exatamente o Testronaut deveria fazer.
Com um entendimento claro do propósito da plataforma, pude definir suas funcionalidades principais:
1. Criar um Plano de Testes a partir de uma Intenção em Linguagem Natural
O Testronaut nasceu para ajudar times de desenvolvimento a validar fluxos críticos de usuário, jornadas de experiência ou até scripts simples como:
"Acesse https://www.saucedemo.com/ e verifique se a página inicial carrega.
Preencha o formulário de login comstandard_user
esecret_sauce
.
Na página de produtos, tire um snapshot do primeiro produto disponível."
(Nota rápida: SauceDemo é um site público criado especificamente para testes de QA, comumente usado em práticas de automação.)
A capacidade de descrever testes em linguagem natural é poderosa:
Permite que desenvolvedores — mesmo sem experiência em QA — simplesmente expressem o que desejam validar em português ou inglês comum.
O Testronaut transforma essa narrativa informal em um Plano de Teste estruturado, definindo explicitamente os resultados esperados de cada etapa.
Por exemplo, a narrativa acima se transforma em:
{
"test_plan": {
"name": "Teste de Carregamento da Homepage e Snapshot do Produto",
"description": "Verificar o carregamento da homepage, login com credenciais padrão e captura de snapshot do primeiro produto na página de produtos.",
"steps": [
{
"step": 1,
"action": "Navegar para https://www.saucedemo.com/",
"expected_result": "Homepage carregada com sucesso e visível."
},
{
"step": 2,
"action": "Verificar se o conteúdo da homepage está correto.",
"expected_result": "Conteúdo da homepage visível e correto."
},
{
"step": 3,
"action": "Preencher o formulário de login com usuário 'standard_user' e senha 'secret_sauce' e submeter.",
"expected_result": "Login realizado com sucesso e redirecionamento para a página de produtos."
},
{
"step": 4,
"action": "Na página de produtos, localizar o primeiro produto disponível.",
"expected_result": "Primeiro produto localizado e visível."
},
{
"step": 5,
"action": "Tirar um snapshot do primeiro produto.",
"expected_result": "Snapshot do primeiro produto salvo com sucesso."
}
]
}
}
Ao estruturar a intenção em JSON, o Testronaut consegue planejar, executar e documentar cada passo sistematicamente.
2. O Agente Executor
Com o Plano de Testes criado, o próximo passo natural era executá-lo.
Para isso, eu precisava de um segundo agente: um que fosse capaz de ler o Plano de Testes e realizar as ações correspondentes no navegador usando o Playwright MCP.
Felizmente, o Google ADK torna extremamente simples a integração com servidores MCP externos.
Veja como conectei o agente ao servidor Playwright MCP:
async def get_playwright_mcp_toolset():
"""Cria e configura o conjunto de ferramentas MCP.
Retorna:
Tuple[MCPToolset, AsyncExitStack]: O conjunto de ferramentas configurado e seu exit stack.
"""
print("Tentando conectar ao servidor MCP Playwright...")
tools, exit_stack = await MCPToolset.from_server(
connection_params=StdioServerParameters(
command='npx',
args=["@playwright/mcp@latest", "--headless"],
)
)
return tools, exit_stack
E dentro da definição do agente:
async def get_test_executor_agent():
tools, exit_stack = await get_playwright_mcp_toolset()
test_executor_agent = Agent(
model=LiteLlm(
model=constants.MODEL
),
name="testronaut_test_executor",
description="Um assistente inteligente para execução de testes.",
instruction=prompt.TEST_EXECUTOR_PROMPT,
output_key="STATE_TEST_EXECUTOR",
tools=[get_test_plan, *tools]
)
return test_executor_agent, exit_stack
Dessa forma, o Agente Executor é capaz de:
- Recuperar o Plano de Testes completo do estado da sessão;
- Iterar passo a passo;
- Executar ações precisas no navegador via MCP;
- Analisar o estado atualizado da interface após cada ação;
- Avançar para o próximo passo de forma inteligente.
Tudo que faltava era habilitar a colaboração entre os agentes...
3. Montando o Megazord Testronaut
O Google ADK fornece agentes especializados para coordenar a execução de múltiplos sub-agentes.
Eles são chamados de Workflow Agents.
Para o Testronaut, usei o mais simples e eficaz:
o Sequential Agent, que conecta os dois agentes que eu havia desenvolvido (o Planner e o Executor).
Veja como a conexão final ficou:
sequential_agent = SequentialAgent(
name="TestronautEntrypointAgent",
sub_agents=[test_planner_agent, test_executor_agent],
)
Simples assim!
Agora, os dois agentes colaboram perfeitamente:
- O Test Planner cria um plano de testes estruturado a partir de uma entrada em linguagem natural;
- O Test Executor interpreta esse plano e o executa passo a passo em um navegador real;
Essa colaboração forma o núcleo do que chamo de Testronaut — um agente autônomo capaz de entender intenções, executá-las com precisão e documentar cada etapa do caminho.
Conclusão: O Trabalho Apenas Começou!
Desenvolver o Testronaut me ajudou a entender os verdadeiros fundamentos por trás da construção de sistemas de colaboração entre agentes.
Não se tratava apenas de programar — era sobre aprender como agentes inteligentes podem planejar, executar e trabalhar juntos em direção a um objetivo comum.
O Testronaut ainda está dando seus primeiros passos.
Mas a visão para sua evolução já está bem definida e publicada abertamente em seu Manifesto.
Os próximos marcos serão compartilhados com todos vocês — e quem sabe, talvez uma comunidade surja para transformar o Testronaut em...
"A aplicação definitiva para testes comportamentais."
Obrigado por ler! 🚀
Fique ligado — a jornada está apenas começando.