繁体   English   中英

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

[英]Django-like unit testing database in plain python

我有一个使用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秒,这太多了。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM