(Переміщення моєї відповіді з використання PostgreSQL в пам'яті та узагальнення):
Ви не можете запустити Pg в процесі, в пам'яті
Я не можу зрозуміти, як запустити в тесті пам'ять Postgres бази даних для тестування. Це можливо?
Ні, це неможливо. PostgreSQL реалізується в C і компілюється до коду платформи. На відміну від Н2 або Дербі, ви не можете просто завантажити jar
та запустити його як БД в пам'яті.
На відміну від SQLite, який також написаний на C та скомпільований до коду платформи, PostgreSQL також не може завантажуватися в процесі. Це вимагає декількох процесів (по одному на з'єднання), оскільки це багатопроцесорна, а не багатопотокова архітектура. Вимога багатопроцесорної обробки означає, що ви повинні запустити постмайстра як самостійний процес.
Замість цього: попередньо налаштуйте з'єднання
Я пропоную просто написати свої тести, щоб очікувати, що конкретне ім’я хоста / ім’я користувача / пароль запрацює, і тест використає CREATE DATABASE
базу даних, що викидається, а потім DROP DATABASE
наприкінці запуску. Отримайте деталі підключення до бази даних з файлу властивостей, побудуйте цільові властивості, змінну середовища тощо.
Безпечно використовувати наявний екземпляр PostgreSQL, у якому вже є ваші бази даних, про які ви дбаєте, до тих пір, поки користувач, який ви постачаєте для ваших тестових підрозділів, не є суперпользователем, а лише користувачем з CREATEDB
правами. У гіршому випадку ви створите проблеми з продуктивністю в інших базах даних. Я вважаю за краще запустити повністю ізольовану установку PostgreSQL для тестування з цієї причини.
Замість цього: Запустіть тестовий екземпляр PostgreSQL
З іншого боку , якщо ви дійсно гострими ви могли б мати свій тест Джгут визначити місцезнаходження initdb
і postgres
бінарних файлів, запускати , initdb
щоб створити базу даних, змінити , pg_hba.conf
щоб trust
, запустити , postgres
щоб запустити його на довільний порт, створити користувач, створити базу даних, і запустити тести . Ви навіть можете зв’язати бінарні файли PostgreSQL для декількох архітектур в банку і розпакувати ті, що знаходяться в поточній архітектурі, до тимчасового каталогу перед запуском тестів.
Особисто я вважаю, що це головний біль, якого слід уникати; простіше просто налаштувати тестовий БД. Однак з приходом include_dir
підтримки у ньому стає трохи легше postgresql.conf
; тепер ви можете просто додати один рядок, а потім написати згенерований конфігураційний файл для всіх інших.
Швидше тестування за допомогою PostgreSQL
Для отримання додаткової інформації про те, як безпечно поліпшити продуктивність PostgreSQL для тестування, див. Детальну відповідь, яку я писав на цю тему раніше: Оптимізуйте PostgreSQL для швидкого тестування
PostgreSQL діалект H2 не є справжньою заміною
Деякі люди замість цього використовують базу даних H2 у діалектному режимі PostgreSQL для запуску тестів. Я думаю, це майже так само погано, як люди з Rails, які використовують SQLite для тестування, і PostgreSQL для розгортання виробництва.
H2 підтримує деякі розширення PostgreSQL та емулює діалект PostgreSQL. Однак саме це - емуляція. Ви знайдете області, де H2 приймає запит, але PostgreSQL не робить, де поведінка відрізняється тощо . Ви також знайдете безліч місць, де PostgreSQL підтримує робити те, що H2 просто не може - як функції вікон, під час написання.
Якщо ви розумієте обмеження такого підходу і доступ до вашої бази даних простий, H2 може бути нормальним. Але в цьому випадку ви, мабуть, кращий кандидат для ORM, який абстрагує базу даних, оскільки ви все одно не використовуєте її цікавих функцій - і в цьому випадку вам більше не потрібно піклуватися про сумісність баз даних.
Простори таблиць - це не відповідь!
Ви НЕ використовувати табличний для створення бази даних «в пам'яті». Це не тільки непотрібно, оскільки це не допоможе значно продуктивніше, але це також чудовий спосіб порушити доступ до будь-яких інших, які можуть вас хвилювати в тій же установці PostgreSQL. Документація 9.4 тепер містить таке попередження :
УВАГА
Навіть незважаючи на те, що розташований поза основним каталогом даних PostgreSQL, таблиці просторів є невід'ємною частиною кластеру баз даних і не можуть розглядатися як автономна колекція файлів даних. Вони залежать від метаданих, що містяться в головному каталозі даних, тому не можуть бути приєднані до іншого кластеру баз даних або резервні копії окремо. Аналогічно, якщо ви втратите простір таблиць (видалення файлів, збій диска тощо), кластер бази даних може стати нечитабельним або не може запуститися. Розміщення простору таблиць у тимчасовій файловій системі як ramdisk загрожує надійності всього кластеру.
тому що я помітив, що надто багато людей це робило і стикався з неприємностями.
(Якщо ви це зробили, ви можете mkdir
скористатися каталогом відсутнього простору таблиць, щоб змусити PostgreSQL запуститися заново, потім DROP
відсутні бази даних, таблиці тощо. Краще просто не робити цього.)