【问题标题】:Copy all the data from an existing database when create the test database. Django创建测试数据库时,复制现有数据库中的所有数据。姜戈
【发布时间】:2013-10-04 15:24:36
【问题描述】:

当我运行测试时,我希望它在创建测试数据库时复制包含所有数据的现有数据库。

在我的一位同事使用POSTGIS_TEMPLATE = DATABASES['default']['NAME'] 进行测试之前,我从未想过这个问题。 因为我们的项目使用GeoDjango,所以POSTGIS_TEMPLATE 的存在是为了让测试运行者知道要使用哪个postgis 数据库模板。 当他如上所述定义它时,它实际上也创建了包含所有数据的测试数据库。这对我们来说有点方便,所以我们不需要创建夹具文件。 但是如果我们不能对不使用GeoDjango的项目做同样的事情。

所以我在这里有两个问题: 使用项目数据库中已经存在的数据是个好主意吗? (对于某些测试,我可能需要先删除某个表的所有数据,但在很多情况下,我们会针对非空数据集进行测试。) 如果这不是一个坏主意,对于不使用GeoDjango的项目,我是否可以将其设置为从现有数据库中复制数据?

【问题讨论】:

    标签: python database django testing


    【解决方案1】:

    使用项目数据库中预先存在的数据是个好主意吗?

    不 - 它可能会发生变化,导致测试中出现奇怪的不确定行为。

    最安全的选择是使用./manage.py dumpdata 转储现有数据,然后将其作为固定装置加载到您的各个测试中。 This documentation 描述了如何。

    【讨论】:

    • 就像我在问题中提到的那样,我知道加载固定装置的方式。但如果我有一个复制的数据库,我不需要这样做。使用dumpdata然后加载它,这和创建一个复制相同数据的数据库一样吗?
    • 您最终会得到相同的数据,但您的数据不会因测试而异。例如,如果您使用 prod 数据库生成测试数据,并且在运行测试时您的数据库正在发生变化,或者从测试运行到测试运行的更改,则可能会导致结果不一致。
    • 不,当测试运行器启动时,它会复制数据库,所以测试数据库在运行测试时不会改变。它可能会在下一次测试运行时发生变化,除非代码中存在错误,否则我不应该得到不一致的结果,因为进行测试的全部目的是防止针对不同的数据集运行时出现不一致的结果。
    猜你喜欢
    • 2013-11-11
    • 2013-04-15
    • 1970-01-01
    • 2020-08-05
    • 2010-09-06
    • 2021-11-09
    • 1970-01-01
    • 2011-03-14
    • 2023-01-28
    相关资源
    最近更新 更多