(Movendo minha resposta do Uso do PostgreSQL na memória e generalizando-o):
Você não pode executar o Pg em processo, na memória
Não consigo descobrir como executar o banco de dados Postgres na memória para testes. É possível?
Não, não é possível. PostgreSQL é implementado em C e compilado para o código da plataforma. Ao contrário do H2 ou Derby, você não pode simplesmente carregar o jar
e ativá-lo como um banco de dados in-memory descartável.
Ao contrário do SQLite, que também é escrito em C e compilado para o código da plataforma, o PostgreSQL também não pode ser carregado durante o processo. Requer vários processos (um por conexão) porque é uma arquitetura de multiprocessamento, não multithreading. O requisito de multiprocessamento significa que você deve iniciar o postmaster como um processo independente.
Em vez disso: pré-configure uma conexão
Eu sugiro simplesmente escrever seus testes para esperar que um determinado nome de host / nome de usuário / senha funcione, e ter o teste de controle de CREATE DATABASE
um banco de dados descartável, então DROP DATABASE
no final da execução. Obtenha os detalhes de conexão do banco de dados de um arquivo de propriedades, crie propriedades de destino, variável de ambiente, etc.
É seguro usar uma instância existente do PostgreSQL na qual você já tenha bancos de dados importantes, contanto que o usuário fornecido para os testes de unidade não seja um superusuário, apenas um usuário com CREATEDB
direitos. Na pior das hipóteses, você criará problemas de desempenho em outros bancos de dados. Eu prefiro executar uma instalação do PostgreSQL completamente isolada para teste por esse motivo.
Em vez disso: inicie uma instância descartável do PostgreSQL para teste
Alternativamente, se você estiver realmente interessado, pode fazer com que seu equipamento de teste localize os binários initdb
e postgres
, execute initdb
para criar um banco de dados, modifique pg_hba.conf
para trust
, execute postgres
para iniciá-lo em uma porta aleatória, crie um usuário, crie um banco de dados e execute os testes . Você pode até empacotar os binários do PostgreSQL para múltiplas arquiteturas em um jar e descompactar os da arquitetura atual em um diretório temporário antes de executar os testes.
Pessoalmente, acho que é uma grande dor que deve ser evitada; é muito mais fácil apenas ter um banco de dados de teste configurado. No entanto, ficou um pouco mais fácil com o advento do include_dir
suporte em postgresql.conf
; agora você pode apenas anexar uma linha e escrever um arquivo de configuração gerado para todo o resto.
Teste mais rápido com PostgreSQL
Para obter mais informações sobre como melhorar com segurança o desempenho do PostgreSQL para fins de teste, consulte uma resposta detalhada que escrevi sobre este tópico: Otimize o PostgreSQL para testes rápidos
O dialeto PostgreSQL de H2 não é um verdadeiro substituto
Algumas pessoas, em vez disso, usam o banco de dados H2 no modo de dialeto PostgreSQL para executar testes. Eu acho que isso é quase tão ruim quanto o pessoal do Rails usando SQLite para testes e PostgreSQL para implantação de produção.
H2 suporta algumas extensões PostgreSQL e emula o dialeto PostgreSQL. No entanto, é apenas isso - uma emulação. Você vai encontrar áreas onde H2 aceita uma consulta, mas PostgreSQL não faz, onde difere de comportamento, etc . Você também encontrará muitos lugares onde o PostgreSQL suporta fazer algo que o H2 simplesmente não consegue - como funções de janela, no momento da escrita.
Se você entender as limitações dessa abordagem e seu acesso ao banco de dados for simples, H2 pode ser adequado. Mas, nesse caso, você provavelmente é um candidato melhor para um ORM que abstrai o banco de dados porque você não está usando seus recursos interessantes de qualquer maneira - e, nesse caso, você não precisa mais se preocupar tanto com a compatibilidade do banco de dados.
Os espaços de tabela não são a resposta!
Você não usar uma tabela para criar um banco de dados "in-memory". Além de desnecessário, não ajudará no desempenho de maneira significativa, mas também é uma ótima maneira de interromper o acesso a qualquer outro que seja do seu interesse na mesma instalação do PostgreSQL. A documentação 9.4 agora contém o seguinte aviso :
AVISO
Embora localizados fora do diretório de dados principal do PostgreSQL, os espaços de tabela são parte integrante do cluster de banco de dados e não podem ser tratados como uma coleção autônoma de arquivos de dados. Eles dependem dos metadados contidos no diretório de dados principal e, portanto, não podem ser anexados a um cluster de banco de dados diferente ou fazer backup individualmente. Da mesma forma, se você perder um espaço de tabela (exclusão de arquivo, falha de disco, etc.), o cluster de banco de dados pode se tornar ilegível ou incapaz de iniciar. Colocar um espaço de tabela em um sistema de arquivos temporário como um ramdisk arrisca a confiabilidade de todo o cluster.
porque percebi que muitas pessoas estavam fazendo isso e tendo problemas.
(Se você fez isso, pode mkdir
remover o diretório do espaço de tabela ausente para fazer o PostgreSQL iniciar novamente, depois DROP
os bancos de dados, tabelas etc. ausentes. É melhor simplesmente não fazer isso.)