PostgreSQL:如何为单元测试创​​建临时用户和数据库?

PostgreSQL: How can I create a temporary user and database for my unit tests?

我正在开发一个 C++ Web 应用程序,我在 Ubuntu 16.04 上将 PostgreSQL 与 libpqxx 一起使用。我遇到的问题是我需要一种可移植的(在 Linux 系统上)的方式来 运行 我的单元测试。

我现在拥有的是一个控制数据库调用的 class。我想测试这个 class 在我的单元测试下是如何工作的。为此,每次我 运行 单元测试时,我想:

  1. 创建临时用户
  2. 创建一个虚拟数据库
  3. 运行 我的测试
  4. 删除数据库
  5. 删除用户

现在可以通过 Google 测试执行这些步骤。我可以创建一个可以重复执行所有操作的夹具。但是...

如何在一次调用中创建一个带密码的用户(无需提示输入密码),以便我可以随时随地创建该用户并 运行 我的测试?

manual 似乎没有提供在参数中提供密码的方法。我希望做这样的事情:

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

其中 system() 运行 是一个终端命令。然后我可以使用该用户名和密码连接到数据库服务器以进行单元测试。

我的另一个失败尝试是通过终端传递 sql query that would create the user

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

当我这样做时,出现错误:

psql: FATAL:  database "user" does not exist

其中 user 是我的 unix 用户名。

请记住,我无法使用 libpqxx 连接到服务器,因为我还没有凭据(作为临时用户)。正确的?如有不妥请指正

有没有什么方法可以实现我在这里的计划并使单元测试运行无需用户干预即可?

system("psql -c \"CREATE ROLE joe PASSWORD 'aabbccdd';\"") 调用的问题是它没有指定要连接的数据库,然后默认尝试尝试与登录用户同名的数据库。尝试添加 -d postgres 看看它是否有效。

请注意,这只会创建用户,不会创建任何数据库或授予任何权限。