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 = null que, se for null, usa a ligação atual.
  • Data: acrescentar ?DateTimeImmutable $agora = null e trocar date() 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.

Prompts relacionados