我如何 运行 Django 测试我的生产数据库的副本?

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

我已经为我的 Django 应用程序编写了一系列测试,并希望 运行 它们在我的生产数据库的副本上。

据我所知,最好的方法是使用 fixture loading,如下所示:

但是,这种方法很麻烦。我有多个应用程序,每次我想测试我的应用程序时,运行宁 manage.py 为每个应用程序转储数据并手动移动设备文件是一件很痛苦的事情。

是否有更简单的方法来自动生成我的整个生产数据库的副本并针对它测试我的 Django 应用程序?

您没有提到您使用的是哪个版本的 Django,但查看 1.11 文档:

但尚不清楚 from the 1.11 docs about fixture loading for tests 他们是否也会查看 FIXTURE_DIRS。所以这可能无法完全解决您的问题。

通常,不鼓励针对实时数据库或实时数据库的副本进行测试。为什么?因为测试需要是可预测的。当您制作实时数据库的副本时,输入变得不可预测。第二个问题是在live site上明显不能测试,所以需要clone数据。对于大小超过几 MB 的任何东西,这都很慢。

即使数据库很小,dumpdata 后跟 loaddata 也不是办法。这是因为默认情况下 dumpdata 以 JSON 格式导出,生成开销很大,更不用说使数据文件非常庞大。使用 loaddata 导入甚至更慢。

制作克隆的唯一现实方法是使用内置在 export/import 机制中的数据库引擎。在 sqlite 的情况下,它只是复制 db 文件。对于 mysql,它是 SELECT INTO OUTFILE,然后是 LOAD DATA INFILE。对于 postgresql,它是 COPY TO,然后是 COPY FROM,依此类推。

所有这些 export/import 命令都可以使用 django 中可用的低级连接对象执行,因此可用于加载固定装置。