测试postgres db python

dga*_*gan 6 python postgresql python-unittest

我不知道如何测试我的存储库。

我想确保我确实将带有所有参数的对象保存到数据库中,并且当我执行SQL语句时,确实收到了应有的信息。

但是,我不能"CREATE TABLE test_table在单元setUp测试用例的方法中放入“,因为它将被多次创建(同一测试用例的测试是并行运行的)。因此,只要我在同一类中创建两个需要在同一方法上工作的方法表格,将无法使用(表格名称冲突)

相同,我不能放"CREATE TABLE test_table" setUpModule,因为现在表创建一次,但是由于测试是并行运行的,因此没有什么可以阻止将同一对象多次插入到我的表中,这打破了某些字段的唯一性约束。

同样,我不能"CREATE SCHEMA some_random_schema_name"在所有方法中都使用,因为我需要为给定数据库全局全局设置“ SET search_path TO ...”,因此并行运行的每个方法都将受到影响。

我看到的唯一方法是"CREATE DATABASE"使用唯一的名称为每个测试创建to ,并建立与每个数据库的单独连接。.这看起来非常浪费。有没有更好的办法?

另外,由于需要测试PostgreSQL,因此无法在内存中使用SQLite。

mat*_*tch 7

最好的解决方案是使用testing.postgresql 模块。这会在用户空间中启动一个数据库,然后在运行结束时再次将其删除。你可以把一个单元测试套件下面的-无论是在setUpsetUpClass或者setUpModule-这取决于持久性你想要什么:

import testing.postgresql

def setUp(self):
    self.postgresql = testing.postgresql.Postgresql(port=7654)
    # Get the url to connect to with psycopg2 or equivalent
    print(self.postgresql.url())

def tearDown(self):
    self.postgresql.stop()
Run Code Online (Sandbox Code Playgroud)

如果您希望数据库在测试之间/之后保持不变,则可以使用base_dir设置目录的选项运行该数据库-这样可以防止数据库在关机后被删除:

name = "testdb"
port = "5678"
path = "/tmp/my_test_db"
testing.postgresql.Postgresql(name=name, port=port, base_dir=path)
Run Code Online (Sandbox Code Playgroud)

在测试之外,它还可以用作上下文管理器,在其中,当退出with块时,它将自动清理和关闭:

with testing.postgresql.Postgresql(port=7654) as psql:
    # do something here
Run Code Online (Sandbox Code Playgroud)

  • 这个问题是关于用 python 测试 postgres 的,我的答案是关于使用 python 设置临时 psql 服务器。您的问题是关于使用 JDBC 连接到 postgres,这实际上并不相关。我建议开始一个新问题,而不是在这里添加评论。 (3认同)
  • testing.postgres 是一个启动临时 postgres 服务器的工具。你需要安装 postgres,但不要运行,因为 testing.postgres 会做这部分。 (3认同)
  • 我仍然每天在很多项目中使用它 - 但还没有查看 github 上的问题,看看它是否安静是因为它“完整”还是因为它停滞了。 (2认同)