测试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