【问题标题】:Loading SQL dump before running Django tests在运行 Django 测试之前加载 SQL 转储
【发布时间】:2010-12-31 02:00:37
【问题描述】:

我有一个相当复杂的 Django 项目,因此很难/不可能使用固定装置来加载数据。

我想做的是在测试运行程序创建所有表之后和实际测试开始运行之前从生产数据库服务器加载数据库转储。

我在 MyTestCase.setUp() 中尝试了各种“魔法”,但都没有成功。

欢迎提出任何建议。谢谢。

【问题讨论】:

  • 如果我没记错的话,加载 sql 会更快,因为它没有固定装置的开销。我正在寻找解决同样的问题。我有一个大型数据库要加载进行测试,我想保持快速加载。
  • 我广泛使用泛型关系,这在使用固定装置时是个问题。看来这个问题刚刚在 1.2 的工作中得到解决,请参阅 docs.djangoproject.com/en/dev/topics/serialization/…
  • 很遗憾,您只能对 cme​​ts 投赞成票,而不是反对票。第一条评论很臭。
  • @S.Lott - 这是一个例子。我正在尝试将测试添加到从未考虑过固定装置的遗留项目中。加载夹具会触发许多不需要的行为。我最终会解决这个问题——但我需要在开始大重构之前进行测试。我需要数据来运行测试。

标签: python django django-testing


【解决方案1】:

Django 支持在执行 syncdb、reset 或启动测试运行程序时加载 SQL 文件——这正是您所描述的:

http://docs.djangoproject.com/en/dev/howto/initial-data/#providing-initial-sql-data

你需要在你的app目录下创建一个“sql”目录,然后在那个目录下放一个名为“mymodel.sql”的文件(其中“MyModel”是对应的模型名)。

myproject/
   |--myapp/
       |--sql/
           |--mymodel.sql

您可以使用转储工具为您的数据库创建此 SQL。

  • SQLite [1]:回显“.dump”| sqlite3 yourdbname.sqlite > myapp/sql/mymodel.sql
  • MySQL [2]:mysqldump yourdbname > myapp/sql/mymodel.sql
  • PostgreSQL [3]:pg_dump yourdbname > myapp/sql/mymodel.sql

转储后,您需要编辑文件以删除除适当的 INSERT 语句或其他复杂内容之外的所有内容。特别是,您必须删除事务处理、索引创建和表创建 SQL,以避免加载重复的创建语句时出错。

我使用这种方法来加载非常非常大的固定装置——处理 json 需要很长时间,但是直接 sql 导入非常快速。

请注意,除了为测试运行程序加载数据之外,此方法还将为任何调用 synchdb、reset 等加载 sql——因此您将无法为不同的测试用例提供不同的数据,如果您不希望文件重新加载到生产服务器上,则必须在重置之前删除文件。

[1]http://www.sqlite.org/sqlite.html

[2]http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

[3]http://www.postgresql.org/docs/8.1/static/backup.html#BACKUP-DUMP

【讨论】:

  • 自发布此答案以来,此行为在 Django 中变得不可用。 Django 1.2 现在在运行测试框架时会忽略sql/ 目录中的sql 文件。
【解决方案2】:

您可能需要考虑定义自定义测试运行器。这里有一些信息:https://docs.djangoproject.com/en/dev/topics/testing/advanced/#other-testing-frameworks

基本上我认为你可以从 django.test.simple.run_tests 复制默认的测试运行器,然后修改它以满足你的需要。

我以前没有这样做过,但据我了解,这将是自定义它的方式。

【讨论】:

    【解决方案3】:

    固定装置是最好的选择。您是否尝试过使用 ./manage.py dumpdata 从您当前的数据库中创建一个夹具?我还没有看到复杂模型失败,但我想这是可能的。

    假设您使用的是 mysql,您应该可以使用 mysqldump 编写脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2010-11-12
      • 1970-01-01
      • 2017-10-31
      • 2020-03-04
      • 1970-01-01
      • 2019-11-03
      相关资源
      最近更新 更多