0%
Testar contra o real em vez de contra um simulacro

Introdução

Por que um banco em memória valida código que a produção vai recusar.

10-15 min

Testar contra o real em vez de contra um simulacro

Sua suíte de testes está verde. Trezentos e quarenta testes, onze segundos, nenhuma falha. Você faz o deploy, e a primeira requisição em produção falha com ERROR: column "created_at" is of type timestamp with time zone but expression is of type character varying. Ninguém introduziu um bug: o código testado é exatamente o código implantado. O que mudou foi o banco. Seus testes conversavam com o H2 em modo de compatibilidade PostgreSQL, enquanto a produção conversa com o PostgreSQL 16. O H2 aceitava a conversão implícita, o PostgreSQL a recusa. Sua suíte não mentiu sobre o seu código, mentiu sobre o ambiente dele.

Esse cenário não tem nada de exótico. O H2 não conhece jsonb, não aplica as mesmas regras de ordenação de strings conforme a collation, aceita nomes de coluna que o PostgreSQL reserva, e trata os níveis de isolamento transacional com uma flexibilidade que Oracle ou SQL Server não têm. Cada diferença é pequena. Juntas, formam uma categoria inteira de defeitos que sua suíte estruturalmente não consegue detectar, e sobre os quais você não tem nenhum sinal antes do deploy. O problema não é o H2: é acreditar que um teste que passa contra o H2 diz alguma coisa sobre o PostgreSQL.

Comentários

Os comentários são alimentados pelo GitHub Discussions

Conecte-se com o GitHub para participar da discussão

Link copiado!