使用PostgreSQL在SQLAlchemy测试中回滚数据库事务

3

我正在构建一个Pyramid Web应用程序,它基于SQLAlchemy并完全依赖PostgreSQL作为其数据库后端。

有什么方法可以使单元测试结构如下:

  • 为了加速测试,在测试套件的teardown()或其他清理钩子中回滚数据库事务

  • 可以使用其他技巧来加速测试,例如如果SQLAlchemy和PostgreSQL有与SQLite的:in:memory:数据库相对应的内容

  • 如果某些特定功能超出了标准库unittest框架,可以选择自定义测试运行器,例如py.test,以更轻松地编写测试用例。


相关链接:https://dev59.com/VF0b5IYBdhLWcg3wLOrP - Mikko Ohtamaa
相关链接:https://gist.github.com/inklesspen/4504383 - Mikko Ohtamaa
相关链接:https://dev59.com/xmsz5IYBdhLWcg3weHuU - Craig Ringer
相关链接:https://dev59.com/tWox5IYBdhLWcg3wIQ_3 - Craig Ringer
1
一个好的技巧是创建一个“模板”数据库,其中包含您测试所需的所有表和数据,然后执行“create database newdb template testtemplate;”并使用testtemplate数据库。当您完成测试后,只需删除它即可。 - Scott Marlowe
2个回答

2

由于这个问题与您的其他问题有些相似,我将在此处复制我的答案的相关部分:

所有的测试用例类都应该从一个基类中派生,并定义一个通用的tearDown方法:

class BaseTest(unittest.TestCase):

    def setUp(self):
        # This makes things nicer if the previous test fails
        # - without this all subsequent tests fail
        self.tearDown()

        self.config = testing.setUp()

    def tearDown(self):
        testing.tearDown()
        session.expunge_all()
        session.rollback()

1

对于测试,您可以在RAM磁盘上初始化PostgreSQL数据目录(您可以在现代Linux发行版中将/dev/shm/下创建一个目录,它被挂载为tmpfs)。然后您可以在非标准端口上运行Postgres。

PGTEMP=`mktemp -d /dev/shm/pgtemp.XXXXXX`
initdb -D "$PGTEMP"
postgres -D "$PGTEMP" -k "$PGTEMP" -p 54321

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接