4 पॉइंट द्वारा GN⁺ 2024-04-08 | 1 टिप्पणियां | WhatsApp पर शेयर करें

pgmock डेमो — Discord

  • pgmock यूनिट और E2E टेस्टिंग के लिए एक in-memory PostgreSQL mock server है.
  • इसमें कोई external dependency नहीं है और यह Node.js तथा browser, दोनों में WebAssembly के भीतर पूरी तरह चलता है.

इंस्टॉलेशन

  • npm install pgmock कमांड से इसे इंस्टॉल किया जा सकता है.
  • अगर आप browser में pgmock चलाना चाहते हैं, तो browser support सेक्शन में दिए गए विस्तृत निर्देश देखें.

शुरुआत

  • in-memory server को इस तरह चलाया जा सकता है:
    import { PostgresMock } from "pgmock";
    const mock = await PostgresMock.create();
    const connectionString = await mock.listen(5432);
    
  • अगर आप node-postgres (npm पर pg) का उपयोग कर रहे हैं, तो यह port का उपयोग किए बिना browser में भी काम करने वाला config object देता है:
    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!']));
    
  • उपयोग के बाद resources मुक्त करने के लिए mock server को destroy करना अच्छा अभ्यास है:
    mock.destroy();
    

दस्तावेज़ीकरण

  • उपलब्ध सभी methods और उनके documentation की सूची के लिए PostgresMock source file देखें.

browser support

  • pgmock browser environment को पूरी तरह support करता है.
  • web app TCP ports पर listen नहीं कर सकता, लेकिन PostgresMock.createSocket और node-postgres config का उपयोग किया जा सकता है.
  • यदि bundler static imports का analysis करता है, तो missing (optional) Node.js modules के कारण default config में warnings दिख सकती हैं.
  • अगर आप browser में सिर्फ database चलाना चाहते हैं, तो pglite पर विचार कर सकते हैं, हालांकि इसकी functionality सीमित है.
  • pgmock को test environment में उस production PostgreSQL environment के साथ functional equivalence लक्ष्य में रखकर डिज़ाइन किया गया है, जिसे आप चाहते हैं.

यह कैसे काम करता है

  • WebAssembly में Postgres चलाने के दो तरीके हैं: या तो WASM के native support के लिए fork किया जाए, या x86 emulator में Postgres server को emulate किया जाए.
  • पहला तरीका बेहतर performance और कम memory usage देता है, लेकिन single-user mode (बिना connections) और extensions को support नहीं करता.
  • क्योंकि test और production के बीच अंतर से बचना ज़रूरी है और tests में performance मुख्य चिंता नहीं है, इसलिए pgmock अभी दूसरे तरीके का उपयोग करता है.
  • मध्यम अवधि में, जब native Postgres WASM fork परिपक्व हो जाएगा, तो दोनों विकल्प देने और अंततः default रूप से native WASM पर जाने की योजना है.
  • PostgresMock.subtle के अंदर के APIs को छोड़कर, बहुत अधिक बदलाव होने की उम्मीद नहीं है.
  • pgmock JavaScript के भीतर एक network stack simulate करता है जो वास्तविक network की तरह व्यवहार करता है, ताकि raw socket access की अनुमति न देने वाले platforms पर भी TCP connections simulate किए जा सकें, और network proxy पर निर्भर हुए बिना पूरी functional compatibility पूरी तरह JavaScript runtime के भीतर उपलब्ध कराई जा सके.

योगदान करना चाहते हैं?

  • आप Discord server पर हमसे बात कर सकते हैं.

क्या अन्य Docker images या databases चलाए जा सकते हैं?

  • सैद्धांतिक रूप से हाँ. यदि रुचि हो, तो Discord server पर संपर्क करें.

आभार

  • इसे संभव बनाने वाले x86 emulator v86 का धन्यवाद.
  • WebAssembly के भीतर Postgres चलाने का अपना तरीका बनाने वाले Supabase & Snaplet का धन्यवाद.
  • pgmock बनाते समय वेतन देने के लिए Stackframe का धन्यवाद.

GN⁺ की राय

  • pgmock उन developers के लिए उपयोगी tool है जो PostgreSQL database के साथ interaction की testing करना चाहते हैं. यह वास्तविक database server को setup और manage करने की झंझट के बिना आपके code के database interactions को validate करने देता है.
  • ऐसे tools test-driven development (TDD) या continuous integration (CI) environments में बहुत उपयोगी होते हैं. developers तेज़ी से tests चला सकते हैं और code changes के प्रभाव को तुरंत देख सकते हैं.
  • pgmock WebAssembly का उपयोग करता है, इसलिए यह browser और Node.js, दोनों environments में काम करता है, जिससे अलग-अलग development environments में compatibility मिलती है. इसका लाभ frontend और backend developers, दोनों को मिलता है.
  • हालांकि, यह सवाल बना रहता है कि क्या pgmock वास्तविक PostgreSQL server की सभी capabilities को पूरी तरह emulate कर सकता है, खासकर performance और extension support के मामले में. वास्तविक database environment से अंतर test results को प्रभावित कर सकता है.
  • मिलते-जुलते features देने वाले अन्य projects में Testcontainers और H2 Database शामिल हैं; ये क्रमशः Docker containers का उपयोग करने वाली integration testing और Java applications के लिए in-memory database उपलब्ध कराते हैं.

1 टिप्पणियां

 
GN⁺ 2024-04-08
Hacker News की राय
  • pgmock का परिचय

    • एक डेवलपर ने कई महीनों तक Postgres का in-memory version विकसित किया।
    • यह version मौजूदा database के साथ functionally equivalent है।
    • इसमें किसी external process या proxy की ज़रूरत नहीं है, और यह उन platforms पर चलता है जो WASM चला सकते हैं (Node.js, browser आदि)।
    • आप JavaScript object बनाने जितनी आसानी से नया database और mock data बना सकते हैं।
    • pglite से अलग, pgmock अंदर मूल Postgres को शामिल करने वाला x86 emulator चलाता है। pglite, Postgres fork को सीधे WASM में compile करता है, इसलिए वह ज़्यादा तेज़ और हल्का है, लेकिन केवल single-user mode और कुछ extensions को support करता है, इसलिए उससे सामान्य Postgres client के ज़रिए connect नहीं किया जा सकता।
    • सैद्धांतिक रूप से, किसी भी Docker image को इस तरह संशोधित किया जा सकता है कि वह WebAssembly platform पर चल सके।
  • RAM disk पर Postgres चलाने को लेकर सवाल

    • Postgres को RAM disk पर चलाने की तुलना में, browser/Node environment में चलने और tests द्वारा create/update/destroy किए जा सकने वाले फायदों को समझाने का अनुरोध।
  • असल server की जगह in-memory server इस्तेमाल करने का अनुभव साझा

    • पहले tests में कई तरह के (custom) fake in-memory servers इस्तेमाल किए गए थे, लेकिन अब Testcontainers का उपयोग करके real services चलाई जाती हैं।
  • प्रोजेक्ट की intellectual property पर सवाल

    • title में "मैंने इसे काम पर बनाया" कहने का क्या मतलब यह है कि intellectual property employer की है, और अगर workplace resources का उपयोग किया गया हो तो क्या इसे open source के रूप में जारी करना अनुमत है—इस पर सवाल उठाया गया।
  • development environment की नकल बनाने पर सलाह

    • production data का dump लेने, sensitive data हटाने, और log tables जैसी गैर-ज़रूरी tables को कम करके development copy बनाने की सलाह। इसे development, QA, E2E आदि में replicate करने से E2E tests के लिए ज़रूरी extensions, triggers, functions, views, indexes और data मिल सकते हैं।
  • pgmock के development background और CI integration पर सवाल

    • इस project को बनाने की प्रेरणा क्या थी, और क्या Docker container में Postgres चलाना बहुत धीमा था—इस पर सवाल।
    • pgmock integrate करने से पहले और बाद की CI setup और E2E test flow का विवरण मांगा गया।
    • यह भी पूछा गया कि इस solution पर migrate करना कठिन था या नहीं।
  • H2 database से तुलना का सवाल

    • Postgres compatibility mode में H2 database और pgmock की तुलना को लेकर सवाल।
  • pgmem इस्तेमाल करने का अनुभव साझा

    • समान उद्देश्य के लिए पिछले कुछ वर्षों में pgmem के साथ काम करने का अनुभव साझा किया गया।
  • ORM support पर सवाल

    • क्या Sequelize, Prisma, Drizzle जैसे ORM को tests में इस्तेमाल किया जा सकता है—यह पूछा गया।
  • Prisma client के साथ इस्तेमाल की संभावना पर सवाल

    • Prisma client के साथ इसे इस्तेमाल करने का कोई तरीका है या नहीं—इस पर सवाल।