(Przenoszę moją odpowiedź z używania PostgreSQL w pamięci i generalizuję ją):
Nie możesz uruchomić Pg w trakcie, w pamięci
Nie mogę dowiedzieć się, jak uruchomić bazę danych Postgres w pamięci do testów. Czy to możliwe?
Nie, to niemożliwe. PostgreSQL jest zaimplementowany w C i skompilowany do kodu platformy. W przeciwieństwie do H2 lub Derby nie można po prostu załadować jar
i uruchomić go jako jednorazowej bazy danych w pamięci.
W przeciwieństwie do SQLite, który jest również napisany w C i skompilowany do kodu platformy, PostgreSQL również nie może być ładowany w procesie. Wymaga wielu procesów (po jednym na połączenie), ponieważ jest to architektura wieloprocesowa, a nie wielowątkowa. Wymóg wieloprocesorowości oznacza, że musisz uruchomić postmastera jako samodzielny proces.
Zamiast tego: skonfiguruj wstępnie połączenie
Proponuję po prostu napisać testy, aby oczekiwać, że określona nazwa hosta / nazwa użytkownika / hasło zadziała, a test zaprzęgnie CREATE DATABASE
do jednorazowej bazy danych, a następnie DROP DATABASE
pod koniec uruchomienia. Uzyskaj szczegóły połączenia z bazą danych z pliku właściwości, właściwości celu kompilacji, zmiennej środowiskowej itp.
Bezpiecznie jest używać istniejącej instancji PostgreSQL, w której masz już bazy danych, na których Ci zależy, o ile użytkownik, którego dostarczasz do testów jednostkowych, nie jest superużytkownikiem, tylko użytkownikiem z CREATEDB
uprawnieniami. W najgorszym przypadku wystąpią problemy z wydajnością w innych bazach danych. Z tego powodu wolę uruchomić całkowicie izolowaną instalację PostgreSQL do testów.
Zamiast tego: uruchom jednorazową instancję PostgreSQL do testowania
Alternatywnie, jeśli naprawdę chcesz, możesz poprosić swoją wiązkę testową, aby zlokalizowała pliki binarne initdb
i postgres
, uruchom ją, initdb
aby utworzyć bazę danych, zmodyfikuj pg_hba.conf
ją trust
, uruchom postgres
ją na losowym porcie, utwórz użytkownika, utwórz bazę danych i uruchom testy . Możesz nawet spakować pliki binarne PostgreSQL dla wielu architektur w jednym pliku jar i rozpakować te dla bieżącej architektury do katalogu tymczasowego przed uruchomieniem testów.
Osobiście uważam, że jest to poważny ból, którego należy unikać; o wiele łatwiej jest po prostu skonfigurować testową bazę danych. Jednak stało się to trochę łatwiejsze wraz z pojawieniem się include_dir
wsparcia w postgresql.conf
; teraz możesz po prostu dodać jedną linię, a następnie napisać wygenerowany plik konfiguracyjny dla całej reszty.
Szybsze testowanie z PostgreSQL
Aby uzyskać więcej informacji o tym, jak bezpiecznie poprawić wydajność PostgreSQL do celów testowych, zobacz szczegółową odpowiedź, którą napisałem wcześniej na ten temat: Optymalizuj PostgreSQL do szybkiego testowania
Dialekt H2 w PostgreSQL nie jest prawdziwym zamiennikiem
Niektórzy zamiast tego używają bazy danych H2 w trybie dialektu PostgreSQL do uruchamiania testów. Myślę, że to prawie tak złe, jak ludzie z Railsów używający SQLite do testowania i PostgreSQL do wdrożeń produkcyjnych.
H2 obsługuje niektóre rozszerzenia PostgreSQL i emuluje dialekt PostgreSQL. Jednak to tylko to - emulacja. Znajdziesz obszary, w których H2 akceptuje zapytanie, a PostgreSQL nie, gdzie zachowanie jest inne itp . Znajdziesz również wiele miejsc, w których PostgreSQL obsługuje robienie czegoś, czego H2 po prostu nie może - na przykład funkcji okna w momencie pisania.
Jeśli rozumiesz ograniczenia tego podejścia, a dostęp do bazy danych jest prosty, H2 może być w porządku. Ale w takim przypadku prawdopodobnie jesteś lepszym kandydatem na ORM, który abstrahuje bazę danych, ponieważ i tak nie używasz jej interesujących funkcji - iw takim przypadku nie musisz już tak bardzo dbać o zgodność bazy danych.
Przestrzenie tabel nie są odpowiedzią!
Czy nie używać tabel do tworzenia bazy danych „w pamięci”. Nie tylko jest to niepotrzebne, ponieważ i tak nie poprawi wydajności w znaczący sposób, ale jest to również świetny sposób na zakłócenie dostępu do każdego innego, na którym może Ci zależeć w tej samej instalacji PostgreSQL. Dokumentacja 9.4 zawiera teraz następujące ostrzeżenie :
OSTRZEŻENIE
Mimo że obszary tabel znajdują się poza głównym katalogiem danych PostgreSQL, stanowią integralną część klastra bazy danych i nie mogą być traktowane jako autonomiczny zbiór plików danych. Są one zależne od metadanych zawartych w głównym katalogu danych i dlatego nie można ich dołączyć do innego klastra bazy danych ani tworzyć ich kopii zapasowych indywidualnie. Podobnie w przypadku utraty obszaru tabel (usunięcie pliku, awaria dysku itp.) Klaster bazy danych może stać się nieczytelny lub nie można go uruchomić. Umieszczenie obszaru tabel w tymczasowym systemie plików, takim jak ramdysk, zagraża niezawodności całego klastra.
ponieważ zauważyłem, że zbyt wielu ludzi to robi i ma kłopoty.
(Jeśli to zrobiłeś, możesz mkdir
brakować katalog obszaru tabel, aby PostgreSQL zaczął się od nowa, a następnie DROP
brakujące bazy danych, tabele itp. Lepiej po prostu tego nie robić.)