4 points par GN⁺ 2024-04-08 | 1 commentaires | Partager sur WhatsApp

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

 
GN⁺ 2024-04-08
Discussion Hacker News
  • Présentation de pgmock

    • Un développeur a créé pendant plusieurs mois une version en mémoire de Postgres.
    • Cette version est fonctionnellement équivalente à la base de données existante.
    • Elle ne nécessite ni processus externe ni proxy, et fonctionne sur les plateformes capables d’exécuter du WASM (Node.js, navigateur, etc.).
    • Il est possible de créer une nouvelle base de données et des données simulées aussi simplement qu’en créant un objet JavaScript.
    • Contrairement à pglite, pgmock exécute un émulateur x86 qui embarque le Postgres d’origine. pglite compile directement un fork de Postgres en WASM, ce qui le rend plus rapide et plus léger, mais il ne prend en charge que le mode mono-utilisateur et quelques extensions, et ne permet donc pas de se connecter avec un client Postgres classique.
    • En théorie, n’importe quelle image Docker pourrait être modifiée pour pouvoir s’exécuter sur une plateforme WebAssembly.
  • Question sur l’exécution de Postgres sur un disque RAM

    • Demande d’explication sur les avantages, par rapport à l’exécution de Postgres sur un disque RAM, de pouvoir l’exécuter dans un environnement navigateur/Node et de le laisser être créé/mis à jour/détruit par les tests.
  • Retour d’expérience sur l’usage d’un serveur en mémoire au lieu d’un vrai serveur

    • Dans le passé, diverses fausses implémentations de serveurs en mémoire (souvent sur mesure) ont été utilisées pour les tests, mais aujourd’hui c’est Testcontainers qui sert à lancer les vrais services.
  • Question sur la propriété intellectuelle du projet

    • Le fait que le titre dise « je l’ai construit au travail » soulève la question de savoir si la propriété intellectuelle appartient à l’employeur, et s’il est permis de le publier en open source si des ressources de l’entreprise ont été utilisées.
  • Conseil sur la réplication de l’environnement de développement

    • Il est recommandé de dumper les données de production, de supprimer les données sensibles et de réduire les tables inutiles comme les tables de logs afin de créer une copie de développement. La répliquer pour le développement, la QA, l’E2E, etc., permet de disposer des extensions, triggers, fonctions, vues, index et données nécessaires aux tests E2E.
  • Question sur l’origine de pgmock et son intégration dans la CI

    • Question sur la motivation derrière le développement de ce projet, et sur le fait de savoir si exécuter Postgres dans un conteneur Docker était trop lent.
    • Demande d’explication sur la configuration de la CI et le flux des tests E2E avant et après l’intégration de pgmock.
    • Question sur la difficulté éventuelle de migrer vers cette solution.
  • Question de comparaison avec la base de données H2

    • Question comparant pgmock à la base de données H2 en mode de compatibilité Postgres.
  • Retour d’expérience avec pgmem

    • Partage d’une expérience de travail menée ces dernières années avec pgmem dans un but similaire.
  • Question sur la prise en charge des ORM

    • Question sur la possibilité d’utiliser en test des ORM comme Sequelize, Prisma ou Drizzle.
  • Question sur l’utilisation possible avec le client Prisma

    • Question sur la manière dont cela pourrait fonctionner avec le client Prisma.