【问题标题】:Django testing wastes too much time on test database creatingDjango 测试在测试数据库创建上浪费了太多时间
【发布时间】:2015-08-06 11:19:18
【问题描述】:

我们正在尝试对一个旧的大型项目进行测试,该项目在数据库中有超过 500 个表,并且在数据库创建(我的 RMBP 上超过 1 小时)和数据库迁移上浪费了太多时间。

我们使用的是PostgreSQL作为数据库,由于一些服务相关的GIS需要它,所以很难用SQLite来替代它。

我可以做些什么来减少考试准备时间?

【问题讨论】:

  • 您可以使用factory_boy 之类的东西来创建用于测试的对象并完全跳过数据库吗?
  • @IanAuld factory_boy 可能是一个很好的替换工具,但就我而言,最大的问题是创建数据库。谢谢你的建议。

标签: python django testing django-testing


【解决方案1】:

在某个时候,我最终创建了一个事务管理中间件,该中间件将拦截事务调用,以便所有测试都在事务中运行,然后最后回滚事务。

另一种选择是在每次测试开始时加载二进制数据库转储,然后在测试之间删除并重新创建数据库。创建好数据库后,使用xtrabackup 创建它的转储。然后,在 per-test setup 函数中,删除并创建数据库,然后使用 xtrabackup 加载转储。由于它是二进制转储文件,因此加载速度相当快。

【讨论】:

  • 如何使用数据库转储来代替?我没有找到任何关于它的信息。
【解决方案2】:

您可以使用django-nose 并像这样重用数据库:

REUSE_DB=1 ./manage.py test

请注意您的测试不要在数据库中留下任何垃圾。请查看documentation 了解更多信息。

【讨论】:

  • 我不确定,我在 settings.py 中添加了这一行,但仍然会通过参数-v 2 输出大量 SQL。另一方面,它运行得更快,所以我认为数据库并没有真正创建新数据库。
  • 顺便说一句,我认为REUSE_DB=1 ./manage.py test 意味着将REUSE_DB=1 添加到settings.py,然后在shell 中运行./manage.py test,对吗?
  • REUSE_DB 是环境变量而不是设置。你必须在你的shell中设置它。见source
  • 它有效。但是在我这样设置之后,当鼻子尝试重置数据库状态时,会出现 DatabaseError -- 'relation "django_site" 不存在'。最后我发现了异常但什么也没做。
猜你喜欢
  • 2020-11-17
  • 2012-04-20
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 2016-07-29
  • 2012-05-20
相关资源
最近更新 更多