【问题标题】:Cannot load objects in Django test class无法在 Django 测试类中加载对象
【发布时间】:2019-04-11 10:00:25
【问题描述】:

在测试类中,我想获取给定类型的所有对象;这总是给出一个空集:

from Dictionnaire.models import Entree

class Test(TestCase):
    def setUp(self):
    ...
    Q=Entree.objects.all()
    print(Q.count())  <------always get 0.

为什么?

【问题讨论】:

  • 您需要先在数据库中创建对象:TestCase 每次运行时都会使用一个新的空数据库。

标签: django testing


【解决方案1】:

运行测试的想法是每次运行测试时都有可重现的情况。因此,TestCase 将在每次通过首先运行所有迁移进行初始化时创建一个新的空数据库。这样您就可以确保每次运行测试时,您都会遇到相同的情况。

因此,TestCase 不使用您的开发数据库,​​也不使用您的开发服务器 (runserver)。它完全在自己的“世界”中运行。

如果您想在运行测试时确保数据库中有一些数据,请覆盖类方法setUpTestData(),这比为setUp() 中的每个测试执行此操作要快。

【讨论】:

  • 我的问题是我想对我真实数据库中的对象进行测试;我有一个集合(主菜是脚本),对于每个对象,我计算一个 URL,我想测试这个 URL 是否正常,是否可以实现。看来我不能直接在 Django 的测试框架中这样做?
  • 你不能通过在测试开始时加载带有所需数据的夹具来测试它吗?您可以从您的真实数据库中dumpdata 并将其用作固定装置。
  • 如果您想针对远程服务器进行测试(例如,如果您有一个预生产服务器要测试),请使用不同的框架,例如硒。不要在你的生产环境上运行任何测试,那真的很危险!
  • 是的,Selenium 看起来很有趣。谢谢!
【解决方案2】:

您可以将您的数据库转储到一个夹具中,然后从您的测试数据库中加载它:

fixture 是 Django 知道如何导入的数据集合 一个数据库。创建夹具的最直接方法如果 你已经有一些数据是使用manage.py dumpdata 命令

Fixtures 可以写成 JSON、XML 或 YAML(安装了 PyYAML) 文件。

加载数据很简单:只需调用manage.py loaddata &lt;fixturename&gt;, 您创建的夹具文件的名称在哪里

然后从SetUp()test.py

from django.core.management import call_command
call_command("loaddata", "' + 'fixturefile.json' + '",
verbosity=0)

但是,为了使您的测试数据库与生产数据库保持同步(我不建议这样做),您必须设置一个 cron 作业或其他东西。

来源:

https://stackoverflow.com/a/48737566/5094841

https://django-testing-docs.readthedocs.io/en/latest/fixtures.html

【讨论】:

  • 如果你喜欢它,你可以投票并批准作为答案:)
猜你喜欢
  • 2011-03-10
  • 2013-10-24
  • 2013-11-20
  • 2023-03-09
  • 2020-01-22
  • 1970-01-01
  • 2018-01-01
  • 2011-10-18
  • 1970-01-01
相关资源
最近更新 更多