How do I run Django tests on a copy of my production database?

风流意气都作罢 提交于 2019-12-05 16:37:38

问题


I've written a series of tests for my Django app, and would like to run them on a copy of my production database.

As far as I can tell, the best way to do this is using fixture loading like so:

  • Run manage.py dumpdata -o app.dump
  • Move the resulting app.dump file to a fixtures directory in the [app name] folder
  • Specify a 'fixtures' class attribute on my django.test.TestCase subclass

However, this approach is cumbersome. I have multiple apps, and running manage.py dumpdata for each of them and manually moving around fixtures files every time I want to test my app is a pain.

Is there an easier way to automatically generate a copy of my entire production database and test my Django apps against it?


回答1:


Generally, testing against the live DB or a copy of the live DB is discouraged. Why? Because tests need to be predictable. When you make a copy of the live db, the input becomes unpredictable. The second problem is that you cannot obviously test on the live site, so you need to clone the data. That's slow for anything more than few MB in size.

Even if the DB is small, dumpdata followed by loaddata isn't the way. That's because dumpdata by default exports in a JSON format which has a large generating overhead, not to mention making the data file very bulky. Importing using loaddata is even slower.

The only realistic way to make a clone is using the database engines built in export/import mechanism. In the case of sqlite that's just copying the db file. For mysql it's SELECT INTO OUTFILE followed by LOAD DATA INFILE. And for postgresql it's COPY TO followed by COPY FROM and so on.

All of these export/import commands can be executed using the lowlevel connection object available in django and thus can be used to load fixtures.




回答2:


You didn't mention which version of Django you're using, but looking at the 1.11 documentation:

  • dumpdata can dump the data for all the apps from a particular database, rather than needing to do them individually.
  • loaddata can load data for multiple apps, and as well as looking in individual app directories for fixtures subdirectories, it can also look in directories defined in FIXTURE_DIRS.

It's not clear from the 1.11 docs about fixture loading for tests whether they would also look in FIXTURE_DIRS, though. So this might not solve your problem entirely.



来源:https://stackoverflow.com/questions/43814907/how-do-i-run-django-tests-on-a-copy-of-my-production-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!