我有一个使用Postgresql的python项目。我想使用类似django的单元测试,在该单元测试中创建和销毁数据库。但是,我不想使用sqlalchemy。 我尝试了以下方法:
pg = psycopg2.connect(
"host={} dbname={} user={} password={}".format(
POSTGRES_HOST, 'postgres', POSTGRES_USER, POSTGRES_PASSWORD))
pg.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cur = pg.cursor()
def reset_db():
cur.execute('DROP DATABASE IF EXISTS {} '.format(POSTGRES_DB))
cur.execute('CREATE DATABASE {}'.format(POSTGRES_DB))
newconn = psycopg2.connect(
"host={} dbname={} user={} password={}".format(
POSTGRES_HOST, POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD))
newcur = newconn.cursor()
# SCHEMAS is an imported dict containing schema creation instructions
for schema in SCHEMAS:
newcur.execute(SCHEMAS[schema])
return newcur
class Test(TestCase):
def setUp(self):
os.environ['testing'] = 'true'
self.cur = reset_db()
然后,setUp方法设置一个环境变量,该变量通知我的数据库层使用测试数据库。
这似乎很好。唯一的问题是reset_db()大约需要0.8秒的时间,
有没有更好的方法或方法来优化我的方法?
答案 0 :(得分:1)
在每个测试用例之后重新创建数据库是非常昂贵的操作。
也许在开始时一次创建数据库,然后仅在每个测试用例之后从所有表中删除所有数据,这可能是解决方案之一吗?
答案 1 :(得分:1)
您可以尝试Django所做的工作-在每次测试之前启动事务,然后在测试之后回滚,撤消测试期间所做的所有数据库更改。