Testes de Snapshot
Testes de snapshot capturam a saída formatada (JSON, HTML, mensagens de erro) e comparam execuções futuras com snapshots commitados. insta fornece um fluxo de trabalho de revisão e snapshots inline.
Receita
[dev-dependencies]
insta = { version = "1", features = ["json"] }#[test]
fn renders_user_json() {
let json = serde_json::to_string_pretty(&user()).unwrap();
insta::assert_snapshot!(json);
}Quando usar isso: Saída formatada estável, texto de ajuda da CLI, serializadores e strings de exibição de erro.
Exemplo de Trabalho
use insta::assert_json_snapshot;
#[test]
fn order_response_shape() {
let resp = OrderResponse {
id: 1,
total_cents: 500,
status: "pending".into(),
};
assert_json_snapshot!(resp);
}cargo test
# em caso de alteração intencional:
INSTA_UPDATE=1 cargo test order_responseO que isso demonstra:
- A primeira execução cria arquivos
snapshots/*.snap - Falhas mostram a diferença no terminal
INSTA_UPDATE=1aceita a nova saída dourada (golden output)assert_json_snapshot!redações de campos instáveis com configurações
Mergulho Profundo
Redações e Filtros
insta::with_settings!({
filters => vec![
(r"\d{4}-\d{2}-\d{2}".to_string(), "[DATE]".to_string()),
],
}, {
assert_snapshot!(format_log_line());
});- Redija timestamps e UUIDs que mudam a cada execução
- Use a macro
#[insta::snapshot]para snapshots inline no código fonte - Revise PRs de snapshot como atualizações de arquivos golden
Layout do Snapshot
tests/snapshots/
└── my_test__renders_user_json.snap
- Commite snapshots para o git
- CI falha em caso de desvio sem a flag de atualização
Armadilhas
- Snapshots de blobs inteiros sem redação - instáveis com timestamps. Correção: filtros ou asserções de campo estruturadas.
- Atualizar snapshots cegamente - esconde bugs reais. Correção: revise a diferença no PR; combine com asserções unitárias em campos críticos.
- Snapshots enormes - difíceis de revisar. Correção: tire snapshot de uma visão mínima DTO, não do estado interno completo.
- Desvio de nova linha entre plataformas - Windows vs Linux CI. Correção: normalize novas linhas antes do snapshot.
- Testar lógica apenas com snapshots - sem verificações de invariantes. Correção: afirme propriedades chave mais snapshot para o formato.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
assert_eq! em structs | Valores estáveis pequenos | Strings formatadas grandes |
| Testes de Propriedade | Leis algébricas | Layout visual de CLI |
| Arquivos binários golden | Saída de imagem/áudio | APIs de texto JSON |
FAQs
insta vs arquivo assert_eq?
insta oferece UI de diferença, redação, snapshots inline e fluxo de trabalho de revisão.
Como funcionam os snapshots inline?
insta::assert_snapshot!(val, @"expected"); armazena o esperado no código fonte após INSTA_UPDATE=1.
Snapshots podem ser opcionais na CI?
Não - eles são portões de regressão. Atualize intencionalmente quando a saída mudar.
Snapshot de saída assíncrona?
Use await no teste, tire snapshot da string formatada ou corpo JSON.
Múltiplos snapshots por teste?
Use nomes de snapshot distintos: assert_snapshot!("case_a", out_a).
Como testar a CLI --help?
assert_snapshot!(cmd_help_string()) após clap CommandFactory::command().render_help().
Redigir UUIDs?
Filtro regex em with_settings! substituindo o padrão UUID por [UUID].
Diretório de snapshot por crate?
Padrão sob a raiz do crate snapshots/; configure com configurações insta em Cargo.toml metadados, se necessário.
Conflitos de merge em snaps?
Reexecute INSTA_UPDATE=1 localmente após resolver conflitos no código de teste.
Combinar com proptest?
Possível, mas raro; props geralmente usam asserções, não snapshots, devido ao volume.
Relacionados
- Noções Básicas de Teste - asserções
- Testes Baseados em Propriedade - estilo complementar
- Saída de Terminal - formatação de CLI
- Melhores Práticas de Teste - política de snapshot
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.