纯Python中的类似Django的单元测试数据库

时间:2018-06-28 09:19:14

标签: python django postgresql unit-testing

我有一个使用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秒的时间,

有没有更好的方法或方法来优化我的方法?

2 个答案:

答案 0 :(得分:1)

在每个测试用例之后重新创建数据库是非常昂贵的操作。

也许在开始时一次创建数据库,然后仅在每个测试用例之后从所有表中删除所有数据,这可能是解决方案之一吗?

答案 1 :(得分:1)

您可以尝试Django所做的工作-在每次测试之前启动事务,然后在测试之后回滚,撤消测试期间所做的所有数据库更改。