Escrever testes unitários para código legado antes de lhe mexer
Crie testes de caracterização para código legado sem testes: fixe o comportamento atual, isole dependências como base de dados ou relógio e planeie um refactoring seguro passo a passo. Pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Inclui 4 variáveis personalizáveis e pode copiá-lo gratuitamente com um clique.
Intermédio · Código · Pendente de revisão editorial
Prompt
Atua como programador sénior com experiência em código legado e testes (testes de caracterização e pontos de separação, ou «seams»).
Contexto:
- Linguagem e framework de testes: {{linguagem}}
- Dependências difíceis usadas pelo código (base de dados, data atual, rede, ficheiros, variáveis globais): {{dependencias}}
- O meu objetivo depois de ter testes: {{objetivo}}
- Código:
```
{{codigo}}
```
Entregáveis:
1. Mapa do comportamento: entradas, saídas, efeitos secundários e ramos do código, numa lista curta.
2. Pontos de separação: onde e como isolar cada dependência com a alteração mínima e segura (injeção por parâmetro, envolver a chamada, relógio falso), sem alterar o comportamento.
3. Testes de caracterização que fixem o comportamento ATUAL, mesmo que pareça errado. Marca os casos suspeitos com um comentário «POSSÍVEL BUG» em vez de os corrigir.
4. Casos limite: valores vazios, nulos, extremos, falhas das dependências.
5. Cobertura de ramos alcançada, o que fica por cobrir e porquê.
6. Plano de refactoring em passos pequenos, cada um verificável com os testes, orientado para {{objetivo}}.
Restrições:
- Não alteres a lógica do código nos testes nem nos pontos de separação.
- Não inventes o resultado esperado de um caso se não puder ser deduzido do código: marca-o como [PREENCHER: executar e colar a saída real] e explica como a obter.
- Usa nomes de testes descritivos (dado / quando / então).
- Se faltar código de que a função depende, pede-mo primeiro.
Formato: secções numeradas e blocos de código prontos a executar.Como utilizar
Cola a função ou classe completa e indica as dependências externas que conheces. Corre os testes sobre o código sem alterações: todos têm de passar antes de começares o refactoring.
Exemplo de utilização
Linguagem: Python 3.11 com pytest · Dependências: datetime.now() e consultas MySQL · Objetivo: dividir uma função de 300 linhas que calcula comissões.
Exemplo de resultado
Partindo do princípio de que a função completa lê as encomendas do cliente com PDO e usa date() para a antiguidade…
2. Costuras (seams)
- Base de dados: acrescentar um parâmetro opcional
?PDO $pdo = nullque, se fornull, usa a ligação atual. - Data: acrescentar
?DateTimeImmutable $agora = nulle trocardate()por$agora->format(...).
Ambas as alterações mantêm intactas todas as chamadas existentes.
3. Testes de caracterização
<?php
use PHPUnit\Framework\TestCase;
final class CalcularDescontoTest extends TestCase
{
private PDO $pdo;
protected function setUp(): void
{
$this->pdo = new PDO('sqlite::memory:');
// Esquema mínimo que imita a tabela real: [COMPLETAR]
$this->pdo->exec('CREATE TABLE encomendas (cliente_id INT, total REAL, criado_em TEXT)');
}
public function test_dado_cliente_sem_encomendas_quando_total_100_entao_resultado_atual(): void
{
$agora = new DateTimeImmutable('2025-03-15 10:00:00');
$resultado = calcularDesconto(['id' => 42], 100.0, $this->pdo, $agora);
$this->assertSame(0.0, $resultado); // [COMPLETAR: corre e cola o resultado real]
}
public function test_dado_total_negativo_entao_nao_lanca_excecao(): void
{
// POSSÍVEL BUG: um total negativo não é rejeitado; fixamos o comportamento atual
$resultado = calcularDesconto(['id' => 42], -50.0, $this->pdo, new DateTimeImmutable());
$this->assertIsFloat($resultado);
}
}
Corre primeiro cada teste, copia o valor real para a asserção e só depois começa a refatorizar…
Dados-chave
- Categoria
- Programação e desenvolvimento · Refatorização
- Tipo de resultado
- Código
- Nível
- Intermédio
- Pensado para
- ChatGPT, Claude, Gemini e Microsoft Copilot
- Verificado em
- Pendente de verificação editorial
- Variáveis
- Linguagem e framework de testes, Dependências difíceis, Objetivo seguinte e Código
- Idioma
- Português
- Preço
- Gratuito, sem registo
- Atualizado
- 07/11/2026
Perguntas frequentes
O que é um teste de caracterização?
Um teste que documenta o que o código faz hoje, não o que deveria fazer. Funciona como rede de segurança: se um refactoring mudar um resultado, o teste avisa.
E se o código tiver um bug evidente?
Fixa-o primeiro num teste marcado como possível bug e completa a rede de segurança. Corrige-o depois numa alteração separada, para não misturar refactoring com mudança de comportamento.
Para que serve este prompt?
Crie testes de caracterização para código legado sem testes: fixe o comportamento atual, isole dependências como base de dados ou relógio e planeie um refactoring seguro passo a passo.
Com que ferramentas de IA funciona?
Foi pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Ainda não o verificámos nestas ferramentas, pelo que os resultados podem variar entre elas.
Como personalizo o prompt?
Clique em “Personalizar” e preencha as variáveis (Linguagem e framework de testes, Dependências difíceis, Objetivo seguinte e Código). O texto atualiza-se instantaneamente e pode depois copiá-lo com um clique. Os valores ficam guardados apenas no seu navegador.
Preciso de experiência para o utilizar?
É de nível intermédio: convém conhecer o tema para fornecer bom contexto e rever o resultado com sentido crítico.
Este prompt é gratuito?
Sim. Todos os prompts do HomeCasa Prompts são gratuitos, sem registo nem subscrição. Pode também utilizá-los em projetos profissionais.
Posso confiar no resultado da IA?
Trate-o como um rascunho de qualidade: verifique sempre os dados, os números e as afirmações importantes antes de publicar ou tomar decisões.