pgmock demosu — Discord
pgmock, birim ve E2E testleri için bellek içi bir PostgreSQL sahte sunucusudur.
- Harici bağımlılığı yoktur ve hem Node.js'te hem de tarayıcıda tamamen WebAssembly içinde çalışır.
Kurulum
npm install pgmock komutuyla kurulabilir.
- Tarayıcıda
pgmock çalıştırmak istiyorsanız, ayrıntılı talimatlar için tarayıcı desteği bölümüne bakın.
Başlangıç
- Bellek içi sunucuyu şu şekilde çalıştırabilirsiniz:
import { PostgresMock } from "pgmock";
const mock = await PostgresMock.create();
const connectionString = await mock.listen(5432);
node-postgres(npm üzerindeki pg) kullanıyorsanız, port kullanmadan ve tarayıcıda da çalışan bir yapılandırma nesnesi sağlar:
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!']));
- Kullanımdan sonra kaynakları serbest bırakmak için sahte sunucuyu yok etmek iyi bir pratiktir:
mock.destroy();
Dokümantasyon
- Kullanılabilir tüm metotların ve ilgili dokümantasyonun listesi için PostgresMock kaynak dosyasına bakın.
Tarayıcı desteği
pgmock, tarayıcı ortamını tamamen destekler.
- Web uygulamaları TCP portlarını dinleyemez, ancak
PostgresMock.createSocket ve node-postgres yapılandırması kullanılabilir.
- Bundler statik importları analiz ediyorsa, eksik (isteğe bağlı) Node.js modülleri nedeniyle varsayılan yapılandırmada uyarılar görünebilir.
- Tarayıcıda yalnızca veritabanını çalıştırmak istiyorsanız
pglite düşünülebilir, ancak bunun özellikleri sınırlıdır.
pgmock, test ortamında istenen üretim PostgreSQL ortamıyla işlevsel olarak eşdeğer olmayı hedefleyecek şekilde tasarlanmıştır.
Nasıl çalışır
- Postgres'i WebAssembly'de çalıştırmanın iki yaklaşımı vardır: WASM'ı yerel olarak destekleyecek şekilde fork etmek ya da bir x86 emülatöründe Postgres sunucusunu emüle etmek.
- İlki daha yüksek performans ve daha düşük bellek kullanımı sunar, ancak tek kullanıcılı modu (bağlantı yok) ve eklenti özelliklerini desteklemez.
- Test ile üretim arasındaki farkları önlemek ve testlerde performansın ana öncelik olmaması nedeniyle
pgmock, şu anda ikinci yaklaşımı kullanır.
- Orta vadede, yerel Postgres WASM fork'u olgunlaştığında her iki seçeneği de sunmayı ve sonunda varsayılan olarak yerel WASM'a geçmeyi planlıyor.
PostgresMock.subtle içindeki API'ler dışında çok fazla değişiklik beklenmiyor.
pgmock, gerçek ağ gibi davranan JavaScript içi bir ağ yığınını simüle ederek, ham soket erişimine izin vermeyen platformlarda bile TCP bağlantılarının simüle edilmesini sağlar; böylece ağ proxy'lerine bağlı kalmadan tamamen JavaScript çalışma zamanı içinde tam işlev uyumluluğu sunar.
Katkıda bulunmak ister misiniz?
- Discord sunucusunda bizimle konuşabilirsiniz.
Başka Docker imajları veya veritabanları çalıştırabilir misiniz?
- Teorik olarak mümkün. İlgileniyorsanız Discord sunucusunda iletişime geçin.
Teşekkürler
- Bunu mümkün kılan x86 emülatörü v86'ya teşekkürler.
- WebAssembly içinde Postgres çalıştırmak için kendi yaklaşımını geliştiren Supabase ve Snaplet'e teşekkürler.
pgmock geliştirilirken maaş ödeyen Stackframe'e teşekkürler.
GN⁺ görüşü
pgmock, geliştiricilerin PostgreSQL veritabanıyla etkileşimlarını test ederken kullanışlı bir araçtır. Gerçek bir veritabanı sunucusunu kurup yönetme zahmeti olmadan, kodun veritabanı etkileşimlerini doğrulayabilir.
- Bu tür araçlar test odaklı geliştirme (TDD) veya sürekli entegrasyon (CI) ortamlarında çok faydalıdır. Geliştiriciler testleri hızlıca çalıştırabilir ve kod değişikliklerinin etkisini anında görebilir.
pgmock, WebAssembly kullanarak hem tarayıcıda hem de Node.js ortamında çalıştığı için farklı geliştirme ortamlarında uyumluluk sağlar. Bu, hem frontend hem de backend geliştiricileri için avantaj sunar.
- Ancak
pgmock'un gerçek PostgreSQL sunucusunun tüm özelliklerini tamamen emüle edip edemeyeceği, özellikle performans ve eklenti özellikleri açısından soru işareti bırakıyor. Gerçek veritabanı ortamıyla arasındaki farklar test sonuçlarını etkileyebilir.
- Benzer işlevler sunan diğer projeler arasında Testcontainers ve H2 Database bulunur; bunlar sırasıyla Docker konteynerleri kullanan entegrasyon testleri ve Java uygulamaları için bellek içi veritabanı sağlar.
1 yorum
Hacker News görüşleri
pgmock tanıtımı
pglite'tan farklı olarakpgmock, içinde özgün Postgres bulunan bir x86 emülatörü çalıştırır.pgliteise bir Postgres fork'unu doğrudan WASM'a derler; bu yüzden daha hızlı ve hafiftir, ancak yalnızca tek kullanıcı modunu ve bazı eklentileri destekler, bu nedenle normal Postgres istemcileriyle bağlanılamaz.Postgres'i RAM diskte çalıştırma hakkında soru
Gerçek sunucu yerine bellek içi sunucu kullanma deneyimi paylaşımı
Projenin fikri mülkiyet hakları hakkında soru
Geliştirme ortamını kopyalama tavsiyesi
pgmock'un geliştirilme nedeni ve CI entegrasyonu hakkında soru
pgmockentegrasyonu öncesi ve sonrası CI yapılandırması ile E2E test akışının açıklanması isteniyor.H2 veritabanıyla karşılaştırma sorusu
pgmockkarşılaştırılıyor.pgmem kullanım deneyimi paylaşımı
pgmemkullanma deneyimi paylaşılıyor.ORM desteği hakkında soru
Prisma Client ile kullanım imkânı hakkında soru