Estou tentando migrar meus testes de unidade do H2 para o Postgresql.
Atualmente, o H2 fornece um esquema na memória, de modo que cada conexão é mapeada para um esquema exclusivo, cria as tabelas, executa o teste e descarta o esquema. A criação e destruição do esquema são tratadas automaticamente pelo H2.
Os testes de unidade são executados simultaneamente.
Qual é a melhor maneira de fazer isso no Postgresql? Especificamente,
- Como obtenho um esquema exclusivo por conexão?
- A estrutura de teste deve gerar nomes exclusivos ou existe um mecanismo interno para fazer isso?
- Como garantir que o esquema seja descartado quando a conexão for interrompida?
- Eu não quero acabar com esquemas pendentes quando os testes de unidade são mortos.
- Qual abordagem produzirá o melhor desempenho?
- Eu preciso criar / descartar dezenas de esquemas por segundo.
ATUALIZAÇÃO : Encontrei uma resposta relacionada aqui, mas ela não descarta os esquemas caso o processo que executa os testes de unidade seja interrompido.
fonte
pg_temp
é um esquema único, certo? Então, quando eu executo testes de unidade simultâneos, eles não prejudicam as tabelas / dados um do outro?SET search_path
; useSET LOCAL search_path
para definir por subtransação ou, se desejar, você pode definir no nível do usuárioALTER USER mytestuser SET search_path = 'pg_temp'
ou no banco de dados comALTER DATABASE mytestdb SET search_path = 'pg_temp'
pg_temp
esquema?Você pode obter o nome do esquema temporário atual (depois de criar a primeira tabela temporária), conforme descrito no link que você adicionou:
Mas seu plano atual ainda não faria muito sentido. Para criar tabelas no esquema temporário atual, basta criar tabelas temporárias. Isso é tudo. Por padrão, o
search_path
é definido para que as tabelas temporárias sejam visíveis primeiro. Um não precisa de tabelas temporárias de esquema-qualificar. Você nunca precisa abordar o esquema temporário atual diretamente de forma alguma - esse é um detalhe da implementação.fonte
If you're explicitly sequences ...
: Acho que seu último comentário continha um erro de digitação. O que você quis dizer entreexplicitly
esequences
?Seus testes envolvem transações? O DDL é transacional no PostgreSQL; portanto, se você criar seu esquema e tabelas, executar seus testes, tudo dentro de uma única transação que será revertida, o esquema nunca será realmente confirmado e visível para outras sessões.
Você ainda precisará usar um nome provavelmente exclusivo para seu esquema (talvez inclua nome do host e PID), pois
CREATE SCHEMA
falhará imediatamente se já existir um esquema com nome idêntico e bloqueará se outra sessão tiver criado um esquema com nome idêntico em uma transação não confirmada.Uma alternativa seria apenas usar tabelas temporárias, se você puder modificar os scripts de criação de banco de dados para fazer isso.
fonte
CREATE SCHEMA
é a única que pode garantir que eles desapareçam quando o teste de unidade é morto.Acabei de ter uma ideia.
O Postgresql garante que uma sessão não pode ver as tabelas temporárias de outra. Suponho que isso significa que, quando você cria uma tabela temporária, ele cria um esquema temporário. Então, talvez eu pudesse fazer o seguinte:
Não gosto de confiar nos detalhes da implementação, mas neste caso isso parece bastante seguro.
fonte