在运行Django测试之前加载SQL转储

时间:2009-12-30 11:27:59

标签: python django django-testing

我有一个相当复杂的Django项目,这使得很难/不可能使用灯具来加载数据。

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

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

任何建议都会受到欢迎。感谢。

3 个答案:

答案 0 :(得分:8)

Django支持在执行syncdb,重置或启动测试运行器时加载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]:echo'.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的表,以避免在加载重复的create语句时出错。

我使用这种方法加载真正的,非常大的装置 - 处理json需要太长时间,但直接的sql导入非常活泼。

请注意,除了为测试运行器加载数据之外,此方法还会为syncdb,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

答案 1 :(得分:1)

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

基本上我认为您可以从django.test.simple.run_tests复制默认测试运行器,然后根据您的需要进行修改。

我之前没有这样做过,但是根据我的理解,这将是定制它的方法。

答案 2 :(得分:-1)

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

假设您正在使用mysql,您应该能够使用mysqldump来编写脚本。