(Spostando la mia risposta dall'utilizzo di PostgreSQL in memoria e generalizzandola):
Non puoi eseguire Pg in-process, in-memory
Non riesco a capire come eseguire il database Postgres in memoria per i test. È possibile?
No, non è possibile. PostgreSQL è implementato in C e compilato nel codice della piattaforma. A differenza di H2 o Derby non puoi semplicemente caricare il jar
e accenderlo come un DB in memoria usa e getta.
A differenza di SQLite, che è scritto anche in C e compilato nel codice della piattaforma, PostgreSQL non può essere caricato in-process. Richiede più processi (uno per connessione) perché è un'architettura multiprocessing, non multithreading. Il requisito di multiprocessing significa che è necessario avviare il postmaster come processo autonomo.
Invece: preconfigurare una connessione
Suggerisco semplicemente di scrivere i tuoi test per aspettarti che un particolare nome host / nome utente / password funzioni e che il test utilizzi CREATE DATABASE
un database usa e getta, quindi DROP DATABASE
alla fine della corsa. Ottieni i dettagli della connessione al database da un file delle proprietà, crea proprietà di destinazione, variabile di ambiente, ecc.
È sicuro utilizzare un'istanza PostgreSQL esistente in cui hai già database a cui tieni, a condizione che l'utente che fornisci ai tuoi unit test non sia un superutente, ma solo un utente con CREATEDB
diritti. Nel peggiore dei casi creerai problemi di prestazioni negli altri database. Per questo motivo preferisco eseguire un'installazione PostgreSQL completamente isolata per i test.
Invece: avvia un'istanza PostgreSQL usa e getta per il test
In alternativa, se si sta davvero molto entusiasta si potrebbe avere il vostro test harness individuare le initdb
e postgres
file binari, eseguire initdb
per creare un database, modificare pg_hba.conf
a trust
, correre postgres
per avviarlo su una porta a caso, creare un utente, creare un DB, ed eseguire le prove . Potresti anche raggruppare i binari di PostgreSQL per più architetture in un jar e decomprimere quelli per l'architettura corrente in una directory temporanea prima di eseguire i test.
Personalmente penso che sia un grande dolore che dovrebbe essere evitato; è molto più semplice configurare un DB di prova. Tuttavia, è diventato un po 'più facile con l'avvento del include_dir
supporto in postgresql.conf
; ora puoi semplicemente aggiungere una riga, quindi scrivere un file di configurazione generato per tutto il resto.
Test più veloci con PostgreSQL
Per ulteriori informazioni su come migliorare in sicurezza le prestazioni di PostgreSQL a scopo di test, vedere una risposta dettagliata che ho scritto su questo argomento in precedenza: Ottimizza PostgreSQL per test veloci
Il dialetto PostgreSQL di H2 non è un vero sostituto
Alcune persone invece usano il database H2 in modalità dialetto PostgreSQL per eseguire i test. Penso che sia dannoso quasi quanto le persone Rails che usano SQLite per i test e PostgreSQL per la distribuzione in produzione.
H2 supporta alcune estensioni PostgreSQL ed emula il dialetto PostgreSQL. Tuttavia, è proprio questo: un'emulazione. Troverai aree in cui H2 accetta una query ma PostgreSQL no, dove il comportamento è diverso, ecc . Troverai anche molti posti in cui PostgreSQL supporta fare qualcosa che H2 semplicemente non può - come le funzioni della finestra, al momento della scrittura.
Se comprendi i limiti di questo approccio e l'accesso al database è semplice, H2 potrebbe andare bene. Ma in quel caso probabilmente sei un candidato migliore per un ORM che astrae il database perché non stai comunque utilizzando le sue caratteristiche interessanti - e in quel caso, non devi più preoccuparti della compatibilità del database.
I tablespace non sono la risposta!
Do Non utilizzare uno spazio tabella per creare una base di dati "in-memory". Non solo non è necessario in quanto non aiuterà comunque le prestazioni in modo significativo, ma è anche un ottimo modo per interrompere l'accesso a qualsiasi altro potrebbe interessarti nella stessa installazione di PostgreSQL. La documentazione 9.4 ora contiene il seguente avviso :
AVVERTIMENTO
Anche se si trovano al di fuori della directory principale dei dati di PostgreSQL, i tablespace sono parte integrante del cluster di database e non possono essere trattati come una raccolta autonoma di file di dati. Dipendono dai metadati contenuti nella directory dei dati principale e pertanto non possono essere collegati a un cluster di database diverso o sottoposti a backup singolarmente. Allo stesso modo, se si perde uno spazio tabella (eliminazione di file, guasto del disco, ecc.), Il cluster di database potrebbe diventare illeggibile o non essere in grado di avviarsi. Posizionare uno spazio tabella su un file system temporaneo come un ramdisk rischia l'affidabilità dell'intero cluster.
perché ho notato che troppe persone lo facevano e si trovavano nei guai.
(Se lo hai fatto, puoi utilizzare mkdir
la directory del tablespace mancante per far ripartire PostgreSQL, quindi DROP
i database, le tabelle, ecc. Mancanti, è meglio non farlo.)