4 puan yazan GN⁺ 2024-04-08 | 1 yorum | WhatsApp'ta paylaş

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

 
GN⁺ 2024-04-08
Hacker News görüşleri
  • pgmock tanıtımı

    • Bir geliştirici, birkaç ay boyunca Postgres'in bellek içi bir sürümünü geliştirdi.
    • Bu sürüm, mevcut veritabanıyla işlevsel olarak eşdeğer.
    • Harici süreçler veya proxy'ler gerektirmez ve WASM çalıştırabilen platformlarda (Node.js, tarayıcı vb.) çalışır.
    • Yeni bir veritabanı ve sahte veriler oluşturmak, JavaScript nesnesi yaratmak kadar basittir.
    • pglite'tan farklı olarak pgmock, içinde özgün Postgres bulunan bir x86 emülatörü çalıştırır. pglite ise 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.
    • Teorik olarak herhangi bir Docker imajı, WebAssembly platformlarında çalışacak şekilde uyarlanabilir.
  • Postgres'i RAM diskte çalıştırma hakkında soru

    • Bunun Postgres'i RAM diskte çalıştırmakla karşılaştırıldığında ne avantaj sağladığının, özellikle de tarayıcı/Node ortamında çalışabilmesi ve testler tarafından oluşturulup güncellenip yok edilebilmesi açısından açıklanması isteniyor.
  • Gerçek sunucu yerine bellek içi sunucu kullanma deneyimi paylaşımı

    • Geçmişte testlerde çeşitli (özel yapım) sahte bellek içi sunucular kullanılmış, ancak artık Testcontainers ile gerçek servisler çalıştırılıyor.
  • Projenin fikri mülkiyet hakları hakkında soru

    • Başlıktaki "işte yaptım" ifadesinin, fikri mülkiyetin işverene ait olduğu anlamına gelip gelmediği ve iş yeri kaynakları kullanıldıysa bunun açık kaynak olarak yayımlanmasının izinli olup olmadığı sorgulanıyor.
  • Geliştirme ortamını kopyalama tavsiyesi

    • Üretim verisini dump edip hassas verileri temizleyerek ve log tabloları gibi gereksiz tabloları azaltarak bir geliştirme kopyası oluşturulması öneriliyor. Bunun geliştirme, QA, E2E vb. ortamlara çoğaltılmasıyla E2E testleri için gerekli eklentiler, trigger'lar, fonksiyonlar, view'lar, indeksler ve veriler sağlanabilir.
  • pgmock'un geliştirilme nedeni ve CI entegrasyonu hakkında soru

    • Bu projenin neden geliştirildiği ve Docker container içinde Postgres çalıştırmanın fazla yavaş olup olmadığı soruluyor.
    • pgmock entegrasyonu öncesi ve sonrası CI yapılandırması ile E2E test akışının açıklanması isteniyor.
    • Bu çözüme geçişin zor olup olmadığı da soruluyor.
  • H2 veritabanıyla karşılaştırma sorusu

    • Postgres uyumluluk modundaki H2 veritabanı ile pgmock karşılaştırılıyor.
  • pgmem kullanım deneyimi paylaşımı

    • Benzer amaçlarla son birkaç yıldır pgmem kullanma deneyimi paylaşılıyor.
  • ORM desteği hakkında soru

    • Sequelize, Prisma, Drizzle gibi ORM'lerin testlerde kullanılıp kullanılamayacağı soruluyor.
  • Prisma Client ile kullanım imkânı hakkında soru

    • Prisma Client ile birlikte kullanılmasının bir yolu olup olmadığı soruluyor.