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
Komentar Hacker News
Pengenalan pgmock
Pertanyaan tentang menjalankan Postgres di RAM disk
Berbagi pengalaman menggunakan server in-memory alih-alih server nyata
Pertanyaan tentang hak kekayaan intelektual proyek
Saran untuk mereplikasi lingkungan pengembangan
Pertanyaan tentang latar belakang pengembangan pgmock dan integrasi CI
Pertanyaan perbandingan dengan database H2
Berbagi pengalaman menggunakan pgmem
Pertanyaan tentang dukungan ORM
Pertanyaan tentang kemungkinan penggunaan dengan klien Prisma