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

knu*_*tin 9 python django django-testing

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

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

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

任何建议都是最受欢迎的.谢谢.

use*_*461 7

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
Run Code Online (Sandbox Code Playgroud)

您可以使用数据库的转储工具创建此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

  • 由于此答案已发布,因此Django中无法使用此行为.Django 1.2现在在运行测试框架时忽略`sql /`目录中的`sql`文件. (13认同)

Jef*_*eff 1

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

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

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