4 poin oleh GN⁺ 2024-04-08 | 1 komentar | Bagikan ke WhatsApp

Demo pgmock — Discord

  • pgmock adalah server tiruan PostgreSQL dalam memori untuk pengujian unit dan E2E.
  • Tidak memiliki dependensi eksternal dan berjalan sepenuhnya di dalam WebAssembly, baik di Node.js maupun browser.

Instalasi

  • Dapat diinstal melalui perintah npm install pgmock.
  • Jika ingin menjalankan pgmock di browser, lihat petunjuk rinci pada bagian dukungan browser.

Memulai

  • Server dalam memori dapat dijalankan seperti berikut:
    import { PostgresMock } from "pgmock";
    const mock = await PostgresMock.create();
    const connectionString = await mock.listen(5432);
    
  • Jika menggunakan node-postgres(pg di npm), tersedia objek konfigurasi yang bekerja di browser tanpa menggunakan 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!']));
    
  • Setelah selesai digunakan, merupakan praktik yang baik untuk menghancurkan server tiruan agar sumber daya dibebaskan:
    mock.destroy();
    

Dokumentasi

  • Untuk daftar semua metode yang tersedia beserta dokumentasinya, lihat file sumber PostgresMock.

Dukungan browser

  • pgmock sepenuhnya mendukung lingkungan browser.
  • Aplikasi web tidak dapat mendengarkan port TCP, tetapi dapat menggunakan PostgresMock.createSocket dan konfigurasi node-postgres.
  • Jika bundler menganalisis impor statis, konfigurasi default dapat menampilkan peringatan karena modul Node.js yang hilang (opsional).
  • Jika hanya ingin menjalankan database di browser, Anda bisa mempertimbangkan pglite, tetapi fiturnya terbatas.
  • pgmock dirancang dengan tujuan agar setara secara fungsional dengan lingkungan PostgreSQL produksi yang diinginkan dalam lingkungan pengujian.

Cara kerjanya

  • Ada dua pendekatan untuk menjalankan Postgres di WebAssembly: melakukan fork agar mendukung WASM secara native, atau mengemulasikan server Postgres di emulator x86.
  • Yang pertama memiliki performa lebih baik dan penggunaan memori lebih rendah, tetapi tidak mendukung mode pengguna tunggal (tanpa koneksi) dan fitur ekstensi.
  • Untuk mencegah perbedaan antara pengujian dan produksi, dan karena performa bukan perhatian utama dalam pengujian, pgmock saat ini menggunakan pendekatan kedua.
  • Dalam jangka menengah, jika fork WASM Postgres native sudah matang, ada rencana untuk menyediakan kedua opsi, lalu pada akhirnya beralih ke WASM native sebagai default.
  • Kecuali API di dalam PostgresMock.subtle, diperkirakan tidak akan ada banyak perubahan.
  • pgmock menyediakan kompatibilitas fitur penuh sepenuhnya di dalam runtime JavaScript tanpa bergantung pada proksi jaringan, dengan mensimulasikan stack jaringan di dalam JavaScript yang berperilaku seperti jaringan nyata, sehingga koneksi TCP dapat disimulasikan bahkan di platform yang tidak mengizinkan akses socket mentah.

Ingin berkontribusi?

  • Anda dapat berbicara dengan kami di server Discord.

Apakah bisa menjalankan image Docker atau database lain?

  • Secara teori bisa. Jika tertarik, silakan hubungi di server Discord.

Ucapan terima kasih

  • Terima kasih kepada v86, emulator x86 yang memungkinkan ini.
  • Terima kasih kepada Supabase & Snaplet yang membangun pendekatan mereka sendiri untuk menjalankan Postgres di dalam WebAssembly.
  • Terima kasih kepada Stackframe yang membayar gaji selama pembangunan pgmock.

Opini GN⁺

  • pgmock adalah alat yang berguna saat pengembang menguji interaksi dengan database PostgreSQL. Tanpa kerepotan menyiapkan dan mengelola server database sungguhan, interaksi database dari kode dapat divalidasi.
  • Alat seperti ini sangat berguna dalam pengembangan berbasis pengujian (TDD) atau lingkungan integrasi berkelanjutan (CI). Pengembang dapat menjalankan pengujian dengan cepat dan langsung melihat dampak dari perubahan kode.
  • Karena pgmock menggunakan WebAssembly dan bekerja baik di browser maupun lingkungan Node.js, alat ini memberikan kompatibilitas di berbagai lingkungan pengembangan. Ini menguntungkan pengembang frontend maupun backend.
  • Namun, masih ada pertanyaan apakah pgmock dapat mengemulasikan seluruh fitur server PostgreSQL sungguhan secara sempurna, terutama dari sisi performa dan fitur ekstensi. Perbedaan dengan lingkungan database nyata dapat memengaruhi hasil pengujian.
  • Proyek lain dengan fungsi serupa antara lain Testcontainers dan H2 Database, yang masing-masing menyediakan pengujian integrasi berbasis kontainer Docker dan database dalam memori untuk aplikasi Java.

1 komentar

 
GN⁺ 2024-04-08
Komentar Hacker News
  • Pengenalan pgmock

    • Seorang pengembang membuat versi in-memory dari Postgres selama beberapa bulan.
    • Versi ini setara secara fungsional dengan database yang ada.
    • Tidak memerlukan proses eksternal atau proxy, dan berjalan di platform yang dapat menjalankan WASM (Node.js, browser, dll.).
    • Database baru dan data tiruan dapat dibuat semudah membuat objek JavaScript.
    • Berbeda dengan pglite, pgmock menjalankan emulator x86 yang menyertakan Postgres asli di dalamnya. pglite langsung mengompilasi fork Postgres ke WASM sehingga lebih cepat dan ringan, tetapi hanya mendukung mode pengguna tunggal dan beberapa ekstensi, sehingga tidak bisa dihubungkan dengan klien Postgres biasa.
    • Secara teori, image Docker apa pun juga bisa dimodifikasi agar dapat berjalan di platform WebAssembly.
  • Pertanyaan tentang menjalankan Postgres di RAM disk

    • Permintaan untuk menjelaskan kelebihannya dibanding menjalankan Postgres di RAM disk, terutama karena bisa berjalan di lingkungan browser/Node dan dapat dibuat/diperbarui/dihancurkan oleh pengujian.
  • Berbagi pengalaman menggunakan server in-memory alih-alih server nyata

    • Dulu pernah menggunakan berbagai server in-memory palsu (dan kustom) untuk pengujian, tetapi sekarang memakai Testcontainers untuk menjalankan layanan nyata.
  • Pertanyaan tentang hak kekayaan intelektual proyek

    • Mempertanyakan apakah frasa "saya membuat ini saat bekerja" di judul berarti hak kekayaan intelektualnya dimiliki pemberi kerja, dan apakah boleh merilisnya sebagai open source jika menggunakan sumber daya kantor.
  • Saran untuk mereplikasi lingkungan pengembangan

    • Disarankan untuk melakukan dump data produksi, menghapus data sensitif, dan memangkas tabel yang tidak perlu seperti tabel log untuk membuat salinan pengembangan. Dengan mereplikasikannya ke pengembangan, QA, E2E, dan lainnya, kita bisa mendapatkan ekstensi, trigger, fungsi, view, indeks, dan data yang diperlukan untuk pengujian E2E.
  • Pertanyaan tentang latar belakang pengembangan pgmock dan integrasi CI

    • Pertanyaan tentang motivasi membuat proyek ini dan apakah menjalankan Postgres dalam container Docker memang terlalu lambat.
    • Permintaan penjelasan tentang pengaturan CI dan alur pengujian E2E sebelum dan sesudah mengintegrasikan pgmock.
    • Pertanyaan apakah migrasi ke solusi ini sulit dilakukan.
  • Pertanyaan perbandingan dengan database H2

    • Pertanyaan yang membandingkan database H2 dalam mode kompatibilitas Postgres dengan pgmock.
  • Berbagi pengalaman menggunakan pgmem

    • Berbagi pengalaman telah memakai pgmem untuk tujuan serupa selama beberapa tahun terakhir.
  • Pertanyaan tentang dukungan ORM

    • Pertanyaan apakah ORM seperti Sequelize, Prisma, dan Drizzle dapat digunakan untuk pengujian.
  • Pertanyaan tentang kemungkinan penggunaan dengan klien Prisma

    • Pertanyaan tentang cara menggunakannya bersama klien Prisma.