ADRIANOLAUREANO← Artigos
SÉRIE PROVA · CAPÍTULO 2 · RASCUNHO

Como testes controlam dependências sem contaminar uns aos outros?

Fixtures, doubles e ambientes repetíveis no Prova 0.2.

Pergunta de abertura

Por que um teste passa sozinho e falha quando outro é executado antes dele?

01
Sozinho passa. Na suíte, falha.
A ordem revelou estado residual
cria_configuracao       PASSOU
usa_configuracao_padrao FALHOU

--filter usa_configuracao_padrao
usa_configuracao_padrao PASSOU

O primeiro deixa um arquivo. Independência é o resultado não depender de outros casos; isolamento são mecanismos de proteção; determinismo repete entradas; repetibilidade reconstrói o ambiente.

02
Uma VM nova não recria o mundo inteiro.
Heap, arquivo, tempo e serviço
FronteiraEstratégia
stack, globais e heapcontexto Cadência novo
arquivosraiz temporária exclusiva
tempo e acasocontratos substituíveis
serviço externofake local sem rede pública

O garbage collector remove objetos mortos; não corrige um global compartilhado ainda alcançável.

03
Limpeza precisa ocorrer também na falha.
setup → teste → teardown
setup ──falha──┐
  ↓            ├─► guarda/finally ─► teardown
teste ─falha───┘

Uma guarda Rust possui o temporário e o remove em Drop. Falha de teardown aparece separadamente; escondê-la mascararia contaminação.

04
Fixture é estado preparado com ciclo de vida explícito.
Escopo de caso primeiro
fixture banco_vazio() { retorne TempStore.novo() }
teste "salva usuário" usa banco_vazio como banco {
  banco.salvar("Lia")
  assert_eq(banco.total(), 1)
}

Fixture de suíte economiza preparação, mas reintroduz compartilhamento. O Prova prefere escopo de caso.

05
Dummy, stub, fake, spy e mock não são sinônimos.
O comportamento decide o nome
DoubleComportamento
Dummypreenche parâmetro não usado
Stubdevolve resposta programada
Fakeimplementa versão simplificada
Spyregistra interações
Mockverifica expectativas

Um fake fiel costuma ser menos frágil do que mockar tudo.

06
A troca vem antes do nome da técnica.
Injeção de dependência
contrato Relogio { agora() -> Instante }
função expira(token, relogio) {
  retorne token.limite < relogio.agora()
}

Produção entrega RelogioSistema; teste entrega RelogioFalso. O projeto define a fronteira e o framework fornece a fixture.

07
Tempo e acaso viram entrada reproduzível.
Relógio falso e seed
10:00 ── avançar(5m) ─► 10:05
seed 731 ─► mesma sequência

Duração usa relógio monotônico; comportamento usa o relógio injetado. A seed sempre aparece na falha.

08
Temporário não significa caminho livre.
Raiz exclusiva e limpeza segura

Caminhos absolutos, .. e symlinks que escapam são recusados. Cada caso recebe pasta exclusiva. A limpeza ocorre após falha; preservar artefatos exige opção explícita.

09
Tabelas exercitam exemplos; propriedades exercitam leis.
Parâmetros, geração e redução

Cada linha parametrizada vira caso próprio. Propriedades usam seed registrada e um redutor didático que remove elementos até encontrar exemplo menor.

FALHOU ordenar_idempotente
seed: 731
exemplo reduzido: [2, 1]
10
Mudar a ordem é diagnóstico, não cura.
Dependências acidentais

Ordens forward, reverse e embaralhada repetem a suíte. Divergência denuncia vazamento. Retry jamais transforma a primeira falha em sucesso silencioso.

11
Prova 0.2 controla as fronteiras que conhece.
Sem promessa absoluta

Processos e recursos não modelados ainda podem ser compartilhados. O pacote oferece lifecycle, fixtures, doubles, relógio, seed e filesystem controláveis. Closures são úteis em callbacks, mas também podem conservar estado capturado.

Baixar Prova 0.2 — estado exato deste capítulo

PROJETO COMPLETO · ESTADO EXATO DESTE CAPÍTULO

Baixe o Prova 0.2.

Pacote exclusivo com código Rust e fixtures Pulso. Nenhum download anterior é substituído.

O que este artigo fez você pensar?

Dúvidas, experiências e contrapontos ajudam a próxima pessoa a enxergar o assunto por outro ângulo.

Todos passam por moderação. Ao enviar, você concorda com a política de privacidade.

Receba os próximos artigos.

Uma mensagem quando uma nova investigação estiver pronta. Só isso.