Démo de pgmock — Discord
pgmock est un serveur factice PostgreSQL en mémoire pour les tests unitaires et E2E.
- Il n’a aucune dépendance externe et s’exécute entièrement dans WebAssembly, aussi bien dans Node.js que dans le navigateur.
Installation
- Installation possible via la commande
npm install pgmock.
- Si vous souhaitez exécuter
pgmock dans le navigateur, consultez les instructions détaillées dans la section de prise en charge du navigateur.
Prise en main
- Il est possible de lancer un serveur en mémoire comme suit :
import { PostgresMock } from "pgmock";
const mock = await PostgresMock.create();
const connectionString = await mock.listen(5432);
- Si vous utilisez
node-postgres (pg sur npm), un objet de configuration est fourni, fonctionnant aussi dans le navigateur sans utiliser de port :
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!']));
- Après utilisation, il est recommandé de détruire le serveur factice pour libérer les ressources :
mock.destroy();
Documentation
- Pour la liste de toutes les méthodes disponibles et leur documentation, consultez le fichier source de PostgresMock.
Prise en charge du navigateur
pgmock prend entièrement en charge l’environnement navigateur.
- Une webapp ne peut pas écouter sur des ports TCP, mais il est possible d’utiliser
PostgresMock.createSocket et la configuration node-postgres.
- Si le bundler analyse les imports statiques, des avertissements peuvent apparaître dans la configuration par défaut à cause de modules Node.js manquants mais optionnels.
- Si vous souhaitez seulement exécuter une base de données dans le navigateur, vous pouvez envisager
pglite, mais ses fonctionnalités sont limitées.
pgmock a été conçu pour viser une équivalence fonctionnelle avec l’environnement PostgreSQL de production souhaité dans un contexte de test.
Fonctionnement
- Il existe deux approches pour exécuter Postgres dans WebAssembly : forker Postgres pour qu’il prenne nativement en charge WASM, ou émuler le serveur Postgres dans un émulateur x86.
- La première offre de meilleures performances et consomme moins de mémoire, mais elle ne prend pas en charge le mode mono-utilisateur (sans connexion) ni les extensions.
- Pour éviter les écarts entre test et production, et parce que les performances ne sont pas la préoccupation principale en test,
pgmock utilise actuellement la seconde approche.
- À moyen terme, lorsque le fork WASM natif de Postgres sera plus mature, l’objectif est de proposer les deux options, puis à terme de basculer par défaut vers le WASM natif.
- Hormis l’API située dans
PostgresMock.subtle, peu de changements importants sont attendus.
pgmock simule une pile réseau en JavaScript qui se comporte comme un vrai réseau, ce qui permet de simuler des connexions TCP même sur des plateformes qui n’autorisent pas l’accès direct aux sockets bruts, et d’offrir ainsi une compatibilité fonctionnelle complète entièrement dans le runtime JavaScript, sans dépendre d’un proxy réseau.
Vous souhaitez contribuer ?
- Vous pouvez venir discuter avec nous sur le serveur Discord.
Peut-on exécuter d’autres images Docker ou bases de données ?
- En théorie, oui. Si cela vous intéresse, contactez-nous sur le serveur Discord.
Remerciements
- Merci à v86, l’émulateur x86 qui rend cela possible.
- Merci à Supabase & Snaplet, qui ont construit leur propre approche pour exécuter Postgres dans WebAssembly.
- Merci à Stackframe, qui a financé le développement de
pgmock.
L’avis de GN⁺
pgmock est un outil utile pour les développeurs qui testent les interactions avec une base de données PostgreSQL. Il permet de valider les interactions de leur code avec la base sans avoir à déployer et gérer un vrai serveur de base de données.
- Ce type d’outil est très utile en développement piloté par les tests (TDD) ou dans un environnement d’intégration continue (CI). Les développeurs peuvent lancer rapidement les tests et vérifier immédiatement l’impact des changements de code.
- Comme
pgmock fonctionne à la fois dans le navigateur et dans Node.js grâce à WebAssembly, il offre une bonne compatibilité entre différents environnements de développement. C’est un avantage aussi bien pour les développeurs frontend que backend.
- Il reste toutefois des questions quant à la capacité de
pgmock à émuler parfaitement toutes les fonctionnalités d’un vrai serveur PostgreSQL, notamment du point de vue des performances et des extensions. Les différences avec un environnement réel de base de données peuvent influencer les résultats des tests.
- Parmi les projets offrant des fonctionnalités similaires, on peut citer Testcontainers, H2 Database, etc. Ils proposent respectivement des tests d’intégration basés sur des conteneurs Docker et une base de données en mémoire pour les applications Java.
1 commentaires
Discussion Hacker News
Présentation de pgmock
Question sur l’exécution de Postgres sur un disque RAM
Retour d’expérience sur l’usage d’un serveur en mémoire au lieu d’un vrai serveur
Question sur la propriété intellectuelle du projet
Conseil sur la réplication de l’environnement de développement
Question sur l’origine de pgmock et son intégration dans la CI
Question de comparaison avec la base de données H2
Retour d’expérience avec pgmem
Question sur la prise en charge des ORM
Question sur l’utilisation possible avec le client Prisma