测试postgres db python


问题内容

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

我想确保我确实将带有所有参数的对象保存到数据库中,并且当我执行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。


问题答案:

最好的解决方案是使用testing.postgresql

模块。这将在用户空间中启动一个数据库,然后在运行结束时再次将其删除。您可以根据需要的持久性setUp,将以下内容放入unittest套件中-setUpClass或中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()

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

name = "testdb"
port = "5678"
path = "/tmp/my_test_db"
testing.postgresql.Postgresql(name=name, port=port, base_dir=path)

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

with testing.postgresql.Postgresql(port=7654) as psql:
    # do something here