(Cevabımı Bellek içi PostgreSQL kullanmaktan alıp genelleştirmek):
İşlem içi, bellek içi Pg'yi çalıştıramazsınız
Bellek içi Postgres veritabanını test için nasıl çalıştıracağımı çözemiyorum. Mümkün mü?
Hayır, bu mümkün değil. PostgreSQL, C'de uygulanır ve platform koduna derlenir. H2 veya Derby'den farklı jar
olarak, bellek içi DB olarak yükleyip ateşleyemezsiniz.
C dilinde yazılan ve platform koduna derlenen SQLite'ın aksine, PostgreSQL de süreç içinde yüklenemez. Birden çok işlem gerektirir (bağlantı başına bir) çünkü çok iş parçacıklı bir mimari değil, çok işlemlidir. Çoklu işlem gereksinimi , postmaster'ı bağımsız bir işlem olarak başlatmanız gerektiği anlamına gelir .
Bunun yerine: bir bağlantıyı önceden yapılandırın
Testlerinizi yalnızca belirli bir ana bilgisayar adı / kullanıcı adı / parolanın çalışmasını beklemek için yazmanızı ve testin CREATE DATABASE
daha sonra DROP DATABASE
çalıştırmanın sonunda kullanılıp atılan bir veritabanına sahip olmasını öneririm . Bir özellikler dosyasından veritabanı bağlantı ayrıntılarını alın, hedef özellikleri oluşturun, ortam değişkeni vb.
Birim testlerinize sağladığınız kullanıcı bir süper kullanıcı olmadığı , yalnızca CREATEDB
haklara sahip bir kullanıcı olduğu sürece, zaten ilgilendiğiniz veritabanlarına sahip olduğunuz mevcut bir PostgreSQL örneğini kullanmak güvenlidir . En kötüsü, diğer veritabanlarında performans sorunları yaratırsınız. Bu nedenle test etmek için tamamen izole edilmiş bir PostgreSQL kurulumu çalıştırmayı tercih ediyorum.
Bunun yerine: Test için kullanabileceğiniz bir PostgreSQL örneği başlatın
Eğer eğer Alternatif olarak, gerçekten sen olabilir düşkün olması, test koşum bulmak initdb
ve postgres
çalıştırmak ikilileri, initdb
değiştirebilir, bir veritabanı oluşturmak için pg_hba.conf
için trust
çalıştırmak, postgres
bir DB oluşturma, bir kullanıcı oluşturmak, rastgele bağlantı noktasında bunu başlatmak için, ve testler . Hatta birden fazla mimari için PostgreSQL ikili dosyalarını bir kavanozda toplayabilir ve mevcut mimari için olanları testleri çalıştırmadan önce geçici bir dizine açabilirsiniz.
Şahsen bunun kaçınılması gereken büyük bir acı olduğunu düşünüyorum; yapılandırılmış bir test DB'si olması çok daha kolay. Ancak, include_dir
desteğin gelişiyle biraz daha kolay hale geldi postgresql.conf
; şimdi sadece bir satır ekleyebilir, ardından geri kalan her şey için oluşturulan bir yapılandırma dosyası yazabilirsiniz.
PostgreSQL ile daha hızlı test
Test amacıyla PostgreSQL'in performansını güvenli bir şekilde nasıl geliştirebileceğiniz hakkında daha fazla bilgi için, bu konu hakkında daha önce yazdığım ayrıntılı bir cevaba bakın: Hızlı test için PostgreSQL'i optimize edin
H2'nin PostgreSQL lehçesi gerçek bir ikame değildir
Bazı kişiler bunun yerine testleri çalıştırmak için PostgreSQL lehçe modunda H2 veritabanını kullanır. Sanırım bu, test için SQLite ve üretim dağıtımı için PostgreSQL kullanan Rails kadar kötü.
H2, bazı PostgreSQL uzantılarını destekler ve PostgreSQL lehçesini taklit eder. Ancak, sadece bu - bir öykünme. H2'nin bir sorguyu kabul ettiği ancak PostgreSQL'in kabul etmediği, davranışın farklı olduğu vb . Alanlar bulacaksınız . Ayrıca, PostgreSQL'in H2'nin yapamayacağı bir şeyi yapmayı desteklediği pek çok yer bulacaksınız - yazma sırasında pencere işlevlerinden hoşlanmayacaksınız.
Bu yaklaşımın sınırlamalarını anlıyorsanız ve veritabanı erişiminiz basitse, H2 tamam olabilir. Ancak bu durumda, veritabanını özetleyen bir ORM için muhtemelen daha iyi bir aday olursunuz çünkü yine de ilginç özelliklerini kullanmıyorsunuz - ve bu durumda, veritabanı uyumluluğunu artık önemsemeniz gerekmiyor.
Tablo alanları çözüm değil!
Do not bir "bellek" veritabanı oluşturmak için bir tablo kullanın. Sadece performansa önemli ölçüde yardımcı olmayacağı için gereksiz olmakla kalmaz, aynı zamanda aynı PostgreSQL kurulumunda ilginizi çekebilecek diğer herhangi birine erişimi engellemenin harika bir yoludur. 9.4 belgeleri artık aşağıdaki uyarıyı içermektedir :
UYARI
Ana PostgreSQL veri dizininin dışında yer almalarına rağmen, tablo alanları veritabanı kümesinin ayrılmaz bir parçasıdır ve veri dosyalarının otonom bir koleksiyonu olarak ele alınamaz. Ana veri dizininde bulunan meta verilere bağımlıdırlar ve bu nedenle farklı bir veritabanı kümesine eklenemez veya ayrı ayrı yedeklenemezler. Benzer şekilde, bir tablo alanını kaybederseniz (dosya silme, disk arızası, vb.), Veritabanı kümesi okunamaz hale gelebilir veya başlatılamayabilir. Bir ramdisk gibi geçici bir dosya sistemine bir tablo alanı yerleştirmek, tüm kümenin güvenilirliğini riske atar.
çünkü çok fazla insanın bunu yaptığını ve sorunla karşılaştığını fark ettim.
(Bunu yaptıysanız mkdir
, PostgreSQL'i yeniden başlatmak için eksik tablo alanı dizinini, ardından DROP
eksik veritabanları, tabloları vb. Yapabilirsiniz . Bunu yapmamak daha iyidir.)