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

时间:2017-05-05 23:05:11

标签: django testing automated-tests fixtures testcase

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

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

  • 运行manage.py dumpdata -o app.dump
  • 将生成的app.dump文件移动到[app name]文件夹中的fixtures目录
  • 指定'灯具'我的django.test.TestCase子类
  • 上的class属性

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

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

2 个答案:

答案 0 :(得分:4)

通常,不鼓励对实时数据库或实时数据库的副本进行测试。为什么?因为测试需要是可预测的。当您复制实时数据库时,输入变得不可预测。第二个问题是你无法在现场测试,因此你需要克隆数据。对于任何超过几MB的东西来说,这都很慢。

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

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

所有这些导出/导入命令都可以使用django中提供的低级连接对象来执行,因此可用于加载灯具。

答案 1 :(得分:0)

您没有提到您正在使用的Django版本,但查看了1.11文档:

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

相关问题