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

Posted

技术标签:

【中文标题】如何在我的生产数据库副本上运行 Django 测试?【英文标题】:How do I run Django tests on a copy of my production database? 【发布时间】:2017-10-04 12:33:54 【问题描述】:

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

据我所知,最好的方法是像这样使用fixture loading:

运行 manage.py dumpdata -o app.dump 将生成的 app.dump 文件移动到 [app name] 文件夹中的 fixtures 目录中 在我的 django.test.TestCase 子类上指定一个“fixtures”类属性

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

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

【问题讨论】:

这仅适用于小型网站。如果有几 GB 的数据,您认为设置测试需要多长时间 我知道!幸运的是,我的网站很小。 【参考方案1】:

通常,不鼓励对实时数据库或实时数据库副本进行测试。为什么?因为测试需要是可预测的。当您制作实时数据库的副本时,输入变得不可预测。第二个问题是你不能明显地在现场测试,所以你需要克隆数据。对于大小超过几 MB 的东西来说,这很慢。

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

进行克隆的唯一现实方法是使用内置导出/导入机制的数据库引擎。在 sqlite 的情况下,它只是复制 db 文件。对于 mysql,它是 SELECT INTO OUTFILE,然后是 LOAD DATA INFILE。对于 postgresql,它是 COPY TO 后跟 COPY FROM 等等。

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

【讨论】:

感谢您的回复,e4c5。基本上我听到的是我应该找到另一种方法来做我想做的事情。如果您有想法,我已将问题作为一个单独的问题在这里发布:***.com/questions/43876310/…【参考方案2】:

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

dumpdata can dump the data for all the apps from a particular database,而不需要单独做。 loaddata can load data for multiple apps,除了在单个应用程序目录中查找 fixtures 子目录外,还可以查找 in directories defined in FIXTURE_DIRS。

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

【讨论】:

以上是关于如何在我的生产数据库副本上运行 Django 测试?的主要内容,如果未能解决你的问题,请参考以下文章

创建用于测试的生产数据库副本

媒体文件上的 404 - Django

Django 测试数据库未与自定义测试运行程序一起使用

如何使副本在 nvidia 显卡而不是英特尔集成显卡上运行

如何让这个 CI php 应用程序在我的本地机器上运行

django south 在多个数据库上