我如何 运行 Django 测试我的生产数据库的副本?
How do I run Django tests on a copy of my production database?
我已经为我的 Django 应用程序编写了一系列测试,并希望 运行 它们在我的生产数据库的副本上。
据我所知,最好的方法是使用 fixture loading,如下所示:
- 运行 manage.py dumpdata -o app.dump
- 将生成的 app.dump 文件移动到 [app name] 文件夹中的 fixtures 目录
- 在我的 django.test.TestCase subclass
上指定 'fixtures' class 属性
但是,这种方法很麻烦。我有多个应用程序,每次我想测试我的应用程序时,运行宁 manage.py 为每个应用程序转储数据并手动移动设备文件是一件很痛苦的事情。
是否有更简单的方法来自动生成我的整个生产数据库的副本并针对它测试我的 Django 应用程序?
您没有提到您使用的是哪个版本的 Django,但查看 1.11 文档:
- dumpdata can dump the data for all the apps from a particular database,而不需要单独进行。
- 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.
但尚不清楚 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 中可用的低级连接对象执行,因此可用于加载固定装置。
我已经为我的 Django 应用程序编写了一系列测试,并希望 运行 它们在我的生产数据库的副本上。
据我所知,最好的方法是使用 fixture loading,如下所示:
- 运行 manage.py dumpdata -o app.dump
- 将生成的 app.dump 文件移动到 [app name] 文件夹中的 fixtures 目录
- 在我的 django.test.TestCase subclass 上指定 'fixtures' class 属性
但是,这种方法很麻烦。我有多个应用程序,每次我想测试我的应用程序时,运行宁 manage.py 为每个应用程序转储数据并手动移动设备文件是一件很痛苦的事情。
是否有更简单的方法来自动生成我的整个生产数据库的副本并针对它测试我的 Django 应用程序?
您没有提到您使用的是哪个版本的 Django,但查看 1.11 文档:
- dumpdata can dump the data for all the apps from a particular database,而不需要单独进行。
- 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.
但尚不清楚 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 中可用的低级连接对象执行,因此可用于加载固定装置。