PostgreSQL: Как я могу создать временного пользователя и базу данных для своих модульных тестов? - PullRequest
0 голосов
/ 18 мая 2018

Я занимаюсь разработкой веб-приложения на C ++ и использую PostgreSQL с libpqxx в Ubuntu 16.04. Проблема, с которой я столкнулся, заключается в том, что мне нужен переносимый (через системы Linux) способ запуска моих модульных тестов.

Теперь у меня есть класс, который управляет вызовами базы данных. Я хотел бы проверить, как этот класс действует в моих модульных тестах. Для этого, каждый раз, когда я запускаю юнит-тест, я хотел бы:

  1. Создать временного пользователя
  2. Создание фиктивной БД
  3. запустить мои тесты на нем
  4. удалить БД
  5. удалить пользователя

Теперь с Google тестами все в порядке. Я могу создать приспособление, которое будет воспроизводить их все. НО ...

Как я могу создать пользователя с паролем за один вызов (без запроса пароля), чтобы я мог создать этого пользователя на ходу и запускать свои тесты?

Руководство , по-видимому, не предоставляет способ указать пароль в аргументе. Я надеялся сделать что-то вроде этого:

system("createuser " + username + " -password abcdefg");

, где system() запускает команду терминала. Затем я могу подключиться к серверу БД с этим именем пользователя и паролем для проведения модульных тестов.

Другой неудачной попыткой для меня было передать sql-запрос, который бы создал пользователя через терминал:

system("psql -c \"CREATE ROLE joe PASSWORD 'aabbccdd';\"")

Когда я это делаю, я получаю ошибку:

psql: FATAL:  database "user" does not exist

где user - мое имя пользователя в Unix.

Помните, что я не могу подключиться к серверу с libpqxx, потому что у меня еще нет учетных данных (как временного пользователя). Правильно? Пожалуйста, поправьте меня, если я ошибаюсь.

Есть ли способ сделать то, что я планирую здесь, и запустить модульные тесты без вмешательства пользователя?

1 Ответ

0 голосов
/ 18 мая 2018

Проблема с вызовом system("psql -c \"CREATE ROLE joe PASSWORD 'aabbccdd';\"") состоит в том, что он не указывает базу данных для подключения, которая затем по умолчанию будет пытаться использовать базу данных с тем же именем, что и пользователь, вошедший в систему. Попробуйте добавить -d postgres и посмотрите, если этоработает.

Обратите внимание, что это только создает пользователя, он не создает базы данных и не дает никаких привилегий.

...