Demo de pgmock — Discord
pgmock es un servidor simulado de PostgreSQL en memoria para pruebas unitarias y E2E.
- No tiene dependencias externas y se ejecuta por completo dentro de WebAssembly tanto en Node.js como en el navegador.
Instalación
- Se puede instalar con el comando
npm install pgmock.
- Si quieres ejecutar
pgmock en el navegador, consulta las instrucciones detalladas en la sección de compatibilidad con navegadores.
Primeros pasos
- Puedes iniciar el servidor en memoria de la siguiente manera:
import { PostgresMock } from "pgmock";
const mock = await PostgresMock.create();
const connectionString = await mock.listen(5432);
- Si usas
node-postgres (pg en npm), proporciona un objeto de configuración que funciona también en el navegador sin usar puertos:
import * as pg from "pg";
const mock = await PostgresMock.create();
const client = new pg.Client(mock.getNodePostgresConfig());
await client.connect();
console.log(await client.query('SELECT $1::text as message', ['Hello world!']));
- Después de usarlo, es una buena práctica destruir el servidor simulado para liberar recursos:
mock.destroy();
Documentación
- Para ver la lista de todos los métodos disponibles y su documentación, revisa el archivo fuente de PostgresMock.
Compatibilidad con navegadores
pgmock ofrece compatibilidad completa con entornos de navegador.
- Aunque las web apps no pueden escuchar puertos TCP, se puede usar
PostgresMock.createSocket junto con la configuración de node-postgres.
- Si tu bundler analiza importaciones estáticas, podrían aparecer advertencias en la configuración predeterminada debido a módulos opcionales de Node.js faltantes.
- Si solo quieres ejecutar una base de datos en el navegador, puedes considerar
pglite, aunque tiene funciones limitadas.
pgmock fue diseñado con el objetivo de ser funcionalmente equivalente al entorno de PostgreSQL de producción que quieres en pruebas.
Cómo funciona
- Hay dos enfoques para ejecutar Postgres en WebAssembly: hacer un fork para que soporte WASM de forma nativa o emular el servidor Postgres dentro de un emulador x86.
- El primero ofrece mejor rendimiento y menor uso de memoria, pero no soporta el modo de usuario único (sin conexiones) ni extensiones.
- Para evitar diferencias entre pruebas y producción, y dado que el rendimiento no es la principal preocupación en pruebas,
pgmock usa actualmente el segundo enfoque.
- A mediano plazo, cuando madure un fork nativo de Postgres para WASM, planean ofrecer ambas opciones y eventualmente cambiar al WASM nativo por defecto.
- No se espera que haya muchos cambios, salvo en la API dentro de
PostgresMock.subtle.
pgmock simula un stack de red en JavaScript que se comporta como una red real, lo que permite simular conexiones TCP incluso en plataformas que no permiten acceso a sockets sin procesar, brindando compatibilidad funcional completa totalmente dentro del runtime de JavaScript sin depender de proxies de red.
¿Quieres contribuir?
- Puedes hablar con nosotros en el servidor de Discord.
¿Se pueden ejecutar otras imágenes de Docker o bases de datos?
- En teoría sí. Si te interesa, ponte en contacto en el servidor de Discord.
Agradecimientos
- Gracias a v86, el emulador x86 que hace esto posible.
- Gracias a Supabase y Snaplet por haber construido su propio enfoque para ejecutar Postgres dentro de WebAssembly.
- Gracias a Stackframe por pagar el salario durante la construcción de
pgmock.
Opinión de GN⁺
pgmock es una herramienta útil para desarrolladores que prueban interacciones con bases de datos PostgreSQL. Permite validar la interacción del código con la base de datos sin la molestia de configurar y administrar un servidor de base de datos real.
- Este tipo de herramienta es muy útil en entornos de desarrollo guiado por pruebas (TDD) o integración continua (CI). Los desarrolladores pueden ejecutar pruebas rápidamente y verificar de inmediato el impacto de los cambios en el código.
- Como
pgmock funciona tanto en el navegador como en Node.js usando WebAssembly, ofrece compatibilidad en diversos entornos de desarrollo. Esto beneficia tanto a desarrolladores frontend como backend.
- Sin embargo, sigue quedando la duda de si
pgmock puede emular perfectamente todas las funciones de un servidor PostgreSQL real, especialmente en aspectos como rendimiento y extensiones. Las diferencias con el entorno real de base de datos podrían afectar los resultados de las pruebas.
- Otros proyectos con funciones similares incluyen Testcontainers y H2 Database, que ofrecen respectivamente pruebas de integración usando contenedores Docker y una base de datos en memoria para aplicaciones Java.
1 comentarios
Comentarios de Hacker News
Introducción a pgmock
Pregunta sobre ejecutar Postgres en un disco RAM
Experiencia usando servidores en memoria en lugar de servidores reales
Pregunta sobre la propiedad intelectual del proyecto
Consejo sobre replicar el entorno de desarrollo
Pregunta sobre el origen de pgmock y su integración con CI
Pregunta de comparación con la base de datos H2
Experiencia usando pgmem
Pregunta sobre soporte para ORM
Pregunta sobre uso con Prisma Client