(Moviendo mi respuesta de Usar PostgreSQL en memoria y generalizándola):
No puede ejecutar Pg en proceso, en memoria
No puedo averiguar cómo ejecutar la base de datos de Postgres en memoria para realizar pruebas. ¿Es posible?
No, no es posible. PostgreSQL se implementa en C y se compila en el código de la plataforma. A diferencia de H2 o Derby, no puede simplemente cargar el jar
y activarlo como una base de datos en memoria desechable.
A diferencia de SQLite, que también está escrito en C y compilado en el código de la plataforma, PostgreSQL tampoco se puede cargar en el proceso. Requiere múltiples procesos (uno por conexión) porque es una arquitectura de multiprocesamiento, no de múltiples subprocesos. El requisito de multiprocesamiento significa que debe iniciar el administrador de correos como un proceso independiente.
En su lugar: preconfigura una conexión
Sugiero simplemente escribir sus pruebas para esperar que funcione un nombre de host / nombre de usuario / contraseña en particular, y hacer que la prueba aproveche CREATE DATABASE
una base de datos desechable, luego DROP DATABASE
al final de la ejecución. Obtenga los detalles de conexión de la base de datos de un archivo de propiedades, cree propiedades de destino, variable de entorno, etc.
Es seguro usar una instancia de PostgreSQL existente en la que ya tiene bases de datos que le interesan, siempre que el usuario que proporcione a sus pruebas unitarias no sea un superusuario, solo un usuario con CREATEDB
derechos. En el peor de los casos, creará problemas de rendimiento en las otras bases de datos. Prefiero ejecutar una instalación de PostgreSQL completamente aislada para realizar pruebas por ese motivo.
En su lugar: inicie una instancia de PostgreSQL desechable para realizar pruebas
Alternativamente, si usted está realmente Keen usted podría tener su instrumento de prueba localizar las initdb
y postgres
los binarios, dirigido initdb
a crear una base de datos, modificar pg_hba.conf
a trust
, correr postgres
para iniciarlo en un puerto aleatorio, crear un usuario, crear una base de datos, y ejecutar las pruebas . Incluso podría agrupar los binarios de PostgreSQL para múltiples arquitecturas en un contenedor y descomprimir los de la arquitectura actual en un directorio temporal antes de ejecutar las pruebas.
Personalmente, creo que es un gran dolor que debe evitarse; es mucho más fácil configurar una base de datos de prueba. Sin embargo, se ha vuelto un poco más fácil con la llegada del include_dir
soporte postgresql.conf
; ahora puede agregar una línea y luego escribir un archivo de configuración generado para el resto.
Pruebas más rápidas con PostgreSQL
Para obtener más información sobre cómo mejorar de forma segura el rendimiento de PostgreSQL con fines de prueba, consulte una respuesta detallada que escribí sobre este tema anteriormente: Optimizar PostgreSQL para pruebas rápidas
El dialecto PostgreSQL de H2 no es un verdadero sustituto
En cambio, algunas personas usan la base de datos H2 en el modo de dialecto de PostgreSQL para ejecutar pruebas. Creo que eso es casi tan malo como la gente de Rails que usa SQLite para pruebas y PostgreSQL para implementación de producción.
H2 admite algunas extensiones de PostgreSQL y emula el dialecto de PostgreSQL. Sin embargo, es solo eso, una emulación. Encontrará áreas donde H2 acepta una consulta, pero PostgreSQL no, donde se diferencia de comportamiento, etc . También encontrará muchos lugares donde PostgreSQL admite hacer algo que H2 simplemente no puede, como funciones de ventana, al momento de escribir.
Si comprende las limitaciones de este enfoque y su acceso a la base de datos es simple, H2 podría estar bien. Pero en ese caso, probablemente sea un mejor candidato para un ORM que abstraiga la base de datos porque de todos modos no está usando sus características interesantes, y en ese caso, ya no tiene que preocuparse tanto por la compatibilidad de la base de datos.
¡Los espacios de tabla no son la respuesta!
No , no utilizar un espacio de tablas para crear una base de datos "en memoria". No solo es innecesario, ya que de todos modos no ayudará al rendimiento de manera significativa, sino que también es una excelente manera de interrumpir el acceso a cualquier otro que pueda interesarle en la misma instalación de PostgreSQL. La documentación 9.4 ahora contiene la siguiente advertencia :
ADVERTENCIA
Aunque se encuentran fuera del directorio de datos principal de PostgreSQL, los espacios de tabla son una parte integral del clúster de la base de datos y no pueden tratarse como una colección autónoma de archivos de datos. Dependen de los metadatos contenidos en el directorio de datos principal y, por lo tanto, no se pueden adjuntar a un clúster de base de datos diferente ni respaldar individualmente. De manera similar, si pierde un espacio de tabla (eliminación de archivos, falla del disco, etc.), el clúster de la base de datos podría volverse ilegible o no poder iniciarse. Colocar un espacio de tabla en un sistema de archivos temporal como un disco RAM pone en riesgo la confiabilidad de todo el clúster.
porque me di cuenta de que demasiadas personas estaban haciendo esto y tenían problemas.
(Si ha hecho esto, puede mkdir
usar el directorio de espacio de tabla que falta para que PostgreSQL comience de nuevo, luego DROP
las bases de datos, tablas, etc. faltantes. Es mejor no hacerlo).